我是否正确地说,如果事先知道'n'(要存储的元素数量),像数组一样的跳过列表会非常有效吗?
跳过列表的最大级别是(log n + 1)
,因为在创建跳过列表之前我需要知道maxlevel,这意味着我应该知道要存储的元素数量是多少。 / p>
答案 0 :(得分:1)
在创建跳过列表之前,您不需要知道跳过列表的最大级别,只要您准备动态调整其大小正好为maxlevel
的头部的大小。由于maxlevel
约为log N
,因此很少调整头部的大小,当它确实发生时,它只涉及很少的工作。如果你真的想要避免这种情况,你最初可以创建一个容量足以容纳整个可用存储空间的磁头,但如果你的大多数跳过列表只有几百个元素,这将浪费空间。
这一切都有效,因为跳过列表的搜索过程从未向上移动;只有下来。因此,插入比任何现有节点更高级别的新节点不需要修改除头部之外的任何现有节点,必须将其修改为指向最高级别的新节点。 (否则,新级别将毫无用处。)
作为一个奇怪的实现细节,没有必要存储节点的大小;节点指向级别i
的事实足以证明该节点至少具有i
级别,因此永远不需要将i
与大小相比较{{1}}节点。只需知道头部的大小。
答案 1 :(得分:0)
maxlevel可以动态增加。
将maxlevel=2^(n-1)
用于第一个(2 ^ n-1)个节点。当2 ^ n节点到来时,它被分配level=2^n
,接下来的2 ^ n ... 2 ^(n + 1)个节点使用maxlevel=2^n
。