我正在寫一個模擬。我需要解決的問題如下。如何加速指數時間碼
我給出了一個長度爲l
的隨機二進制向量t
(python中的一個列表)。然後,我對相同長度的二進制向量進行採樣,並測量每個採樣向量與t
之間的漢明距離(即對齊失配的數量)並存儲結果。我想確定長度爲l的二進制向量與迄今爲止發現的距離是否相符。顯然t
是但它也可能是其他許多人也是。
我的代碼如下。
import random
import itertools
import operator
l=23
t = [random.randint(0,1) for b in range(l)]
stringsleft = set(itertools.product([0,1],repeat=l))
xcoords = []
ycoords = []
iters = l
for i in xrange(iters):
print i, len(stringsleft)
xcoords.append(i)
ycoords.append(math.log(len(stringsleft)))
pattern = [random.randint(0,1) for b in range(l)]
distance = sum(itertools.imap(operator.ne, pattern, t))
stringsleft = stringsleft.intersection(set([y for y in stringsleft if sum(itertools.imap(operator.ne, pattern, y)) == distance]))
不幸的是很慢的,並且使用了大量的內存,並在所有如果我增加l至30是否有可能加快這解決l=30
情況下不能正常工作?
更新
我由整數替換名單所以現在有l=26
運行做了一個小的優化。
l=26
t = random.randint(0,2**l)
stringsleft = set(range(2**l))
xcoords = []
ycoords = []
iters = l
for i in xrange(iters):
print i, len(stringsleft)
if (len(stringsleft) > 1):
xcoords.append(i)
ycoords.append(math.log(len(stringsleft),2))
pattern = random.randint(0,2**l)
distance = bin(pattern^t).count('1')
stringsleft = stringsleft.intersection(set([y for y in stringsleft if bin(pattern^y).count('1') == distance]))
是阻止我前往l=30
的問題是內存的使用,而不是時間。
你需要找到一個更加優化的算法,是不是N^2。這裏沒有* magic bullet *來加速並解決'l = 30''。乍一看,它看起來像你的算法是**蠻力**,這永遠不會是快速或有效的。 –
我的算法比n^2更差。悲傷的是指數時間。 – marshall
我只是在計算不。代碼示例中的嵌套循環。但好吧:)就像我說的,找到或設計一個更好的算法,不是蠻力和指數時間。 –