Scheme 语言 实战 跳表 Skip List 实现有序列表快速查找

Scheme阿木 发布于 8 天前 4 次阅读


跳表(Skip List)实现有序列表快速查找

跳表(Skip List)是一种数据结构,它通过在链表的基础上增加多级索引来提高查找效率。跳表结合了平衡二叉搜索树和链表的优点,能够在对数时间内完成查找、插入和删除操作。本文将围绕跳表实现有序列表快速查找这一主题,详细介绍跳表的数据结构、算法原理以及Python代码实现。

跳表的数据结构

跳表由多个层组成,每一层都是一个有序链表。最底层是完整的有序链表,而上面的每一层都是下一层的子集。每一层的节点数量是下一层的一半,这样可以保证跳表的高度保持在对数级别。

跳表的数据结构如下:

python
class Node:
def __init__(self, value, level):
self.value = value
self.forward = [None] (level + 1)

class SkipList:
def __init__(self, max_level, p):
self.max_level = max_level
self.p = p
self.header = Node(-1, max_level)
self.level = 0

def random_level(self):
level = 0
while random.random() < self.p and level < self.max_level:
level += 1
return level

def insert(self, value):
update = [None] (self.max_level + 1)
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].value self.level:
for i in range(self.level + 1, new_level + 1):
update[i] = self.header
self.level = new_level
new_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_node

def delete(self, value):
update = [None] (self.max_level + 1)
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].value 0 and self.header.forward[self.level] is None:
self.level -= 1

def search(self, value):
current = self.header
for 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]
if current and current.value == value:
return True
return False

跳表的算法原理

1. 初始化:创建一个跳表,包含一个头节点,头节点的所有指针都指向None。
2. 插入:
- 从头节点开始,逐层向下查找,直到找到第一个大于待插入值的节点。
- 记录下每一层的节点,以便在插入新节点时更新指针。
- 如果找到的节点值等于待插入值,则不插入。
- 否则,随机生成一个新节点层数,并创建新节点。
- 更新指针,将新节点插入到跳表中。
3. 删除:
- 从头节点开始,逐层向下查找,直到找到待删除值。
- 记录下每一层的节点,以便在删除节点时更新指针。
- 如果找到的节点值等于待删除值,则更新指针,删除节点。
4. 查找:
- 从头节点开始,逐层向下查找,直到找到第一个大于待查找值的节点。
- 如果找到的节点值等于待查找值,则返回True。
- 否则,返回False。

跳表的Python代码实现

以下是一个简单的跳表Python代码实现:

python
import random

class Node:
def __init__(self, value, level):
self.value = value
self.forward = [None] (level + 1)

class SkipList:
def __init__(self, max_level, p):
self.max_level = max_level
self.p = p
self.header = Node(-1, max_level)
self.level = 0

def random_level(self):
level = 0
while random.random() < self.p and level < self.max_level:
level += 1
return level

def insert(self, value):
update = [None] (self.max_level + 1)
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].value self.level:
for i in range(self.level + 1, new_level + 1):
update[i] = self.header
self.level = new_level
new_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_node

def delete(self, value):
update = [None] (self.max_level + 1)
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].value 0 and self.header.forward[self.level] is None:
self.level -= 1

def search(self, value):
current = self.header
for 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]
if current and current.value == value:
return True
return False

测试跳表
skip_list = SkipList(3, 0.5)
skip_list.insert(3)
skip_list.insert(6)
skip_list.insert(7)
skip_list.insert(9)
skip_list.insert(12)
skip_list.insert(19)
skip_list.insert(17)
skip_list.insert(26)
skip_list.insert(21)
skip_list.insert(25)

print("Search 7:", skip_list.search(7)) True
print("Search 5:", skip_list.search(5)) False
print("Delete 7:", skip_list.delete(7)) True
print("Search 7:", skip_list.search(7)) False

总结

本文介绍了跳表的数据结构、算法原理以及Python代码实现。跳表是一种高效的数据结构,能够在对数时间内完成查找、插入和删除操作。在实际应用中,跳表可以用于实现有序列表、数据库索引等场景。希望本文能帮助读者更好地理解跳表及其应用。