Math 无重复数的数分布

Math 无重复数的数分布,math,combinations,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经过片刻的考虑,得出了以下算法: 让A作为重复次数最多的符号。 设N为A的出现次数。

我们遇到了一个问题,我们需要对给定的集合进行排序/分发,以使这些数字不可重复

这里有一个例子,假设我有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

经过片刻的考虑,得出了以下算法:

让A作为重复次数最多的符号。
设N为A的出现次数。
让Rest按顺序连接其余符号。
假设bucket是长度为N的列表,其中每个元素bucket[i]是包含单个a的数组

遍历bucket:对于每个索引i,从Rest中弹出一个元素,并将其附加到bucket[i]。当到达桶的末尾时,再次从第一个索引开始。当你达到休息的终点时,你就完成了

答案是存储桶内容的串联

你的例子是:

设A='A'。
设N=6。
让Rest=[B,B,C,D,D,D]。
让bucket=[[A]、[A]、[A]、[A]、[A]、[A]]


迭代之后,bucket是[[A,B],[A,B],[A,C],[A,D],[A,D],[A,D]]。输出为ababacadad。

始终拾取剩余量最大的桶

我生锈的Matlab技能做到了这一点:

生成随机分布: 符号=ceil(rand()*10)+1 maxn=ceil(兰德()*20) 分布=[floor(rand(1,符号)*maxn);(1:符号)]”

注意:我的符号是数字而不是字母


编辑:是脚本的一些(美化的)输出。

当你说“不可重复发生”时,你的意思是不能有两个相同的连续发生吗?这就是我的理解@迪伊:对于给定的一组集合,可能没有解决方案。然后呢?@SebastianH这就是我认为他们的意思,但我认为他们用来描述它的词语和他们给出的例子不一致。。。在本例中,事件“AD”重复出现,事件“AB”也重复出现,“DA”和“BA”以及真正的“ADABA”。。。。但它们永远不会重复(顺序?)。。。我的意思是他们不去“ADAD”,甚至“ADABA”也被“DC”从它的另一个事件中分离出来。。。所以我想我真正想要的是更多的例子(特别是一些错误模式的例子会更好),如果rest没有到达桶的末尾会发生什么?(例如Rest=[B,B,C,D])?我认为,在这种情况下,它没有一个解决方案……确切地说。如果N>size(Rest)+1,则没有解决方案。你可以很容易地检查这个。如果有解决方案,此算法将找到一个。
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'