插入n个元素后,跳过列表使用的预期空间是什么?
我预计在最坏的情况下,空间消耗可能无限增长。
维基百科说“Space O(n)”。
如何以某种方式证明这一点?
答案 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)
。