成像您在网格上进行BFS(例如两个单元格之间的最短距离(。可以使用两个数据结构来托管visited
信息:
1(列表列表,即data = [[False for _ in range(cols)] for _ in range(rows)]
。稍后,我们可以通过data[r][c]
访问某个单元格中的数据。
2(dict,即data = dict()
。稍后,我们可以通过data[(r, c)]
访问某个单元格中的数据。
我的问题是:在这样的BFS方案中哪个计算更有效?
编码方面的编码似乎可以保存更多字符/行。记忆明智的方法可能会为未接触的单元节省一些空间,但也可以浪费一些空间来供射击的额外空间。
编辑
@peteris提到的numpy数组。优于列表的优势很明显:Numpy数组在连续的内存块上操作,这允许更快地寻址和更多的缓存命中。但是,我不确定它们与Hashtables的比较(即dict
(。如果算法触及相对较少的元素,则标准可能会提供更多的缓存命中,因为它可能较小的内存足迹。
另外,事实是,Numpy阵列对我来说是不可用的。因此,我确实需要比较列表与DICE的列表。
一个2D数组
存储2D数据的有效答案是分配给连续内存区域的2D数组/矩阵(不像列表的列表(。这避免了否则所需的多个内存查找,以及在dict所需的每个查找时计算哈希值。
在python中执行此操作的标准方法是在numpy库中,这是一个简单的示例
import numpy as np
data = np.zeros( (100, 200) ) # create a 100x200 array and initialize it with zeroes
data[10,20] = 1 # set element at coordinates 10,20 to 1