N非重叠最佳分区

时间:2015-10-16 20:24:55

标签: algorithm grouping

这是我几天前遇到的一个问题。 给定一个整数项列表,我们希望将项目分区为最多N个非重叠连续的分箱,以最小化任何分箱中的最大项目数。 例如,假设我们得到了项目(5,2,3,6,1,6),我们想要3个箱子。我们可以按如下方式对这些进行最佳分区:

  • n< 3 :1,2(2项)
  • 3< = n< 6 :3,5(2项)
  • 6< = n :6,6(2项)

每个垃圾箱都有2个项目,所以我们不能做得更好。 有人可以分享你对这个问题的看法吗?

2 个答案:

答案 0 :(得分:0)

给定n个分区和一个包含p项的数组,这里有一个你可以使用的贪心算法。

最大限度地减少广告素材中的最大商品数量:

  • p <= n 尝试使用p垃圾箱。

    只需尝试将每个项目放入其自己的垃圾箱。如果您有重复的数字,那么您的平均值将不可避免地更糟。

  • p > n 贪婪地使用所有垃圾箱,但要尽量让每个人都在floor(p / n)附近。

    1. 分组重复数字
    2. 使用左侧和右侧的唯一数字(如果存在)填充不足floor(p / n)的最大重复区间。
    3. 计算您拥有的垃圾箱数量并确定您需要进行的合并次数,让我们称之为r

      重复以下r次:

      • 检查每个可能的相邻bin配对;找到并执行最小合并

示例

  • {1,5,6,9,8,8,6,2,5,4,7,5,2,4,5,3,2,8,7,5} 20件物品到4箱
  • {1}{2, 2, 2}{3}{4, 4}{5, 5, 5, 5, 5}{6, 6}{7, 7}{8, 8, 8}{9} 1.排序和分组
  • {1, 2, 2, 2, 3}{4, 4}{5, 5, 5, 5, 5}{6, 6}{7, 7}{8, 8, 8, 9} 2.最大群体的贪婪捕获
  • {1, 2, 2, 2, 3}{4, 4}{5, 5, 5, 5, 5}{6, 6}{7, 7}{8, 8, 8, 9} 3. 6个垃圾箱,但我们想要4个,所以需要进行2个合并。
    • {1, 2, 2, 2, 3}{4, 4}{5, 5, 5, 5, 5}{6, 6, 7, 7}{8, 8, 8, 9} 3.首次合并
    • {1, 2, 2, 2, 3, 4, 4}{5, 5, 5, 5, 5}{6, 6, 7, 7}{8, 8, 8, 9} 3.第二次合并

因此,可实现的最小最大值为7.

答案 1 :(得分:0)

以下是一些psudocode,它只为您提供一个具有最小容器数量的解决方案:

Sort the list of "Elements" with Element as a pair {Value, Quanity}.

So for example {5,2,3,6,1,6} becomes an ordered set:
Let S = {{1,1},{2,1},{3,1},{5,1},{6,2}}

Let A = the largest quanity of any particular value in the set
Let X = Items in List
Let N = Number of bins
Let MinNum = ceiling ( X / N )
if A > MinNum then Let MinNum = A

Create an array BIN(1 to N+1) of pointers to linked lists of elements.

For I from 1 to N
  Remove as many elements from the front of S that are less than MinNum
  and Add them to Bin(I)
Next I
Let Bin(I+1)=any remaining in S

LOOP while Bin(I+1) not empty
  Let MinNum = MinNum + 1
  For I from 1 to N
    Remove as many elements from the front of Bin(I+1) so that Bin(I) is less than MinNum
    and Add them to Bin(I)
  Next I
END LOOP

您的最小广告代码尺寸为MinNumBIN(1)Bin(N)将包含值的分配。