Algorithm 一组字符的均匀分布

Algorithm 一组字符的均匀分布,algorithm,Algorithm,数组中需要均匀分布一组字符。 比如说, a-1 b-2 c-3 d-4 在本例中,有一个a、两个b、三个c和四个d,共10个字符 现在我需要将其分布在一个大小为10的数组中,以便所有这些数组都均匀分布。它们不必完全均匀分布,任何接近的都可以 例如,这是一个有效的序列 d c d b d a d c b首先,试着猜测每个字母实例的位置,一次只考虑一个字母。如果总共有10个和3个,尝试将As放在索引0、3和7处。计算每个字母的这些估计索引,并将它们放入有序的多重集合中 std::multimap&l

数组中需要均匀分布一组字符。 比如说,

a-1

b-2

c-3

d-4

在本例中,有一个a、两个b、三个c和四个d,共10个字符

现在我需要将其分布在一个大小为10的数组中,以便所有这些数组都均匀分布。它们不必完全均匀分布,任何接近的都可以

例如,这是一个有效的序列


d c d b d a d c b

首先,试着猜测每个字母实例的位置,一次只考虑一个字母。如果总共有10个和3个,尝试将As放在索引0、3和7处。计算每个字母的这些估计索引,并将它们放入有序的多重集合中

std::multimap<unsigned,char> set;
const unsigned totalcount = ... //for your example this would be 10
for (const auto& letterpair : letters) {
    unsigned lettercount = letterpair.second; //for c this would be 3
    for(unsigned i=0; i<lettercount; ++i) {
        unsigned targetIdx = (2*i*totalcount+1)/lettercount;
        set.insert(std::make_pair(targetIdx, letterpair.first));
    }
}
std::多映射集;
const unsigned totalcount=//举个例子,这是10
用于(常数自动和字母对:字母){
unsigned lettercount=letterpair.second;//对于c,这将是3

对于(无符号i=0;i您可以使用类似于bresenham算法的方法来跟踪每个组件的理想间距和最后间距之间的误差:

vals = ['a','b','c','d']
cts  = [1,2,3,4]

sz = sum(cts)
spacing = [float(sz)/(ct+1) for ct in cts]
err = [s for s in spacing]
a=[]
for i in range(sz):
    err = [e-1 for e in err]
    m = min(err)
    i = err.index(m)
    a.append(vals[i])
    err[i]+=spacing[i]
print a

yeilds:
['d','c','b','d','a','c','d','b','c','d']

酷。你有问题吗?或者至少告诉你正在使用哪种编程语言?我不久前写了一篇关于类似内容的博客文章。请参阅。代码是C#,但概念应该翻译得很好。请参阅,我还需要一个算法,当给定一组字符时,该算法输出均匀分布的序列。这就是我描述的算法是什么。猜测游戏变得越来越困难,因为项目的数量增加了。请参见我的解决方案。JimMixel:至少对于C++ <代码> STD::MultSuth,我很确定上面描述的算法和C代码一样的结果。它们的工作原理相同,基本上是J。ust方法是100%不同的。我的方法需要更多的内存,可能会稍微慢一点,但我认为需要更少的代码。因此,这实际上是在特定索引处构建字母列表,然后按顺序输出这些列表,结果如何?@JimMischel:Hm,没有我想象的那么有效:。稍微调整一下,使用每个su的中心brange,它工作得更好:有趣的是你提到了这一点。我一直在考虑使用Bresenham方法来实现这一点,因为它可能比我使用的基于堆的方法更简单、更快。虽然这里的python实现不是最有效的,但算法非常简单,应该在O(MxN)中运行其中M是唯一字符数,N是数组大小。
vals = ['a','b','c','d']
cts  = [1,2,3,4]

sz = sum(cts)
spacing = [float(sz)/(ct+1) for ct in cts]
err = [s for s in spacing]
a=[]
for i in range(sz):
    err = [e-1 for e in err]
    m = min(err)
    i = err.index(m)
    a.append(vals[i])
    err[i]+=spacing[i]
print a