跳过列表的预期空间消耗

时间:2012-05-06 15:08:52

标签: data-structures space-complexity skip-lists

插入n个元素后,跳过列表使用的预期空间是什么?

我预计在最坏的情况下,空间消耗可能无限增长。

维基百科说“Space O(n)”。

如何以某种方式证明这一点?

3 个答案:

答案 0 :(得分:3)

根据我发现维基百科更可靠的this thesis维基百科错误。概率性跳过列表是Theta(nlogn)最坏情况下的空间复杂度。

  

尽管平均而言PSL的表现相当不错,   在最坏的情况下,它的Theta(n lg n)空间和Theta(n)时间复杂度是   高得令人无法接受

最糟糕的情况并非无限,因为您可以将自己限制在f(n)列表中f(n) = O(logn),并在达到此高度时停止翻转硬币。因此,如果您有f(n)个完整行,则会得到O(nlogn)个节点总数,因此这种情况下的空间复杂度为O(nlogn),而不是O(n)


修改
如果您正在寻找预期空间消费,而不是最初在问题中说明的最差
我们用'34'栏来表示"作为底层节点和所有节点" up"从它。

E(#nodes) = Sigma(E(#nodes_for_column_i)) (i in [1,n]) 

上述等式是正确的,因为预期值的线性。

E(#nodes_for_column_i) = 1 + 1/2 + ... + 1/n < 2(每个我)。这是因为概率1它有1个节点,p = 1/2,每个节点都有一个额外的节点。使用p&#39; = 1/2,每个节点都有一个额外的节点(总p * p&#39; = 1/4),....因此我们可以推导出:

E(#nodes) = n*E(#nodes_for_each_column) = n*(1+1/2+...+1/n) < 2n = O(n)

答案 1 :(得分:0)

让我们拥有N个节点的确定性跳转列表。除数据值外,list还包含:

1级N指针,2级N / 2指针,3级N / 4指针等等......

N + N / 2 + N / 4 + N / 8 + .. N / 2 ^ k 是几何级数之和,其极限是2N,因此最大内存消耗为N * SizeOf(数据)+ 2 * N * SizeOf(指针)= O(N)。

我没有考虑到层间链接,但它们的计数与指针计数有关。

答案 2 :(得分:0)

预期的空间复杂度

“跳过列表”具有logn层。跳过列表中的每个元素都显示在一个或多个层中。为了测量“跳过列表”的预期空间复杂度,我们可以评估任意元素x出现在其中的预期层数。

我们知道x有100%的机会仅出现在底层,有50%的机会出现在底层和第二底层,有25%的机会出现在底层3层,12.5%出现在底部4层的机会,依此类推。

从数学上讲,我们可以如下表示x出现的预期层数...

Sum(i / 2^(i-1)) from i=1 to logn

...,其中i是x可能出现的层数。

直觉上,我们可以看到上述求和收敛为一个常数,因为分母的增长速度快于分子。您可以通过将方程式插入Wolfram Alpha来验证这一点(对于非常大的n值,总和收敛为4)。这意味着...

[Sum(i / 2^(i-1)) from i=1 to logn] = O(1)

因此,我们证明了在任意跳过列表内存储任意元素平均需要恒定的空间。为了获得在跳过列表中存储n元素的空间复杂度,我们只需乘以n

n*O(1) = O(n)

因此,跳过列表具有线性的预期空间复杂度。


最坏情况下的空间复杂度

这实际上要容易得多。我们知道有logn层和n元素。在最坏的情况下,每个元素都在每个层中。因此,O(nlogn)