将列表分成相等的部分?

Posted

技术标签:

【中文标题】将列表分成相等的部分?【英文标题】:Split a list into equal parts? 【发布时间】:2019-10-23 19:31:16 【问题描述】:

我有一个size 元素数组,我有一个函数可以将它分成大致相等的部分。它通过使用size/num_of_sections 设置第一个size-1 部分的大小,并使用剩下的任何内容设置最后一个部分的大小来做到这一点。代码很简单,工作正常,看起来像这样:

int section_size = size / num_of_sections;
int last_section_size = size - ( section_size * (num_of_sections - 1) );

唯一的问题是sizenum_of_sections 的某些组合不能很好地拆分。例如,如果size = 10num_of_sections = 6,那么前四个部分将各有 1 个元素,最后一个部分将是 6 个元素。

如何将其更改为更均匀地拆分它的算法,具体来说,以便所有部分的大小为XX+1?在上面的示例中,前四个部分的大小为 2,然后后两个部分各为 1。显然需要生成第三个变量来指示节号,其中包括它在内的所有先前节的大小为X,以下所有节的大小为X+1

【问题讨论】:

en.wikipedia.org/wiki/Bresenham%27s_line_algorithm 也许可以试试section[0] = size/n; section[1] = (size - section[0])/(n-1); section[2] = (size-section[0]-section[1])/(n-2); ... (两个 cmets 将产生相同的结果,但除非您需要它非常快 - 这是线条绘制算法的想法 -,@pmg's 更容易理解) 【参考方案1】:

通常的方法是,当您可以将所有较大的部分分组时,

const int total=/*…*/,pieces=/*…*/;
const int base=total/pieces,extra=total%pieces;

那么第一个extra(可能是0)块的大小为base+1,其他的(pieces-extra)块的大小为base

【讨论】:

以上是关于将列表分成相等的部分?的主要内容,如果未能解决你的问题,请参考以下文章

将路径分成相等的部分

如何将一个巨大的列表分成相等的块并将条件应用于这些块?

将列表拆分为长度大致相等的 N 部分

将数组分成和相等的三个部分(LeetCode 1013)

将屏幕分成 4 个相等的部分 - android

将数组分成和相等的三个部分