跳跃列表

✍ dations ◷ 2025-02-23 14:08:22 #数据结构,概率性数据结构

在计算机科学中,跳跃列表是一种数据结构。它使得包含n个元素的有序序列的查找和插入操作的平均时间复杂度都是 O ( log n ) {\displaystyle O(\log n)} ,优于数组的 O ( n ) {\displaystyle O(n)} 复杂度。

快速的查询效果是通过维护一个多层次的链表实现的,且与前一层(下面一层)链表元素的数量相比,每一层链表中的元素的数量更少(见右下角示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。跳过的元素的方法可以是随机性选择或确定性选择,其中前者更为常见。

跳跃列表是按层建造的。底层是一个普通的有序链表。每个更高层都充当下面列表的“快速通道”,这里在第 i {\displaystyle i} 层中的元素按某个固定的概率 p {\displaystyle p} (通常为 1 2 {\displaystyle {\frac {1}{2}}} 1 4 {\displaystyle {\frac {1}{4}}} )出现在第 i + 1 {\displaystyle i+1} 层中。每个元素平均出现在 1 1 p {\displaystyle {\frac {1}{1-p}}} 个列表中,而最高层的元素(通常是在跳跃列表前端的一个特殊的头元素)在 log 1 / p n {\displaystyle \log _{1/p}n} 个列表中出现。

在查找目标元素时,从顶层列表、头元素起步。算法沿着每层链表搜索,直至找到一个大于或等于目标的元素,或者到达当前层列表末尾。如果该元素等于目标元素,则表明该元素已被找到;如果该元素大于目标元素或已到达链表末尾,则退回到当前层的上一个元素,然后转入下一层进行搜索。每层链表中预期的查找步数最多为 1 p {\displaystyle {\frac {1}{p}}} ,而层数为 log 1 / p n {\displaystyle \log _{1/p}n} ,所以查找的总体步数为 log p n p {\displaystyle -{\frac {\log _{p}n}{p}}} ,由于 p {\displaystyle p} 是常数,查找操作总体的时间复杂度为 O ( log n ) {\displaystyle {\mathcal {O}}(\log n)\,} 。而通过选择不同 p {\displaystyle p} 值,就可以在查找代价和存储代价之间获取平衡。

跳跃列表不像平衡树等数据结构那样提供对最坏情况的性能保证:由于用来建造跳跃列表采用随机选取元素进入更高层的方法,在小概率情况下会生成一个不平衡的跳跃列表(最坏情况例如最底层仅有一个元素进入了更高层,此时跳跃列表的查找与普通列表一致)。但是在实际中它通常工作良好,随机化平衡方案也比平衡二叉查找树等数据结构中使用的确定性平衡方案容易实现。跳跃列表在并行计算中也很有用:插入可以在跳跃列表不同的部分并行地进行,而不用对数据结构进行全局的重新平衡。

因为跳跃列表中的元素可以在多个列表中,所以每个元素可以有多于一个指针。

跳跃列表的插入和删除的实现与普通的链表操作类似,但高层元素必须在进行多个链表中进行插入或删除。

跳跃列表的最坏时间性能具有一定随机性,但是可以通过时间复杂度为 O ( n ) {\displaystyle {\mathcal {O}}(n)} 的遍历操作(例如在打印列表全部内容时)以无随机的算法重整列表的结构,从而使跳跃列表的实际查找时间复杂度尽量符合理论平均值 O ( log n ) {\displaystyle {\mathcal {O}}(\log n)}

除了使用无随机算法之外,我们可以以下面的准随机方式地生成每一层:

make all nodes level 1j ← 1while the number of nodes at level j > 1 do  for each i'th node at level j do    if i is odd       if i is not the last node at level j        randomly choose whether to promote it to level j+1      else        do not promote      end if    else if i is even and node i-1 was not promoted      promote it to level j+1    end if  repeat  j ← j + 1repeat

类似无随机版本,准随机重整仅在需要执行一个 O ( n ) {\displaystyle {\mathcal {O}}(n)} 操作(访问每个节点)的时候伴随进行。

跳跃列表由威廉·普(英语:William Pugh)发明。发明者对跳跃列表的评价是:“跳跃列表是在很多应用中有可能替代平衡树而作为实现方法的一种数据结构。跳跃列表的算法有同平衡树一样的渐进的预期时间边界,并且更简单、更快速和使用更少的空间。”

相关

  • 西爪龙西爪龙属(学名:Hesperonychus)属于驰龙科,是种小型肉食性恐龙。化石发现于加拿大亚伯达省的恐龙公园组,年代为白垩纪晚期的坎潘阶,约7,650万年前。西爪龙的化石是一个部分骨盆,是在
  • 达府 small(来兴府)/small达府(泰语:จังหวัดตาก,皇家转写:Changwat Tak,泰语发音:)是泰国北方之一府 。邻近府城由北顺时针依序为:夜丰颂府、清迈府、南奔府、南邦府、素可泰府、北碧府、那空沙旺
  • 葡挞葡式蛋挞(葡萄牙语:pastel de nata“淡奶油(奶黄)糕点(葡萄牙语:Pastel (culinária))”或 pastel de Belém“贝伦区糕点(葡萄牙语:Pastel (culinária))”,复数形式分别为 pastéis d
  • 孟加拉国广播电台孟加拉国广播电台(孟加拉语:বাংলাদেশ বেতার;英语:Bangladesh Betar)是孟加拉国的国营广播电台,总部位于孟加拉国首都达卡。1939年,全印广播电台(AIR)在当时属于英属印度
  • 加藤和树加藤和树(1984年10月7日-)是日本男歌手与演员、声优。出生于日本爱知县名古屋市,身高181公分,体重65公斤,血型A型。在2006年出演《假面骑士KABUTO》及2007年的《魚干女又怎样/ホタ
  • 安提利亚安提利亚(Antillia)是中世纪晚期欧洲人虚构出来的一个幽灵群岛。构想中,安提利亚位于西班牙以西的大西洋,西非加那利群岛及亚洲的中间,更曾有人绘出虚构的地图标识它的位置。亚里
  • 苏赫巴托尔·巴特包勒德苏赫巴托尔·巴特包勒德(蒙古语:Сүхбаатарын Батболд,1963年6月24日-)蒙古族,出生于乌兰巴托市,蒙古国政治家。1980年,巴特包勒德毕业于首都第14学校。1986年,巴特
  • 陈邦宪陈邦宪(1914年-1968年4月15日),江苏嘉定县钱门乡人,中华人民共和国医学家。在民国期间任上海市卫生局防疫处长,并同时被提升为副教授。而在共和国期间他出任过上海仁济医院医务院
  • 山姆·莱克山姆·莱克(英语:Sam Lake,1970年6月18日-),本名萨米·耶尔维(芬兰语:Sami Järvi,芬兰语单词Järvi和英语单词Lake的意思都是“湖”),芬兰作家,主要以为《马克思·佩恩》系列游戏编剧而
  • 施佩赫山坐标:46°00′44″N 8°00′04″E / 46.012165°N 8.001089°E / 46.012165; 8.001089施佩赫山(意大利语:Pizzo d'Antigine),是南欧的山峰,位于瑞士和意大利接壤的边境,属于本宁阿