我们遇到一个问题,我们需要订购/分发给定的套餐,以使这些数字不可重复
这是一个例子,说我有4套
{A,A,A,A,A,A}
{B,B}
{C}
{D,D,D}
结果应该类似于A,D,A,B,A,D,C,A,D,A,B,A
没有可重复的事情。
任何想法,算法......都应该感激。
编辑:抱歉不清楚,发生我的意思是像AA或BB或CC这样的模式不应该 在结果中可以有ADAD由于 DEE
答案 0 :(得分:2)
片刻的考虑产生了这个算法:
让A成为重复次数最多的符号
设N为出现次数A.
让Rest成为剩余符号的串联顺序
让Buckets成为长度为N的列表,其中每个元素Buckets [i]是一个包含单个A的数组。
迭代Buckets:对于每个索引i,从Rest中弹出一个元素并将其附加到Buckets [i]。当你到达Buckets的末尾时,再次从第一个索引开始。当你到达休息结束时,你就完成了。
答案是Buckets内容的连接。
你的例子:
设A ='A' 设N = 6 让休息= [B,B,C,D,D,D] 让Buckets = [[A],[A],[A],[A],[A],[A]]。
迭代后,Buckets为[[A,B],[A,B],[A,C],[A,D],[A,D],[A,D]]。输出是ABABACADADAD。
答案 1 :(得分:0)
总是选择剩余数量最多的水桶。
我生锈的Matlab技能做到了这一点:
symbols = ceil(rand()* 10)+1 maxn = ceil(rand()* 20) distribution = [floor(rand(1,symbols)* maxn);(1:symbols)]'
last = -1;
sequence=[]; #output vector
while sum(distribution(:,1))>0 ; #while something is left
distribution= sortrows(distribution); #sort the matrix
if last == distribution(end,2) #pick the one with the one with the second most elements
if a(end-1,1) ==0 #this means there are no fillers left
break
end
last = distribution(end-1,2);
distribution(end-1,1)--;
else #pick the one with the most elements
last = distribution(end,2);
distribution(end,1) --;
endif
sequence(end+1)=last;
end
sequence
rest = distribution'
注意:我的符号是数字而不是字母。
编辑:Here是脚本的一些(美化)输出。