Math 无重复数的数分布
我们遇到了一个问题,我们需要对给定的集合进行排序/分发,以使这些数字不可重复 这里有一个例子,假设我有4套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的出现次数。
{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'