Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跳过列表,为什么我们需要多个插入?_C++_List_Algorithm_Skip Lists - Fatal编程技术网

C++ 跳过列表,为什么我们需要多个插入?

C++ 跳过列表,为什么我们需要多个插入?,c++,list,algorithm,skip-lists,C++,List,Algorithm,Skip Lists,我在学习,但有些东西我不明白 当我们插入一个新节点时,我们抛出一枚硬币,如果我们得到1,我们在上层再插入一次节点,以此类推,直到我们得到0,我们停止 但是为什么我们需要这个呢?如果只在跳过列表中添加一个层,就会得到一个有序的链表,其中每个节点都连接到下一个节点 跳过列表中的额外层用于有效地搜索其中的值,将搜索时间从O(n)缩短到O(logn) 由于只有一个“常规”有序链接列表(没有额外的层),您平均需要~n/2次迭代才能找到值是否存在 如果您添加一个层,您将需要其中的一半,这意味着~n/4次迭

我在学习,但有些东西我不明白

当我们插入一个新节点时,我们抛出一枚硬币,如果我们得到1,我们在上层再插入一次节点,以此类推,直到我们得到0,我们停止


但是为什么我们需要这个呢?

如果只在跳过列表中添加一个层,就会得到一个有序的链表,其中每个节点都连接到下一个节点

跳过列表中的额外层用于有效地搜索其中的值,将搜索时间从
O(n)
缩短到
O(logn)

  • 由于只有一个“常规”有序链接列表(没有额外的层),您平均需要~n/2次迭代才能找到值是否存在
  • 如果您添加一个层,您将需要其中的一半,这意味着~n/4次迭代
  • 如果添加两个层,则需要之前迭代的一半,或~n/8次平均迭代
(以上是一种简化,因为您还需要遍历下一个级别,但它们的复杂性与顶层类似)


通过将此过程一直延续到顶部,您将需要每层平均
O(1)
迭代次数,从而获得
O(logn)
总查找时间。

这个问题听起来很像“为什么跳过列表的结构类似于跳过列表?”这是一个重言式的问题。您是否在问“跳过列表有什么意义?”您可以在连续数组上执行二进制搜索,但不能在链表上执行。这就是链表要获得这种能力所需要做的。插入时的随机“投币”似乎是一种在大约一半时间内选择拆分的方法,而不会像平衡的红黑树那样带来成本复杂性。跳过列表的实现细节相当好地解释了投币促销背后的原因。简而言之,翻转的随机性是将数据结构构建为伪平衡的。如果不进行额外的插入,将不会在跳过列表中跳过。