以下是Niklaus Wirth“1.7章”中“算法+数据结构=程序”的摘录记录结构:
在另一个示例中,我们假设(可能是为了更快地找到它们)阵列A中的某些人员组连接在一起。链接信息由记录结构person的另一个组件link表示。这些链接将记录连接成一个线性链,这样就可以很容易地找到每个人的继任者和前任。这种链接技术的有趣特性是,可以基于存储在每个记录中的单个数字在两个方向上遍历链这项技术的工作原理如下。
假设链的三个连续成员的索引为ik-1、ik、ik+i。第k个成员的链接值选择为ik+1-ik-1。在正向遍历链时,根据两个当前索引变量x=ik-1和y=ik确定ik+1为:
ik+1=x+a[y].link
当反向遍历链时,根据x=ik+1和y=ik确定ik-1为:
ik-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=ik=a[1]开始,沿着链的前进方向遍历链。由于我们没有先前的ik-1元素,x的起始值是多少?我试过从x=0或x=1开始,但都会导致错误的序列如果我们想沿反方向穿过链条怎么办?

最佳答案

它假设向前遍历时从链中最低索引元素开始,向后遍历时从最高索引元素开始这些元素的链接值设置为x的初始值等于当前索引y。例如,遍历雌性:
从卡罗琳开始向前走…
ik=y=1
ik-1=x=1(x的初始猜测与y相同)
ik+1=x+a[y].link=1+2=3
…索引3的人是蒂娜成功!
向后走,从安妮开始。。。
ik=y=9
ik-1=x=9(x的初始猜测与y相同)
ik+1=x-a[y].link=9-1=8
…指数8的人是玛丽。成功!
我认为用这种方法你不能从桌子中间的任意位置开始。只能从起点向前或从终点向后遍历。
编辑:为了完整起见,这些家伙:
向前移动,从克里斯开始。。。
ik=y=2
ik-1=x=2(x的初始猜测与y相同)
ik+1=x+a[y].link=2+2=4
…指数4的人是罗伯特。
向后移动,从马蒂亚斯开始…
ik=y=10
ik-1=x=10(x的初始猜测与y相同)
ik+1=x-a[y].link=10-3=7
... 指数7的人是雷声公司。

关于arrays - 用偏移量链接数组的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36086003/

10-09 18:41