什么是跳跃列表?
跳跃列表是一种概率性的数据结构,旨在提高链表的搜索、插入和删除效率。它通过在普通链表的基础上增加多个层次,以实现更快的访问速度。跳跃列表的设计灵感来源于跳跃图(Skip Graph)和多层索引的概念,适合需要频繁进行动态数据操作的场景。
跳跃列表的基本结构
跳跃列表由多个层次的链表组成。最底层的链表包含所有的元素,而上层的链表则通过指针跳过一些节点,从而加快搜索速度。每个节点不仅存储自己的值,还持有一个指针数组,指向同层的下一个节点。
结构示例
- 头节点:通常存储负无穷,方便搜索。
- 节点:每个节点包含一个值和多个指针,指向相同或更高层的节点。
操作实现
1. 节点类
首先定义节点类,包含节点的值和指针数组。
class Node:def __init__(self, value, level):self.value = valueself.forward = [None] * (level + 1) # 指针数组
2. 跳跃列表类
实现跳跃列表类,包含插入、删除和搜索的方法。
import randomclass SkipList:def __init__(self, max_level):self.max_level = max_levelself.header = Node(float('-inf'), max_level) # 头节点self.level = 0 # 当前层数def random_level(self):level = 0while random.random() < 0.5 and level < self.max_level:level += 1return leveldef insert(self, value):update = [None] * (self.max_level + 1) # 保存前驱节点current = self.headerfor i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]update[i] = currentcurrent = current.forward[0] # 最底层的下一个节点if current is None or current.value != value:new_level = self.random_level() # 随机层数if new_level > self.level:for i in range(self.level + 1, new_level + 1):update[i] = self.headerself.level = new_levelnew_node = Node(value, new_level) # 新节点for i in range(new_level + 1):new_node.forward[i] = update[i].forward[i]update[i].forward[i] = new_nodedef delete(self, value):update = [None] * (self.max_level + 1)current = self.headerfor i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]update[i] = currentcurrent = current.forward[0]if current and current.value == value:for i in range(self.level + 1):if update[i].forward[i] != current:breakupdate[i].forward[i] = current.forward[i]while self.level > 0 and self.header.forward[self.level] is None:self.level -= 1def search(self, value):current = self.headerfor i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]current = current.forward[0]return current is not None and current.value == value
示例使用
skip_list = SkipList(max_level=4)
skip_list.insert(3)
skip_list.insert(6)
skip_list.insert(7)
skip_list.insert(9)
skip_list.insert(12)
skip_list.insert(19)print(skip_list.search(7)) # True
print(skip_list.search(15)) # Falseskip_list.delete(3)
print(skip_list.search(3)) # False
时间复杂度分析
- 搜索 (Search): 平均时间复杂度为 O(log n),因其可以在多层中快速跳跃。
- 插入 (Insert): 平均时间复杂度也是 O(log n),通过随机选择层数实现高效插入。
- 删除 (Delete): 平均时间复杂度同样为 O(log n)。
最坏情况
在最坏情况下,所有元素都在同一层,此时时间复杂度为 O(n)。不过这种情况的概率较低,跳跃列表在实际应用中通常表现良好。
总结
跳跃列表是一种高效的概率性数据结构,适合动态数据的处理。通过引入随机性,跳跃列表在搜索、插入和删除操作中都能实现平均 O(log n) 的时间复杂度,成为解决许多实际问题的优秀选择。
如果你对跳跃列表有更多的疑问或想要进一步探讨的内容,欢迎在评论区留言!