나는 시뮬레이션을 작성 중이다. 해결해야 할 문제는 다음과 같습니다.지수 시간 코드를 빠르게하는 방법
길이가 l
인 임의의 이진 벡터 t
(파이썬 목록)이 제공됩니다. 그런 다음 동일한 길이의 이진 벡터를 샘플링하고 샘플링 된 각 벡터와 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
사건을 해결하기 위해 속도를 높일 수 있나요 (30)에 L이 증가하면 전혀 작동하지 않는 이유는 무엇입니까?
업데이트 그래서 지금은 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
에 도착하는 것을 멈추게하는 문제는 시간보다는 RAM 사용법입니다.
. 이것을 빠르게하고''l = 30''을 풀기위한 마술 총알은 여기에 없습니다. 언뜻보기에는 알고리즘이 ** brute force ** 인 것처럼 보입니다. ** brute force **는 절대로 빠르고 효율적이지 않습니다. –
내 알고리즘은 n^2보다 훨씬 나쁩니다. 슬프게도 기하 급수적 인 시간입니다. – marshall
나는 단지 아니오를 세고 있었다. 코드 샘플의 중첩 루프 하지만 괜찮아 :) 내가 말했듯이, 무작위적인 힘 및 기하 급수적 인 시간이 아닌 더 나은 알고리즘을 찾거나 설계하십시오. –