我正在编写一个Python程序,涉及由不可变对象表示的多个状态的图形。生成图表的过程会产生每个州的许多重复副本。有很多状态,所以为了节省内存,我想在最终的图形对象中只保留每个状态的一个副本。因此,我想构建一组规范状态,并编写如下函数:
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
此函数采用状态并返回"规范"该州的版本。如果以前没有看过该州,它就会成为规范版本。
应该可以在大致恒定的时间内查找一个set元素,但是这个实现每次查找需要O(n)时间。还有更好的方法吗?
一种解决方案是将canonical_states
表示为自己的dict映射元素(请参阅下面的答案)。我更喜欢在不改变canonical_states
的类型的情况下实现此性能的解决方案。
简而言之:鉴于某些集合x in S
的{{1}},是否有办法获取S
这样的y
元素那S
?
答案 0 :(得分:0)
通过将每个状态映射到自身的dict表示规范状态集。然后代码变成这样:
def canonicalize(state, canonical_states):
return canonical_states.setdefault(state, state)