【问题标题】:Singly linked list iteration complexity单链表迭代复杂度
【发布时间】:2015-06-16 17:56:10
【问题描述】:

首先,我对单链表的基本理解是每个节点只指向下一个后续节点,所以我的问题可能源于我对此类列表的定义不正确。

鉴于列表设置,到达节点 n 将需要遍历它之前的 n-1 个节点,因此搜索和访问将是 O(n)。现在,显然节点插入和删除需要 O(1),但除非他们谈论第一个项目插入,否则实际上在节点 n 之间插入项目将是 O(n) + O(1) n+1.

现在,索引列表也会有 O(n) 复杂度,但显然构建这样的索引是不受欢迎的,我不明白为什么。难道我们不能建立一个单链表索引,这将允许我们真正的 O(1) 插入和删除,而不必在列表上执行 O(n) 迭代以到达我们的特定节点?它甚至不需要是所有节点的索引,我们可以让它指向子索引,即对于 1000 个项目的列表,第一个索引将指向 1-100、101-200 等之间项目的 10 个不同索引. 然后这些索引可能指向更小的索引,即 10。这种方式到达节点 543 可能只需要 3+(索引遍历)迭代,而不是像典型的单链表那样需要 543 次。

我想,我要问的是为什么通常应该避免这种索引?

【问题讨论】:

    标签: java algorithm list time-complexity


    【解决方案1】:

    您正在描述skip-list

    跳过列表的搜索、插入、删除时间复杂度为O(logN),因为您描述的这个“较小的子索引”-您有它们的对数(如果您的列表有 100 个元素会发生什么?这些级别有多少你需要吗?1,000,000 个元素需要多少钱?和 10^30?)。
    请注意,跳过列表通常保持排序,但如果您愿意,也可以不排序(实际上是按索引排序)。

    【讨论】:

      【解决方案2】:

      对于单链表,即使你已经直接引用了要删除的节点,复杂度也不是O(1)。这是因为您必须更新 prior 节点的下一个节点引用,这需要您遍历列表 - 导致 O(N) 复杂度。要获得 O(1) 的删除复杂度,您需要一个双向链表。

      已经有一个集合类将 HashMap 与双向链表相结合:LinkedHashMap

      【讨论】:

        猜你喜欢
        • 2016-02-23
        • 2017-03-19
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 2020-05-14
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多