【问题标题】:What is the time complexity of a linked list? [closed]链表的时间复杂度是多少? [关闭]
【发布时间】:2021-09-09 21:12:01
【问题描述】:

假设你想在一个空链表中插入n个元素,同时保持排序顺序。最坏情况时间是多少?

【问题讨论】:

  • 这基本上是大多数教科书中用来解释不同复杂性的示例,所以也许您需要阅读其中的一些?另外,由于这显然是家庭作业,请至少表现出你的努力!
  • 其实不是作业,我是一名毕业生,最近对计算机科学感兴趣。

标签: c data-structures linked-list


【解决方案1】:

如果您在每次插入新元素后进行排序,那么最坏情况下的时间复杂度将是 o(n^2)。 (插入需要 o(1),然后排序需要 o(n^2)。)

或者如果你一次插入所有元素然后应用排序,那么它需要 o(nlogn).(使用合并排序)

【讨论】:

    【解决方案2】:

    如果,通过“保持排序顺序”,您的意思是它们已经排序,这是一个 O(n) 操作,因为您只需将它们中的每一个都添加到列表的末尾(并且您可以记录当前结束而不是每次都搜索它):

    make new list from first value, keeping pointer to last, O(1)
    for curr in second and subsequent values, O(n):
        add to list using last, update last, O(1)
    

    如果您的意思是它们没有排序但它们应该排序,那将是O(n<sup>2</sup>),作为@的每个 987654324@ 新值将导致 O(n) 搜索,然后是 O(1) 插入:

    for curr in values, O(n):
        find insertion point, O(n)
        insert at that point, O(1)
    

    【讨论】:

    • 抱歉我的无知,但为什么搜索的 o(n) 和插入的 o(1) 的总复杂度为 o(n^2)?
    • @RafiLushan:你需要永远为寻求知识或清晰而道歉 :-) 这是因为你需要为 每个 这样做O(n)+O(1) == O(n) n 你想插入的东西:有点像O(n) 出现的东西已经 O(n)O(n*n)
    • @RafiLushan:把它想象成冒泡排序。整个n 元素的单遍(单遍是O(n),因为您必须遍历每个元素才能通过)会将这些元素中的一个 放在其最终正确的位置。但是您需要这样做n 次,每个元素一个。因此O(n*n)。嵌套循环,所有级别都基于输入大小,在复杂性分析中总是给你一些n 的力量。
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2018-11-24
    • 2014-05-27
    相关资源
    最近更新 更多