【问题标题】:Algorithm for deleting/inserting/retriving elements in a linked list with O(sqrt(n)) complexity用于在 O(sqrt(n)) 复杂度的链表中删除/插入/检索元素的算法
【发布时间】:2011-05-03 15:05:32
【问题描述】:

我们的任务是实现一个链表类,以 O(sqrt(n)) 的时间复杂度执行以下操作:

  1. 在第 i 个位置插入一个元素
  2. 删除第 i 个位置的元素
  3. 检索列表的第 i 个元素。

我发现了一些数据结构,例如跳过列表。但时间复杂度应该是 O(sqrt(n))。

有人可以帮忙吗?

【问题讨论】:

  • 可以小于 sqrt 还是必须正好 sqrt(n)
  • @Daniel 这不是大 O 表示法的工作原理。
  • 我认为它应该正好是 sqrt(n) 但是“任何 O(log n) 的函数也是 O(sqrt(N))” 如果有一个特殊的算法就可以了O(sqrt(n)),否则我可以使用跳过列表之类的。
  • 您确定您需要使用的不是 Big Theta 吗? (看起来像`Θ(n)`)。如果它是大 O,那么使用比所要求的运行速度 更快 的东西不应该让你失去任何分数。如果是这样,你可以向讲师指出 Big O 的工作原理以及 Big Θ 是什么,让他们为成为一名计算机科学讲师感到羞耻(并拿回你的分数)。
  • en.wikipedia.org/wiki/Skip_list 中描述的跳过列表确实满足给定的问题。他们有O(log(N)) 预期时间,而不是O(log(N)) 最坏情况时间。 Wikipedia 指出,也可以制作确定性版本以提供 O(log(N)) 搜索,但只能通过运行 O(N) 结构重新排列过程。

标签: algorithm linked-list


【解决方案1】:

似乎这应该可以通过仅使用两个链接列表的跳过列表想法的简化版本来实现。但是您需要对算法有所了解,以确保较短列表中的最大元素数以O(sqrt(N)) 为界,并且较短列表的相邻元素之间的较长列表中的最大距离也以@ 为界987654322@.

【讨论】:

    【解决方案2】:

    您在理解大 O 符号时遇到了一些困难吗?

    请记住,大 O 的意思是“上限”。

    数学上,f(x) = O( g(x) ) 如果 f(x) <= C ( g(x) )

    这意味着,我们可以说f(x) is O(x^2)f(x) is O(x^1000000000),因为O(x^2)O(x^1000000000) 都是上限(尽管不一定是“好的”上限)。

    现在,正如您研究的那样,跳过列表是 O(log n) 时间。

    这意味着因为 log(n) < sqrt(n) , 我们可以说跳过列表也是O( sqrt(n) )

    【讨论】:

      【解决方案3】:

      跳过列表在搜索、删除和插入方面具有复杂性O(log n),因此它们可以满足您的要求。请记住,任何O(log n) 的函数也是O(sqrt(N)),因为sqrt 的增长速度比log 渐近更快。

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 2011-09-03
        • 2015-06-12
        • 1970-01-01
        相关资源
        最近更新 更多