【发布时间】:2009-09-04 16:04:41
【问题描述】:
我需要一个算法,它给出一个列表L 和一个数字N,返回一个N 较小列表的列表,其中子列表是“平衡的”。例子:
algo(range(1, 8), 3) -> [[1,2,3], [4,5], [6,7]]
algo(range(1, 6), 4) -> [[1,2], [3], [4], [5]]
algo(range(1, 12), 5) -> [[1,2,3], [4,5], [6,7], [8,9], [10, 11]]
如您所见,算法应该“优先”输出中的第一个列表。
我已经尝试了好几个小时,但我无法为它找到一个简洁明了的算法。顺便说一句,这将在 Python 中实现,但这确实是我在这里所追求的算法。这是不是的作业,这是一个将在三列列表中显示内容的网站(Django)。
我从freenode上的#python得到了最好的答案,如下:
def split_up(l, n):
q, r = divmod(len(l), n)
def division_point(i):
return i * q + min(i, r)
return [l[division_point(i):division_point(i+1)] for i in range(n)]
不要问我为什么它有效。 :) 不过,我会给得票最多的那个答案。
【问题讨论】:
-
如果我的想法正确,您必须事先进行排序。 lst.sort() 有什么问题,然后线性遍历它以挑选元素?无论如何它是 O([the sort func])。
-
@Corey D:这个问题略有不同
-
@voyager:在 Python 中使该算法适应这个问题是一个简单的练习。
-
平衡是什么意思?如果您试图最小化任何子列表的最大总和,那么有一个应用程序----我的意思是,一个解决方案。如果是这种情况,会挖掘它。