这里有几种方法。我将(尝试)用一个3x3网格的表示来说明这些示例。
扁平数组
+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+
a[row*width + column]
要访问左侧或右侧的元素,可以减去或加上1(在行边界处要小心)。要访问上方或下方的元素,请减去或加上行大小(在本例中为3)。
二维数组(对于支持此功能的语言例如C或FORTRAN)
+
| 0,0 | 0,1 | 0,2 |
+
| 1,0 | 1,1 | 1,2 |
+
| 2,0 | 2,1 | 2,2 |
+
a[row,column]
a[row][column]
访问相邻元素只需增加或减少行号或列号。编译器执行的算术运算与平面数组完全相同。
数组的数组(例如,Java)
+
| 0 |
+
| 1 |
+
| 2 |
+
a[row][column]
在这个方法中,"行指针"列表(左侧表示)是一组新的、独立的数组。与2维数组类似,通过调整适当的索引来访问相邻的元素。
完全链接单元格(2D双向链表)
+---+ +---+ +---+
| 0 |-->| 1 |-->| 2 |
| |<--| |<--| |
+---+ +---+ +---+
^ | ^ | ^ |
| v | v | v
+---+ +---+ +---+
| 3 |-->| 4 |-->| 5 |
| |<--| |<--| |
+---+ +---+ +---+
^ | ^ | ^ |
| v | v | v
+---+ +---+ +---+
| 6 |-->| 7 |-->| 8 |
| |<--| |<--| |
+---+ +---+ +---+
这种方法使每个单元格最多包含四个指向其相邻元素的指针。通过适当的指针可以访问相邻元素。您仍需要保留一个指向元素的指针结构(可能使用上述方法之一),以避免必须按顺序遍历每个链接列表。虽然这种方法有点笨重,但它在Knuth's Dancing Links算法中具有重要应用,在该算法的执行过程中修改链接以跳过网格中的“空白”区域。