【问题标题】:How would you traverse a linked list in O(n^0.5)?你将如何在 O(n^0.5) 中遍历链表?
【发布时间】:2011-09-22 06:13:46
【问题描述】:

这是一道苹果面试题。 我还没有找到支持或反对它的令人信服的论据。

【问题讨论】:

  • 各位,这完全有可能。仅限于非常非常小的 n 值。
  • 您能详细说明一下吗?
  • :) 开个玩笑。 n = 0 是可能的 ;)
  • 您确定您提供了完整的问题吗?我认为可能会有更多关于不应忽视的限制的细节。
  • 别忘了 n = 1

标签: list linked-list


【解决方案1】:

遍历比 O(n) 更高效是不可能的,因为“遍历”需要依次访问每个节点

虽然随机访问可能比 O(n) 更快,但通过维护第二个链表来保留到中间节点的链接;但是,由于第二个列表的维护复杂性增加,插入、删除和追加成本会增加。

【讨论】:

    【解决方案2】:

    不可能。

    这是假设您的意思是查看 n 个节点的链表中的每个节点。看看你是否能弄清楚这是不可能的,这可能是一个棘手的问题。

    【讨论】:

    • 要么这样,要么问题是“你如何到达链表的末尾......”
    【解决方案3】:

    当我第一次遇到这个问题时,我的想法和这里的大多数人一样:不可能,一个诡计问题,某种心理测试。 我错了。

    真正的答案是,至少在理论上,使用量子计算机可以比 O(N) 更快地遍历列表。

    查看 Wikipedia 文章以了解 Grover 的算法 here

    他们声明了 O(n^0.5) 的摊销运行时间和 O(log n) 的空间。还应注意,它不是确定性的。这意味着算法返回正确结果的概率很高,但不能保证。

    我猜这足以通过这个问题,但其余的都在我头上。

    祝你好运。

    【讨论】:

      【解决方案4】:

      也许如果每个节点都与下一个元素、前一个元素和一个中心元素(其中 center 是当前元素和列表末尾之间的中点)连接。

      想法?

      【讨论】:

      • 您现在仍然需要“访问”每个节点,不是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 2011-04-26
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      • 2014-12-14
      相关资源
      最近更新 更多