我正在搜索一个算法来填充几个已填充到某个级别的插槽。
Examples http://img695.imageshack.us/img695/6529/fill.png
上图显示了六个示例,每列代表一个插槽。灰色区域已经填充,蓝色区域是新元素的预期位置。
我可以遍历我的广告位并将最低广告位上的数量增加1
,直到消耗了可用数量,但我想知道如何实际计算新的填充水平。
我将使用SQL
/ PL/SQL
实现此功能,但其他代码同样受欢迎:)
答案 0 :(得分:2)
这非常简单。
除了某些情况*之外,你可以把它想象成浇水并让它填满。
你应该好。
此算法在O( n log n )
时间内运行。
*有些情况下这没有意义,但无论如何你仍然想要这样做:
#
#
##
###
###
在这种情况下,你会填充第三列,然后填充第一列,然后是第二列,但当然它不会充满水。
答案 1 :(得分:1)
也许一个贪婪的算法随机化来打破关系就足够了。
设n为您需要填充的插槽数。
步骤1:遍历列以标识具有最少填充槽的列。略过已填满的列。
步骤2:如果步骤1中没有识别出任何列大于1,则随机选择一个。
步骤3:设置n = n-1
重复步骤1,2和3,直到n = 0,否则您没有任何空列。
答案 2 :(得分:0)
floor(remaining / i)
再加上一列填写第一个remaining % i
列。这应该花费时间线性的列数(与填充量无关)。
答案 3 :(得分:-1)
听起来像经典Knapsack problem 在Rosetta Code使用不同的算法有很多不同的语言解决方案虽然我不确定PL / SQL中有什么东西