我朋友的项目有一个有趣的问题。他从事电视广告投放。广告有不同的类型:手机,食品,银行等。他需要重新排列广告列表,以便将类似广告放置在彼此之间的最大距离。广告块中有大约100个广告,因此强力解决方案不可行。 是否有可能提出一个合理快速的解决方案(<30秒)?什么是最快的方法?
假设每个广告的长度相同。
实施例:
[M, M, F, B, F, B]
。在此特定方案中,输出可以是:[M, F, B, M, F, B]
答案 0 :(得分:1)
假设您想要最大化最小距离。首先,计算您拥有的每种类型项目的数量(所有这些项目的总和应该是列表中的项目数n
)。根据频率对特殊项目列表进行排序。然后,准备一个带n
个单元格的输出磁带。从最常见的元素开始,以规则的间隔将元素均匀地放置在输出磁带中。按照项目频率的降序继续,仅考虑磁带上的空单元格。这是O(n + m log m)
,其中n
是项目总数,m
是唯一项目的数量(即项目种类)。请注意,在这种情况下,您可能会对项目类型使用线性排序算法,因此您可能会丢失log m
因素,尽管在实践中(对于100个项目,并且可能少于项目)我不知道是否值得。
在你的例子中:[M,M,F,B,F,B]。我们有(M,2),(F,2),(B,2)。第一遍后得到[M,_,_,M,_,_],第二遍后得到[M,F,_,M,F,_],[M,F,B,M,F,B]在第三次之后。
请注意,这是一种启发式方法,我怀疑它可能是最佳的,但我没有尝试证明这是最佳的,甚至对我自己也是如此。但是,如果您有n
个元素且最常见的元素显示为x
次,则最小距离可能最大为floor(n/x)
(编辑:这实际上不是真的,请参阅我的评论)......这就是这种启发式拍摄的方式。我想,如果数字甚至不是除数,那么如何在“均匀”空间项目中存在一个问题...但即使是我尝试发生这种情况的例子,几乎任何选择都可以w.r.t.我们正在优化的标准。一个稍微更难的例子:
[A,A,A,A,A,B,B,B,C,C,D]给出了我们(A,5),(B,3),(C,2),(D,1) );我们在第一次传递后获得[A,_,A,_,A,_,A,_,A,_,_],[A,B,A,_,A,B,A,_,A,B ,_]在第二次通过后,[A,B,A,C,A,B,A,C,A,B,_]在第三次通过后,我们最终得到[A,B,A,C,A ,B,A,C,A,B,D]。足以胜任政府工作。
事实上,我想不出一个比这更好的方法来最小化平均距离。这应该足够快......它是否足够接近你朋友的需求?