Algorithm 如何重新排列不同种类的物品,使同类物品之间的距离最大?
可能重复:Algorithm 如何重新排列不同种类的物品,使同类物品之间的距离最大?,algorithm,optimization,Algorithm,Optimization,可能重复: 我朋友的项目中有一个有趣的问题。他从事电视广告投放工作。广告有不同的种类:手机广告、食品广告、银行广告等。他需要重新排列广告列表,使类似种类的广告彼此之间的距离最大。一个广告块中大约有100个广告,所以暴力解决方案是不可行的。 有没有可能想出一个合理快速的解决方案(假设您希望最大化最小距离。首先,计算您拥有的每种类型的物品的数量(所有这些物品的总和应该是列表中的物品数量,n)。根据项目的频率对唯一类型的项目列表进行排序。然后,准备一个带有n单元格的输出磁带。从最频繁的元素开始,以固
我朋友的项目中有一个有趣的问题。他从事电视广告投放工作。广告有不同的种类:手机广告、食品广告、银行广告等。他需要重新排列广告列表,使类似种类的广告彼此之间的距离最大。一个广告块中大约有100个广告,所以暴力解决方案是不可行的。
有没有可能想出一个合理快速的解决方案(假设您希望最大化最小距离。首先,计算您拥有的每种类型的物品的数量(所有这些物品的总和应该是列表中的物品数量,
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,F,,M,F,]在第二次通过后得到[M,F,B,M,F,B]
请注意,这是一种启发式方法,我怀疑它可能是最优的,但我没有尝试证明这是最优的,甚至对我自己也没有。但是,如果你有n
元素,并且最频繁的元素出现次数x
次,那么最短距离可能是地板(n/x)
(编辑:事实并非如此,请看我的评论)…这就是这个启发式的目的。我想,有一个问题是如何“均匀”地分配项目如果数字不是偶数……但即使是我尝试的例子,只要出现这种情况,几乎任何选择都是可以的。我们优化的标准是w.r.t。一个稍微难一点的例子:
[A,A,A,A,A,B,B,C,D]给我们(A,5),(B,3),(C,2),(D,1);我们在第一次通过后得到[A,,A,,A,,A,,A,,A,,A,,A,A,B,,A,B,[A,B,C,A,A,A,B],第三次通过后得到[A,A,A,A,A,A,A,A,A,A,A,A,A,A,B],我们最终得到了[A,B,A,A,A,A,A,A,A,A,B],政府工作足够好了
事实上,在最小化平均距离方面,我想不出比这更简单的方法了。这应该足够快……距离是否足够满足朋友的需要?假设您希望最大化最小距离。首先,计算您拥有的每种物品的数量(所有这些的总和应为列表中的项数,
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,F,,M,F,]在第二次通过后得到[M,F,B,M,F,B]
请注意,这是一种启发式方法,我怀疑它可能是最优的,但我没有尝试证明这是最优的,甚至对我自己也没有。但是,如果你有n
元素,并且最频繁的元素出现次数x
次,那么最短距离可能是地板(n/x)
(编辑:事实并非如此,请看我的评论)…这就是这个启发式的目的。我想,有一个问题是如何“均匀”地分配项目如果数字不是偶数……但即使是我尝试的例子,只要出现这种情况,几乎任何选择都是可以的。我们优化的标准是w.r.t。一个稍微难一点的例子:
[A,A,A,A,A,B,B,C,D]给我们(A,5),(B,3),(C,2),(D,1);我们在第一次通过后得到[A,,A,,A,,A,,A,,A,,A,,A,A,B,,A,B,[A,B,C,A,A,A,B],第三次通过后得到[A,A,A,A,A,A,A,A,A,A,A,A,A,A,B],我们最终得到了[A,B,A,A,A,A,A,A,A,A,B],政府工作足够好了
事实上,在最小化平均距离方面,我想不出比这更简单的方法了。这应该足够快……它是否足够接近你朋友的需要?你能更好地描述这个问题吗?每个广告有多少维度?距离是如何定义的?你能给出一个简单的输入+输出测试用例吗?你检查了吗?我们需要d某种类型的公式,为了估计排列广告的“坏到什么程度”/“好到什么程度”,您是否有一个特定于您的问题?不确定广告的“维度”。输入只是不同类型广告的列表,我们可以假设每个广告的长度相同。例如:[M,M,F,B,F,B]。在这种特定情况下,输出可能是:[M,F,B,M,F,B]。我想一个好的优化函数应该是相同类型的广告之间的最小距离。这个距离应该是可能的最大距离。你可以吗