跳表(Skip List)是一种概率性数据结构,它允许快速查询一个有序连续元素的数据链表。跳表的平均查找、插入和删除时间复杂度都是O(log n),这使得它成为一种非常高效的数据结构,尤其是在需要快速访问、插入和删除元素的场景中。
跳表通过在原始链表的基础上增加多层索引链表来实现快速访问。每一层索引链表都是原始链表的一个“快车道”,可以跳过多个节点,从而加快查找速度。最底层是一个普通的有序链表,而每一层向上都是下一层的“快速通道”,包含部分节点的引用。
跳表主要分为以下几种类型:
import random
class Node:
def __init__(self, key, level):
self.key = key
self.forward = [None] * (level + 1)
class SkipList:
def __init__(self, max_lvl, P):
self.MAXLVL = max_lvl
self.P = P
self.header = self.createNode(self.MAXLVL, -1)
self.level = 0
def createNode(self, lvl, key):
n = Node(key, lvl)
return n
def randomLevel(self):
lvl = 0
while random.random() < self.P and lvl < self.MAXLVL:
lvl += 1
return lvl
def insert(self, key):
update = [None] * (self.MAXLVL + 1)
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].key < key:
current = current.forward[i]
update[i] = current
current = current.forward[0]
if current is None or current.key != key:
rlevel = self.randomLevel()
if rlevel > self.level:
for i in range(self.level + 1, rlevel + 1):
update[i] = self.header
self.level = rlevel
n = self.createNode(rlevel, key)
for i in range(rlevel + 1):
n.forward[i] = update[i].forward[i]
update[i].forward[i] = n
def delete(self, key):
update = [None] * (self.MAXLVL + 1)
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].key < key:
current = current.forward[i]
update[i] = current
current = current.forward[0]
if current is not None and current.key == key:
for i in range(self.level + 1):
if update[i].forward[i] != current:
break
update[i].forward[i] = current.forward[i]
while self.level > 0 and self.header.forward[self.level] is None:
self.level -= 1
def search(self, key):
current = self.header
for i in range(self.level, -1, -1):
while current.forward[i] and current.forward[i].key < key:
current = current.forward[i]
current = current.forward[0]
if current and current.key == key:
return True
return False
这个示例代码展示了如何实现一个基本的跳表,包括插入、删除和查找操作。
领取专属 10元无门槛券
手把手带您无忧上云