使用偏移量

时间:2016-03-18 13:43:04

标签: arrays algorithm traversal

以下摘录自"算法+数据结构=程序"作者:Niklaus Wirth,第34章和第13章。记录结构":

在另一个例子中,我们假设(可能为了更快地找到它们)数组 a 中的某些人群被链接在一起。链接信息由记录结构 Person 的附加组件表示,名为 link 。链接将记录连接成线性链,以便可以容易地找到每个人的后继者和前任者。该链接技术的有趣特性是可以基于存储在每个记录中的单个数字在两个方向上遍历链。该技术的工作原理如下。

假设链的三个连续成员的索引是 i k-1 i k k + i k 成员的链接值选择为 i k + 1 - i k -1 。在正向遍历链, i k + 1 由两个当前索引变量 x = i k-1 确定 y = i k

i k + 1 = x + a [y] .link

在向后遍历链时, i k-1 x = i k + 1 <确定/ em>,和 y = i k as:

i k-1 = x - a [y] .link

一个例子是将所有同性性行为者联系在一起:

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

我无法理解链接是如何工作的。让我们说我们想要通过 y = i k = a [1] 开始向前移动链。由于我们之前没有 i k-1 元素, x 的起始值是多少?我尝试从 x = 0 x = 1 开始,但两者都会导致错误的序列。如果我们想要向后移动链条怎么办?

1 个答案:

答案 0 :(得分:1)

它假定如果向前遍历则从链中的索引最低的元素开始,或者如果向后遍历则从最高索引元素开始。这些元素的链接值设置为x的初始值等于当前索引y。例如,遍历女性:

从Carolyn开始向前走......

i k = y = 1

i k-1 = x = 1(x的初始猜测与y相同)

i k + 1 = x + a [y] .link = 1 + 2 = 3

......索引3的人是蒂娜。成功了!

向后走,从安妮开始...

i k = y = 9

i k-1 = x = 9(x的初始猜测与y相同)

i k + 1 = x - a [y] .link = 9 - 1 = 8

......索引8的人是玛丽。成功了!

我不认为你可以用这种方法从表中间的任意位置开始。您只能从头开始向前移动,或从末尾向后移动。

编辑:为了完整性,请点击:

从克里斯开始向前穿越...

i k = y = 2

i k-1 = x = 2(x的初始猜测与y相同)

i k + 1 = x + a [y] .link = 2 + 2 = 4

......索引4的人是罗伯特。

向后移动,从Mathias开始...

i k = y = 10

i k-1 = x = 10(x的初始猜测与y相同)

i k + 1 = x - a [y] .link = 10 - 3 = 7

......索引7的人是雷神。