当您需要查找单行列表的最后k
个元素时,通常的幼稚方法是执行两次遍历。第一个找到列表的长度,第二个迭代直到(length-k)th
元素。
优化版本利用了两个指针:
p1
是指列表的开头p2
在k
之前第p1
个元素这使我们可以在p1
到达列表末尾时返回p2
的元素。
我不明白为什么在两种情况下我们都有一个指针遍历整个列表,然后又遍历另一个指针直到(length-k)th
元素时,第二种方法比第一种更快。
是由于缓存优化吗?
谢谢。
答案 0 :(得分:2)
如果将p2
的{{1}}个元素紧紧放在k
后面,那么这并没有太大帮助,因为您必须一起进行相同数量的遍历。
不过,您可以通过使用更多的指针来优化过程。
当您遍历列表时,可以说您记得在每个(k / m)位置的某个 m 处的指针。您只需要记住这些指针的最后一个 m + 1 即可。然后,当您到达列表的末尾时,而不是从头开始再次进行迭代,而是从您记住的最早的指针开始。它位于末尾的 k 和 k +(k / m)元素之间,因此您只需将其最多向前移动 k / m < / em>职位。
答案 1 :(得分:1)
考虑不均匀的内存访问时间和长度为 n 的单链列表:
-在计数迭代方法中,对同一节点的访问将 n 次访问
-在滞后指针方法中,对同一节点的访问将 k 分开访问
使用LRU缓存(/每个LRU缓存 level ),前者比后者更容易诱发capacity misses。