填充槽的算法

时间:2010-05-26 09:56:39

标签: sql algorithm language-agnostic math

我正在搜索一个算法来填充几个已填充到某个级别的插槽。

  • 当前级别和可用的填充数量已知
  • 结果级别应尽可能相等,但现有级别不能降低
  • 从左到右填充插槽,因此如果不可能存在相同级别,则左侧插槽将变为更高级别

Examples http://img695.imageshack.us/img695/6529/fill.png

上图显示了六个示例,每列代表一个插槽。灰色区域已经填充,蓝色区域是新元素的预期位置。


我可以遍历我的广告位并将最低广告位上的数量增加1,直到消耗了可用数量,但我想知道如何实际计算新的填充水平。

我将使用SQL / PL/SQL实现此功能,但其他代码同样受欢迎:)

4 个答案:

答案 0 :(得分:2)

这非常简单。

除了某些情况*之外,你可以把它想象成浇水并让它填满。

  1. 排序。您也可以使用优先级队列。
  2. 跟踪当前最小列的数量。
  3. 使用第二个min列获取min列。
  4. 使用可用项目数填充min列,或者填充第二个min列。
  5. 增加当前最小列的数量。
  6. 转到步骤4,直到所有列都处于同一级别,但使用可用项目数或delta(第二分钟 - 第一分钟)乘以当前最小列数。如果可用项目的数量不够,只需进行简单的数学运算(除法和余数)来填充列,然后使用余数从左边填充。
  7. 当所有列位于同一级别时,请使用步骤6中描述的简单数学部分。
  8. 你应该好。

    此算法在O( n log n )时间内运行。

    *有些情况下这没有意义,但无论如何你仍然想要这样做:

     #
     #
    ##
    ###
    ###
    

    在这种情况下,你会填充第三列,然后填充第一列,然后是第二列,但当然它不会充满水。

答案 1 :(得分:1)

也许一个贪婪的算法随机化来打破关系就足够了。

设n为您需要填充的插槽数。

步骤1:遍历列以标识具有最少填充槽的列。略过已填满的列。

步骤2:如果步骤1中没有识别出任何列大于1,则随机选择一个。

步骤3:设置n = n-1

重复步骤1,2和3,直到n = 0,否则您没有任何空列。

答案 2 :(得分:0)

  1. 将列从最低到最高的起始级别排序。
  2. 计算(已排序)列的累计起始用途。
  3. 通过填充该列的高度来计算每列将使用多少新填充。使用的金额将是列的高度乘以列索引,减去之前所有列的累计起始使用量。
  4. 选择索引为i的列,该列将使用您新填充的大部分而不会过去。将列i的所有列填充到列i的高度(将使用步骤#3中针对列i计算的填充量),然后剩余填充均匀地在前i列上floor(remaining / i)再加上一列填写第一个remaining % i列。
  5. 撤消各种列以获得结果。
  6. 这应该花费时间线性的列数(与填充量无关)。

答案 3 :(得分:-1)

听起来像经典Knapsack problemRosetta Code使用不同的算法有很多不同的语言解决方案虽然我不确定PL / SQL中有什么东西