来自wikipedia:
排序列表实现:就像一个 超市收银台,但是 重要人物“切入”的地方 不那么重要的人面前。 (的 O(n)的 插入时间,O(1)下一次, O(n * log(n))构建)
我认为如果使用二进制搜索算法搜索插入位置,插入时间复杂度应为O(log(n))。这里我将作业的到达顺序视为优先级因素。
我错了还是维基百科不正确?
更新: 根据TAOCP清单的严格定义:
线性列表是n> = 0的序列 节点X 1,X [2],...,X [n]其中 基本结构性 仅涉及相对位置 它们出现在一个项目之间 线。
我认为列表维基百科推荐不是链接列表,它可能是数组。
感谢。
答案 0 :(得分:3)
在您的引用中,维基百科似乎指的是由排序列表而不是堆组成的优先级队列。要将项插入到排序列表中需要O(n)时间(假设我们正在维护其排序)。
答案 1 :(得分:3)
如果支持链表,则无法进行二进制搜索; 找到插入点是O(n), 实际插入是O(1),只需更改相邻节点, 总体O(n)。
如果它支持的数组你可以进行二进制搜索; 找到插入点是O(log(n)), 但是插入数组是O(n),因为你可能需要移动数组的所有元素, 总体O(n)
这就是为什么你实际上有树/堆支持所以所有操作都可以是O(log(n))
答案 2 :(得分:1)
二进制搜索确实是O(log n)
,但二进制搜索适用于数组 - 它可以在此时使用,因为您可以访问O(1)中的任何元素。
但是,在文献中,当您看到术语列表时,您应该考虑链接列表。 因此,在列表中,您没有O(1)访问时间,而是需要“手动”搜索位置 - 因此插入元素将需要O(n)。
答案 3 :(得分:0)
排序列表中最差的插入时间是O(n)。最糟糕的情况是将最高项插入列表。要做到这一点,你必须逐步完成所有元素,然后插入到最后。你不进行二进制搜索的原因是你只能在列表中访问的元素是你当前元素的后继元素,即没有随机访问。
答案 4 :(得分:0)
维基百科是正确的。正如其他人已经说过的那样,列表不是随机访问,因此你需要在到达B之前访问A和B之间的每个节点。这使得二进制搜索无用,因为遍历列表是O(n),所以你最终做更多工作比你只是迭代一次列表。您可以将开始,中间和结束节点缓存在单独的缓冲区中并首先检查它们。但是,这与使用多个列表具有相同的效果。跳过列表数据结构更进一步。
因此,请使用随机访问堆,或者使用跳过列表:http://en.wikipedia.org/wiki/Skip_list,具体取决于您的需求。