【问题标题】:Insertion and removal time in a Skip List跳过列表中的插入和移除时间
【发布时间】:2012-08-27 05:11:02
【问题描述】:

我对从跳过列表中插入或删除元素所花费的时间有点困惑。

假设有一个高度为 H 的跳过列表,每个级别包含 n/2^i 个条目。
n = 键值对的总数
i = 跳过列表的级别 i

现在,根据理论,插入操作将执行以下操作
1. 查找密钥 2.插入此键
3.在基础级别以上的级别随机创建此条目。

让我们假设 Skip 列表是基于链表的。
第 1 步:应该采用 O(n)。
第 2 步:应该是 O(1)。
第 3 步:应该是 O(log n) 时间。我仍然对这个逻辑感到困惑,这将是下面问题的一部分

问题

  1. 基于以上事实,插入时间不应该是O(n) + O(1) + O(log n)吗? 忽略低阶项,它应该是 O(n) + O(log n)?

  2. 第 3 步再次应该花费 O(n) 时间来搜索要插入的密钥

书籍说插入跳过列表需要 O(log n) 时间。我一定遗漏了一些重要信息,请您帮助我对这个概念有一个很好的理解。

【问题讨论】:

    标签: algorithm insertion skip-lists


    【解决方案1】:

    由于跳过列表用于存储已排序的数据,因此在查找插入新元素的位置时,您可以执行比线性搜索更智能的操作。

    基本上,您可以使用更高级别的指针执行类似于二进制搜索的操作。例如,通过检查log n - 1th 级别的链接,您可以将新项目与列表中间的项目进行比较,从而确定它应该插入列表的前半部分还是后半部分。然后您继续这样,每次查看较低级别的链接以获得更好的精度。这将算法中步骤 1 的复杂度降低到 O(log n)

    【讨论】:

      【解决方案2】:

      跳过列表的全部意义在于不必遍历整个列表来查找项目。您首先在上面的列表中搜索,然后向下一层,依此类推,直到到达基本列表。

      假设顶部列表包含 2 个项目,第一个项目和一个位于中间的某个位置。当您搜索您的项目时,该列表已被减半。每个级别都会将列表大约减半。这就是插入 O(log n) 的原因。

      【讨论】:

      • 只是为了确认这意味着我们不能使用任何其他向量来实现同时执行的跳过列表?因为如果它是一个二维数组,我永远无法从更高级别获得插入位置的索引,而无需遍历每个项目。
      • 我不完全理解您的问题,但跳过列表是通过链表实现的。
      猜你喜欢
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2013-04-07
      • 2012-09-25
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多