在尝试写mdp环境的时候,state可能是一个多维的状态,比如迷宫有{x,y},当然也可以用x*size(y)+y来表示,或者直接识别成字符串,如书上所写
key = "%d_%s"%(state, action)
再或者将内容转化为byte然后存入hash(这种方法我很怀疑能不能行,毕竟不同的object转化为byte的结果不同)
在一位ACMer的解题思路中,我找到了解决这个多维hash的一个可行的方法
如上文中提到的{x,y}状态如何存入hash表中
状态{x,y}可以理解为一个二维的状态,我们可以将x位置的数值作为hash表的key,对应的value为一个新的hash表,用来存储y位置的key-value,而这个hash表的value就是{key:(x,y),value:v}中的v
引申到多维的状态
同二维一样,多维的状态也是将状态的第一个位置的值作为key存入root,value为hash表,直到读到key的最后一个,value为整个状态的value。
下面是我用python写的一个demo
class HighDict:
def __init__(self):
self.root = dict()
def save(self,key,value):
key = self.flatten(key)
item = self.root
for iter1 in range(len(key)-1):
k = key[iter1]
item[k] = dict()
item = item[k]
k = key[len(key)-1]
item[k] = value
def read(self,key):
key = self.flatten(key)
value = self.root
for iter1 in range(len(key)):
k = key[iter1]
value = value[k]
return value
# 多维数组转化为一维数组
def flatten(self,a):
if not isinstance(a, (list, )):
return [a]
else:
b = []
for item in a:
b += self.flatten(item)
return b
if __name__ == "__main__":
d = HighDict()
key1 = [[1,2,3],[2,3,4]]
value1 = 6
d.save(key1,value1)
key2 = [2,3,4]
value2 = 9
d.save(key2,value2)
print(d.read(key1))
pass
测试结果
当hash一个100*100的矩阵时,耗时:0:00:00.005996
当hash一个1920*1080的矩阵时,耗时:0:00:01.369210
不知道还有没有更好的方法,等找到了再试试