线性表排名问题是求出表里面的每一个元素到头结点的距离有多远。例如这样一个排名(1,2,3,4,5,6)
线性表排名问题
输入:线性表L。
输出:L中每个元素到L头结点的元素数。
其中每个排名值也可以当做权重来计算,总权重是每个结点到根结点之间的路径上所有结点的权重之和。
下面的图为计算完权重的结点。
第一个结点到根结点之间所有结点的权重之和是3,
第二个结点到根结点之间的所有结点的权重之和是3+1=4,
第三个结点到根结点之间所有结点的权重之和是3+1+5=9,......
加权线性表排名问题
输入:线性表L,其中结点v上有权重w(v)。
输出:设L中每个元素v到L头结点的所有元素集合为S,对每个v求w(ui),i=1,2...
线性时间复杂度的列表内存排名算法
v = L.head
p = 0
while v != nil do
p = p + w(v)
p(v) = p
v = succ(v)
endwhile
只需要扫描一遍线性表就可以了,把所有经过的权重求和。
但是如果线性表放在外存里,考虑到线性表中的结点随机存储,这个问题就会变得复杂。
如何解决在外存排名问题
可以设计一种比较聪明但也相对复杂的访问方法。首先取一个大小至少为N/3的独立集合。图当中的独立集合是指图当中点的集合,在这个点的集合当中任意两点之间不存在边。每一个去掉的独立集合链表中的结点合并到其后继结点当中,从而计算出链表中每个结点的排名。