【问题标题】:Finding the kth last element of a singly linked list: answer explanation查找单链表的第 k 个最后一个元素:答案解释
【发布时间】:2019-08-28 12:56:39
【问题描述】:

当您需要找到单链接列表的最后一个元素kth 时,通常的天真的方法是执行两次遍历。第一个查找列表的长度,第二个迭代直到(length-k)th 元素。

而优化版本利用了两个指针:

  • p1指的是列表的头部
  • p2kth 前面的元素 p1

这允许我们在p2 到达列表末尾时返回p1 的元素。 我不明白为什么第二种方法比第一种方法更快,因为在这两种情况下,我们都有一个指针在整个列表中迭代,另一个直到 (length-k)th 元素。

是缓存优化的原因吗?

谢谢。

【问题讨论】:

  • 当长度 = k 时,第一种方法迭代 2*k 次,但第二种方法只迭代 k 次
  • 两种算法的复杂度相同。哪一个在实践中更快取决于实际的实现。
  • 这将有助于为这两种方法编写代码。那么差异会更加明显。

标签: algorithm linked-list singly-linked-list


【解决方案1】:

如果你在p1 后面保留p2 正好k 元素,那么它并没有太大帮助,因为你必须一起执行相同数量的遍历。

不过,您可以通过使用更多指针来优化过程。

当你浏览列表时,假设你记得每个 (k/m)th 位置的指针,对于某些 m。您只需要记住这些指针的最后一个 m+1。然后,当你到达列表的末尾时,不要从头开始迭代,而是从你记得的最旧的指针开始。它将位于末尾的 kk + (k/m) 元素之间,因此您最多只需将其向前移动 k/m 个职位。

【讨论】:

    【解决方案2】:

    考虑不均匀的内存访问时间和长度为 n单链表
    - 在计数迭代方法中,对同一节点的访问将是 n 次访问分开
    - 在滞后指针方法中,对同一节点的访问将是 k 次访问分开
    使用 LRU 缓存(/with each LRU cache level),前者比后者更有可能诱发capacity misses

    【讨论】:

    • 谢谢你的回答,很有道理。
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2023-03-09
    • 1970-01-01
    • 2013-12-10
    • 2021-09-10
    • 2019-08-13
    相关资源
    最近更新 更多