【发布时间】:2011-05-03 15:05:32
【问题描述】:
我们的任务是实现一个链表类,以 O(sqrt(n)) 的时间复杂度执行以下操作:
- 在第 i 个位置插入一个元素
- 删除第 i 个位置的元素
- 检索列表的第 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