使用偏移量链接数组的元素
Linking elements of an array with an offset
以下摘自 Niklaus Wirth "Algorithms + Data Structures = Programs" 的“1.7. 记录结构”一章:
在另一个例子中,我们假设(可能是为了更快地找到他们)数组 a 中的某些人组 link 在一起。 linking 信息由记录结构 Person 的附加组件表示,名为 link。 links 将记录连接成一个线性链,这样可以很容易地找到每个人的继任者和前任。 属性 这种 linking 技术的有趣之处在于,可以根据每个记录中存储的单个数字在两个方向上遍历链。该技术的工作原理如下。
假设链上连续三个成员的索引为ik-1,ik, ik+i。第 k 个成员的 link 值被选择为 ik+1 —ik-1。正向遍历链,ik+1由当前两个索引变量x = ik-1,并且 y = ik 如:
ik+1 = x+a[y].link
而向后遍历链,ik-1 由 x = ik+1,并且 y = ik 如:
ik-1 = x - a[y].link
一个例子是 link 在 table:
中所有同性的人
Index First Name Sex Link
----- ---------- --- ----
1 Carolyn F 2
2 Chris M 2
3 Tina F 5
4 Robert M 3
5 Jonathan M 3
6 Jennifer F 5
7 Raytheon M 5
8 Mary F 3
9 Anne F 1
10 Mathias M 3
我无法理解 linking 的工作原理。假设我们想要向前遍历链,从 y = ik = a[1] 开始。由于我们没有前面的ik-1元素,那么x的起始值是多少呢?我试过从 x = 0 或 x = 1 开始,但两者都会导致错误的序列。如果我们想反向遍历链呢?
如果向前遍历,它假定您从链中索引最低的元素开始,如果向后遍历,则假定您从链中索引最高的元素开始。这些元素设置了 link 值,以便 x 的初始值等于当前索引 y。比如遍历雌性:
向前移动,从 Carolyn 开始...
ik = y = 1
ik-1 = x = 1 (初始猜测 x 与 y 相同)
ik+1 = x + a[y].link = 1 + 2 = 3
...索引 3 处的人是 Tina。成功!
向后遍历,从安妮开始...
ik = y = 9
ik-1 = x = 9 (初始猜测 x 与 y 相同)
ik+1 = x - a[y].link = 9 - 1 = 8
...索引 8 处的人是玛丽。成功!
我认为您不能使用此方法从 table 中间的任意位置开始。只能从头向前遍历,或从末尾向后遍历。
编辑: 为了完整起见,伙计们:
向前移动,从克里斯开始...
ik = y = 2
ik-1 = x = 2 (初始猜测 x 与 y 相同)
ik+1 = x + a[y].link = 2 + 2 = 4
...索引为 4 的人是罗伯特。
向后遍历,从 Mathias 开始...
ik = y = 10
ik-1 = x = 10(x 的初始猜测与 y 相同)
ik+1 = x - a[y].link = 10 - 3 = 7
...索引7的人是雷神
以下摘自 Niklaus Wirth "Algorithms + Data Structures = Programs" 的“1.7. 记录结构”一章:
在另一个例子中,我们假设(可能是为了更快地找到他们)数组 a 中的某些人组 link 在一起。 linking 信息由记录结构 Person 的附加组件表示,名为 link。 links 将记录连接成一个线性链,这样可以很容易地找到每个人的继任者和前任。 属性 这种 linking 技术的有趣之处在于,可以根据每个记录中存储的单个数字在两个方向上遍历链。该技术的工作原理如下。
假设链上连续三个成员的索引为ik-1,ik, ik+i。第 k 个成员的 link 值被选择为 ik+1 —ik-1。正向遍历链,ik+1由当前两个索引变量x = ik-1,并且 y = ik 如:
ik+1 = x+a[y].link
而向后遍历链,ik-1 由 x = ik+1,并且 y = ik 如:
ik-1 = x - a[y].link
一个例子是 link 在 table:
中所有同性的人Index First Name Sex Link
----- ---------- --- ----
1 Carolyn F 2
2 Chris M 2
3 Tina F 5
4 Robert M 3
5 Jonathan M 3
6 Jennifer F 5
7 Raytheon M 5
8 Mary F 3
9 Anne F 1
10 Mathias M 3
我无法理解 linking 的工作原理。假设我们想要向前遍历链,从 y = ik = a[1] 开始。由于我们没有前面的ik-1元素,那么x的起始值是多少呢?我试过从 x = 0 或 x = 1 开始,但两者都会导致错误的序列。如果我们想反向遍历链呢?
如果向前遍历,它假定您从链中索引最低的元素开始,如果向后遍历,则假定您从链中索引最高的元素开始。这些元素设置了 link 值,以便 x 的初始值等于当前索引 y。比如遍历雌性:
向前移动,从 Carolyn 开始...
ik = y = 1
ik-1 = x = 1 (初始猜测 x 与 y 相同)
ik+1 = x + a[y].link = 1 + 2 = 3
...索引 3 处的人是 Tina。成功!
向后遍历,从安妮开始...
ik = y = 9
ik-1 = x = 9 (初始猜测 x 与 y 相同)
ik+1 = x - a[y].link = 9 - 1 = 8
...索引 8 处的人是玛丽。成功!
我认为您不能使用此方法从 table 中间的任意位置开始。只能从头向前遍历,或从末尾向后遍历。
编辑: 为了完整起见,伙计们:
向前移动,从克里斯开始...
ik = y = 2
ik-1 = x = 2 (初始猜测 x 与 y 相同)
ik+1 = x + a[y].link = 2 + 2 = 4
...索引为 4 的人是罗伯特。
向后遍历,从 Mathias 开始...
ik = y = 10
ik-1 = x = 10(x 的初始猜测与 y 相同)
ik+1 = x - a[y].link = 10 - 3 = 7
...索引7的人是雷神