我对从跳过列表中插入或删除元素所花费的时间感到困惑。
假设有一个高度为H的跳过列表,每个级别包含n / 2 ^ i个条目
n =键值对的总数
i =跳过列表的级别i< = H
现在,根据理论,插入操作将执行以下操作
1.找到一个键< =正在插入的键
2.插入此键
3.在基准水平之上的水平中随机创建此条目。
让我们假设跳过列表基于链表。
第1步:应该采取O(n)。
第2步:应该是O(1)。
第3步:应该是O(log n)时间。我仍然对这个逻辑感到困惑,它将成为下面问题的一部分
问题
基于上述事实,插入的时间不应该是O(n)+ O(1)+ O(log n)? 忽略低阶项,它应该通过O(n)+ O(log n)?
步骤3应该再花费O(n)时间来搜索正在插入的键< =键,然后再插入o(1)。导致插入运行时间过于复杂?
书籍说,在跳过列表中插入需要O(log n)时间。我一定错过了一些重要的信息,请你帮我理解这个概念。
答案 0 :(得分:1)
由于跳过列表用于存储已排序的数据,因此在查找插入新元素的位置时,您可以执行比线性搜索更智能的操作。
基本上,您可以使用更高级别的指针执行类似于二进制搜索的操作。例如,通过检查log n - 1
级别上的链接,您可以将新项目与列表中间的项目进行比较,从而确定是否应将其插入列表的前半部分或后半部分。然后你继续这样,每次查看较低级别的链接以获得更好的精度。这会将算法中第1步的复杂性降至O(log n)
。
答案 1 :(得分:1)
跳过列表的整个要点是不必遍历整个列表来查找项目。您首先在上面的列表中搜索,然后在一个级别上搜索,依此类推,直到您到达基本列表。
假设顶部列表包含2个项目,第一个项目和中间某个项目。当您搜索您的项目时,该列表已被削减一半。每个级别大约将列表减半。这就是插入O(log n)的原因。