(時間)の代わりにneighbor_trial(atomlist,trialatom)
実行される新しい関数、を作成したいと思います。これは、前回の実行の結果を更新するだけで実現できます。は移動される原子であり、内の他のすべての原子は移動されません。O(n)
neighbor(atomlist)
O(n^2)
neighbor(atomlist)
trialatom
atomlist
バックグラウンド:
atomlist
Atomクラスのインスタンスのリストです。Atomオブジェクトには、がの最近傍であるatom1.is_neighbor(atom2)
かどうかをチェックする関数があります。そうである場合は、リストに追加されます。アトムは最大12個の一意の最近傍のみを持つことができ、それ自体を含めることはできません。atom2
atom1
atom2
atom1.nrst
問題:
neighbor
atom
全員のリストを正しく更新しますnrst
が、時間がかかります(何度も再実行する必要があります)。ただし、neighbor_trial
正しく更新されません。すべてatom
のnrst
ネイバーをチェックして、trialatom
現在ネイバーであるかどうかを確認し、リストがワイプされたのnrst
リストを再作成する必要があります。atom
nrst
def neighbor(atomlist):
cdef int i, j
for atom in atomlist:
atom.nrst=[] #Unnecessarily deletes every atom's nrst!
for i in range(len(atomlist)):
for j in range(i+1,len(atomlist)):
if atomlist[i].is_neighbour(atomlist[j]):
atomlist[i].nrst.append(atomlist[j])
atomlist[j].nrst.append(atomlist[i])
def neighbor_trial(atomlist,trialatom):
cdef int i, j
redoo_list=[]
for atom in trialatom.nrst:
atom.nrst=[] #Only trialatom and its neighbours' nrst list are wiped!
redoo_list.append(atom)
trialatom.nrst = []
redoo_list.append(trialatom)
for i in range(len(atomlist)):
for j in range(len(redoo_list)):
if atomlist[i] != redoo_list[j]:
if atomlist[i].is_neighbour(redoo_list[j]):
redoo_list[j].nrst.append(atomlist[i])