数字分布没有可重复的数字

时间:2014-04-04 12:42:49

标签: math combinations

我们遇到一个问题,我们需要订购/分发给定的套餐,以使这些数字不可重复

这是一个例子,说我有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

2 个答案:

答案 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是脚本的一些(美化)输出。