2015-12-16 45 views
-2

有一組字符需要在數組中均勻分佈。 例如,統一分配一組字符

一個 - 1

b - 2

Ç - 3

d - 4

在這種情況下有一個,兩個B,三c和四個d共10個字符。

現在我需要它的大小爲10的數組分配,使所有的人都均勻分佈。他們不必完全一致地分配,任何接近的都可以。

對於離。這是一個有效的序列。

d C^d B C d一d C B

+1

很酷。你有問題嗎?或者至少告訴你正在使用什麼編程語言? – JJJ

+0

我寫了一篇關於類似的博客文章。請參閱[均勻分發列表中的項目](http://blog.mischel.com/2015/03/26/evenly-distributing-items-in-a-list/)。代碼使用C#,但概念應該很好地轉換。也http://cs.stackexchange.com/questions/29709/algorithm-to-distribute-items-evenly/40773#40773看到 –

+0

我需要哪個給定一組字符的情況下,輸出均勻分佈的順序的算法。 – mohit

回答

1

你可以使用類似布氏算法的東西跟蹤理想的間距和每個組件的最後間距之間的誤差:

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']

+0

有趣的是,你提到了這一點。我一直在玩這個使用Bresenham方法的想法,因爲它可能比我使用的基於堆的方法更簡單和更快。 –

+0

儘管這裏的python實現不是最高效的,但算法非常簡單,並且應該在O(MxN)中運行,其中M是唯一字符的數量,N是數組大小。 – AShelly

0

首先,嘗試猜測其中每個字母實例是,只考慮在一個時間一個字母。如果總共有10個和3個,請嘗試將索引置於索引0,3和7.計算這些估計的每個字母的indecies,並將它們放入有序的多重集中。

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::vector<char> result; 
for(const auto& p : set) 
    result.push_back(p.second); //insert the letters in order 

這並不完美,但它的工作原理相當不錯,考慮到速度和簡單性。

爲了您的輸入,它導致bcdadcbdcd:http://coliru.stacked-crooked.com/a/1f83ae4518b7c6ca

+0

隨着物品數量的增加,猜謎遊戲變得非常困難。有關我的解決方案,請參閱http://blog.mischel.com/2015/03/26/evenly-distributing-items-in-a-list/。 –

+0

@JimMischel:至少對於C++'std :: multiset',我非常確定上面描述的算法與C#代碼具有相同的結果。他們在相同的基本概念上工作,只是這些方法完全不同。我需要更多的內存,可能是一個更慢的接觸,但我認爲需要更少的代碼。 –

+0

因此,這實際上建立了特定索引處的字母列表,然後將這些列表按順序輸出到結果中? –