Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何重新排列不同种类的物品,使同类物品之间的距离最大?_Algorithm_Optimization - Fatal编程技术网

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]。我想一个好的优化函数应该是相同类型的广告之间的最小距离。这个距离应该是可能的最大距离。你可以吗