2014-10-12 63 views
0

我正在寫一個Python程序,涉及由不可變對象表示的許多狀態的圖。生成圖的過程會生成每個狀態的許多重複副本。有很多狀態,所以爲了節省內存,我想在最終的圖形對象中只保留每個狀態的一個副本。因此,我想建立一套規範的狀態,並寫一個函數是這樣的:如何在Python 3中獲取集合的匹配元素?

def canonicalize(state, canonical_states): 
    if state in canonical_states: 
     state, = (cstate for cstate in canonical_states if cstate == state) 
    else: 
     canonical_states.add(state) 
    return state 

此功能需要一個狀態,並返回該國的「經典」版本。如果這個國家以前沒有見過,它就成了規範版本。

應該可以在大致恆定的時間內查找設置元素,但是這種實現需要每次查找需要O(n)個時間。有沒有更好的辦法?

一個解決方案是將canonical_states作爲自己的字典映射元素(請參閱下面的答案)。我更喜歡在不改變canonical_states類型的情況下實現此性能的解決方案。

一言以蔽之:鑑於x in S對於一些設置S,有沒有辦法讓元素S這樣x == yy

回答

0

通過將每個狀態映射到自身的dict來表示規範狀態的集合。然後代碼變成這樣的:

def canonicalize(state, canonical_states): 
    return canonical_states.setdefault(state, state) 
相關問題