最快的数据结构,默认值为未定义的索引?

时间:2013-08-18 15:44:53

标签: data-structures defaultdict game-maker

我正在尝试创建一个二维数组,当我访问索引时,将返回该值。但是,如果访问未定义的索引,它将调用回调并使用该值填充索引,然后返回该值。

阵列也有负索引,但我可以通过使用4个阵列(每个象限大约0,0一个)来克服它。

2 个答案:

答案 0 :(得分:0)

您可以创建依赖于元组和字典的Matrix类,具有以下行为:

from collections import namedtuple
2DMatrixEntry = namedtuple("2DMatrixEntry", "x", "y", "value")
matrix = new dict()
defaultValue = 0

# add entry at 0;1
matrix[2DMatrixEntry(0,1)] = 10.0

# get value at 0;1
key = 2DMatrixEntry(0,1)
value = {defaultValue,matrix[key]}[key in matrix]

干杯

答案 1 :(得分:0)

对于stackoverflow,这个问题可能过于宽泛。 - 没有通用的“一刀切”解决方案,结果很大程度上取决于使用的语言(和标准库)。

这个问题有几个问题。首先让我们考虑一个2d数组,我们说这只是语言的一部分,并且这样的数组在访问时动态增长。如果不是这种情况,问题就变得与语言有关。

现在,在分配内存时,语言会自动初始化这些点(再次语言取决于这种情况如何发生以及最佳方法是什么,请查看RAII)。虽然我可以预见特定细胞的实际计算可能代价高昂(与分配相比)。在这种情况下,一个有趣的事情可能是所谓的“两阶段建设”。数组必须用元组/对象填充。对象的默认构造将bit / boolean设置为false - 表示该值尚未就绪。然后在access(即get()方法或operator() - 依赖于语言)上,如果这个位为false则构造,否则它只是读取。


另一种方法是使用字典/键值映射。其中键是坐标,值是值。这具有以下优点:访问构造的问题继承到数据结构(尽管再次依赖于语言)。然而,使用映射的缺点是值的查找速度从O(1)变为O(logn)。 (实际时间因语言的不同而有很大差异。)


最后,我希望您了解如何执行此操作取决于更具体的要求,您使用的语言和其他库。最后,每种语言中只有一个数据结构:一长串未分配的值。比这更高级的东西取决于语言。