1

(時間)の代わりにneighbor_trial(atomlist,trialatom)実行される新しい関数、を作成したいと思います。これは、前回の実行の結果を更新するだけで実現できます。は移動される原子であり、内の他のすべての原子は移動されません。O(n)neighbor(atomlist)O(n^2)neighbor(atomlist)trialatomatomlist

バックグラウンド:

atomlistAtomクラスのインスタンスのリストです。Atomオブジェクトには、がの最近傍であるatom1.is_neighbor(atom2)かどうかをチェックする関数があります。そうである場合は、リストに追加されます。アトムは最大12個の一意の最近傍のみを持つことができ、それ自体を含めることはできません。atom2atom1atom2atom1.nrst

問題:

neighboratom全員のリストを正しく更新しますnrstが、時間がかかります(何度も再実行する必要があります)。ただし、neighbor_trial正しく更新されません。すべてatomnrstネイバーをチェックして、trialatom現在ネイバーであるかどうかを確認し、リストがワイプされたのnrstリストを再作成する必要があります。atomnrst

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])
4

0 に答える 0