如何平衡多列中的项目数

时间:2010-09-22 15:46:12

标签: algorithm language-agnostic

我需要找出一种方法来确定多列列表中每列应显示的项目数,以实现最直观的平衡。这是我的标准:

  1. 如果项目数大于10,则只应将列表拆分为多个列。
    • 如果需要多列,则它们应包含不少于5个(余数除外的最后一列除外)且不超过10个项目。
  2. 如果所有列都不能包含相同数量的项目
    • 除了最后一列之外的所有列都应该相同。
    • 应优化每列中的项目数,以实现最后一列与其他列之间的最小差异。
  3. Image showing two visual scenarios and suggested format

4 个答案:

答案 0 :(得分:4)

嗯,你的要求和你的例子看起来有点矛盾。例如,您的第二个示例可以分为两列,每列包含11个项目,并满足您的条件。让我们假设对于规则#2,你的意思是应该有< = 10个项目/列。

此外,我认为您需要添加另一条规则以使要求合理:

The number of columns must not be greater than what is required to accomodate overflow.

否则,您通常会得到退化解决方案,其中您的列数远远超出您的需求。例如,在26个项目的情况下,您可能不希望13列,每列2个项目。

如果是这种情况,这是一个简单的计算,它应该运作良好且易于理解:

int numberOfColumns = CEILING(numberOfItems / 10);
int numberOfItemsPerColumn = CEILING(numberOfItems / numberOfColumns);

现在你将创​​建N-1列项目(每个都有`numberOfItemsPerColumn),溢出将进入最后一列。根据这个定义,溢出应该在最后一列中最小化。

答案 1 :(得分:1)

如果您想自动确定适当的列数,并且对其限制没有限制,我建议如下:

  • 计算项目总数的平方根。那将是一个平方的布局。
  • 将该数字除以1.618,并将其分配给总行数。
  • 将相同的数字乘以1.618,并将其分配给总列数。
  • 除最右边的所有列都具有相同数量的项目。

顺便说一下,常数1.618是Golden Ratio。这将实现比平方更舒适的布局。 对于垂直显示,将另一种方式除以并相乘。 希望这个算法可以帮助任何有类似问题的人。

答案 2 :(得分:0)

以下是您要解决的问题:

最小化y-z,其中n = xy + z且5 <= y <= 10且0 <= z <= y

你有n个项目分为x个项目的x个完整列和z项目的一个剩余列。

几乎可以肯定这是一种聪明的方法,但是考虑到这些限制因素,探索y和z的所有6 + 7 + 8 + 9 + 10 = 40种可能组合的蛮力实施将毫不费力(仅限作业)其中(n - z)mod y = 0是解决方案)。

答案 3 :(得分:0)

考虑到每列项目数量的限制,我认为蛮力解决方案很简单:让v为每列的项目数(除了最后一列),然后v属于到[5,10],因此可以获得6个不同的值。

评估6个值很容易。 Python单行(或不是到目前为止)来证明它:

# compute the difference between the number of items for the normal columns
# and for the last column, lesser is better
def helper(n,v):
  modulo = n % v
  if modulo == 0: return 0
  else: return v - modulo

# values can only be in [5,10]
# we compute the difference with the last column for each
# build a list of tuples (difference, - number of items)
# (because the greater the value the better, it means less columns)
# extract the min automatically (in case of equality, less is privileged)
# and then pick the number of items from the tuple and re-inverse it
def compute(n): return - min([(helper(n,v), -v) for v in [5,6,7,8,9,10]])[1]

对于77,这产生:7意味着每列7个项目 对于22,这得到:8意味着每列8个项目