我想洗牌像這樣的列表: -算法洗牌的列表,以儘量減少等於鄰居
to_shuffle = [ a, b, b, b, b, a, c, b, a, b ]
,以儘量減少重複元素的數量。起初,我對彈出元素斷to_shuffle
頂部,要麼 推動他們到另一個列表shuffled
如果元素是從以前壓元素 不同,否則將其推到 底部to_shuffle
並嘗試其他元素 思想。這將導致在 : -
shuffled = [ a, b, a, c, b, a, b, b, b, b ]
,其在這個例子中,是沒有任何好轉 - 仍有4b的一排(雖然這方法有時降低重複元件)。
我當時以爲是通過使剷鬥每類 元素的開始: -
buckets = [ (a, [a, a, a]), (b, [b, b, b, b, b, b]), (c, [c]) ]
由大小桶排序,降最後一個元素的
buckets = [ (b, [b, b, b, b, b, b]), (a, [a, a, a]), (c, [c]) ]
保持跟蹤洗牌
last = None
循環通過桶,從最大,流行過的 元素,如果不等於last
,訴諸桶,做一遍: -
sorted = [ b ]
buckets = [ (b, [b, b, b, b, b]), (a, [a, a, a]), (c, [c]) ]
last = b
sorted = [ b, a ]
buckets = [ (b, [b, b, b, b, b]), (a, [a, a]), (c, [c]) ]
last = a
sorted = [ b, a, b ]
buckets = [ (b, [b, b, b, b]), (a, [a, a]), (c, [c]) ]
last = b
sorted = [ b, a, b, a ]
buckets = [ (b, [b, b, b, b]), (a, [a]), (c, [c]) ]
.
.
.
sorted = [ b, a, b, a, b, a, b, c, b, b ]
這是一個更好的結果。
是否有這個算法的名稱,如果有的話是否有python(2.7)實現它?
下面是一些比較僞劣代碼: -
test = [ 'a', 'b', 'b', 'b', 'b', 'a', 'c', 'b', 'a', 'b' ]
expected = [ 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'c', 'b', 'b' ]
def sort_buckets(buckets):
return sorted(buckets, key=lambda x: len(x[1]), reverse=True)
def make_buckets(to_shuffle):
h = {}
buckets = []
for e in to_shuffle:
if e not in h:
h[e] = []
h[e].append(e)
for k, elems in h.iteritems():
buckets.append((k, elems))
return buckets
def shuffle(to_shuffle):
buckets = make_buckets(to_shuffle)
shuffled = []
last = ''
while len(buckets) > 1:
buckets = sort_buckets(buckets)
for i in range(len(buckets)):
candidate = buckets[i][0]
if candidate == last:
continue
t = buckets.pop(i)
last = candidate
shuffled.append(t[1][-1])
if len(t[1]) > 1:
buckets.append((t[0], t[1][:-1]))
break
t = buckets.pop()
shuffled += t[1]
return shuffled
print expected
print shuffle(test)
是隨機性部分的要求?你試圖實現的並不是真正的洗牌,而是避免連續出現同一個字符...... – Zoomzoom
不,如你所說,避免連續出現的同一個字符是目標,而不是隨機性。它不洗牌嗎?你會怎麼稱呼它? – jah
我稱之爲「無重複重排」......當你「洗牌」一副牌時,你是否期待隨機性,或者你是否通過牌來確保牌的順序是你想要的? – Zoomzoom