在python中,我生成表示状态的列表(例如状态可以是[1,3,2,2,5]
)。
每个元素的值可以是1到某个特定数字。 基于某些规则,这些状态可以以特定方式发展。我对我已经遇到的状态不感兴趣。
现在我的代码只是检查一个列表是否在列表列表中,如果不是,它会附加它。但是这个列表变得非常庞大并且使用了大量资源来检查。
我想
如果我将状态存储为列表或数组,请将其调整为1 对应于索引值,并尝试将该值作为索引传递 对于零数组,它不只是改变一个元素。
我认为这是因为列表在括号中,其中index()需要 由逗号分隔的整数的参数。
有没有办法传递一个列表或整数数组来检查一个不会给我的代码增加复杂性的数组的索引?或者甚至只是一些更有效的方式 存储并检查我已生成的状态?
答案 0 :(得分:1)
您应该在set
中维护已遇到的状态。这可确保包含检查(state in visited
)为O(1),而不是O(N)。由于lists
不可清,因此您必须将它们转换为tuples
,或者首先使用元组:
visited = set()
states = [[1,3,2,2,5], [...], ...]
for state in states:
tpl = tuple(state)
if tpl not in visited: # instant check no matter the size of visted
# process state
visited.add(tpl)
您创建此5维列表并将状态值作为索引传递的想法是有效的,但会为每个插槽创建一个大的(n^5
n:值的数量),并且可能是稀疏的,因此是有缺陷的矩阵。
顺便说一句,您可以通过m[1][3][2][2][5]
访问此类矩阵中的广告位,而不是m.index([1,3,2,2,5])
。
答案 1 :(得分:1)
是的,您可以定义一个州的类,并使用定义其哈希函数。这样,查找的运行时间减少到O(1)
,所需空间减少到O(N)
,其中N
是状态数而不是< strong>州的州数*州的规模
州的样本类:
class State(object):
def __init__(self, state_array):
self.state_array = state_array
def getHash(self):
return hash(self.state_array) # using python default hash function here, you can totally design your own.
存储当前状态时:
# current_state is the state you currently have
all_states = {}
if current_state.getHash() not in all_state:
all_states[current_state.getHash()] = 1
else:
# Do something else
请注意,在python中,element in dict
需要O(1)
,因为python中的dict
实际上是一个hashmap。