这里有一些方法。我将(尝试)用 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 |-->| 0 | 1 | 2 |
+---+ +---+---+---+
| 1 |-->| 0 | 1 | 2 |
+---+ +---+---+---+
| 2 |-->| 0 | 1 | 2 |
+---+ +---+---+---+
a[row][column]
在此方法中,“行指针”列表(在左侧表示)每个都是一个新的独立数组。与二维数组一样,通过调整适当的索引来访问相邻元素。
完全链接的单元格(二维双向链表)
+---+ +---+ +---+
| 0 |-->| 1 |-->| 2 |
| |<--| |<--| |
+---+ +---+ +---+
^ | ^ | ^ |
| v | v | v
+---+ +---+ +---+
| 3 |-->| 4 |-->| 5 |
| |<--| |<--| |
+---+ +---+ +---+
^ | ^ | ^ |
| v | v | v
+---+ +---+ +---+
| 6 |-->| 7 |-->| 8 |
| |<--| |<--| |
+---+ +---+ +---+
此方法的每个单元格最多包含四个指向其相邻元素的指针。通过适当的指针访问相邻元素。您仍然需要保留指向元素的指针结构(可能使用上述方法之一)以避免必须按顺序遍历每个链表。这种方法有点笨拙,但是它在Knuth's Dancing Links算法中确实有一个重要的应用,在算法执行期间修改链接以跳过网格中的“空白”空间。