【问题标题】:Don't skip lists have the same limitation as arrays?不要跳过列表与数组有相同的限制吗?
【发布时间】:2013-04-26 04:03:29
【问题描述】:

如果事先知道“n”(要存储的元素数),我会说得对吗?

跳过列表的最大级别是(log n + 1),因为我需要在创建跳过列表之前知道最大级别,这意味着我应该知道要存储的元素数量。

【问题讨论】:

  • 跳过列表的一个很好的特性是可以动态增加最大级别。
  • 现在这和动态改变数组大小不一样吗?
  • 当然,虽然重新分配对于跳过列表只是对数,而不是对于数组是线性的。 n 的相对较低的值将涵盖所有实际情况。例如,对于p = 0.5n = 64 的值对于 64 位处理器将绰绰有余。您需要几个世纪才能生成足够的数据来填充 64 位地址空间。

标签: algorithm list data-structures skip-lists


【解决方案1】:

maxlevel 可以动态增加。

对前 (2^n-1) 个节点使用 maxlevel=2^(n-1)。当第2^n个节点来时,分配level=2^n,接下来的2^n...2^(n+1)个节点使用maxlevel=2^n

【讨论】:

    【解决方案2】:

    您不需要在创建跳过列表之前知道它的最大级别,只要您准备动态调整头部大小,其大小正好是maxlevel。因为maxlevel 大约是log N,调整头部大小很少发生,当它发生时,它涉及的工作很少。如果您真的想避免这种情况,您最初可以创建一个容量足以容纳整个可用存储空间的磁头,尽管如果您的大多数跳过列表都是几百个元素,那么这将浪费空间。

    这一切都有效,因为跳过列表的搜索过程永远不会向上移动;只有下来。所以插入一个比任何现有节点更高级别的新节点不需要修改任何现有节点,除了head,必须修改为指向新节点的最高级别。 (否则,新的关卡就没用了。)

    作为一个奇怪的实现细节,没有必要存储节点的大小;一个节点指向i 级别的事实足以证明该节点至少具有i 级别,因此无需将i 与节点的大小进行比较。只需要知道头部的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2021-06-30
      • 2017-03-10
      • 2015-07-25
      • 2015-09-11
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多