defsearch(self, key):
current = self.head
# 从最高层向下搜索for i inrange(self.level - 1, -1, -1):
# 在当前层向前移动,直到下一个节点为空或键大于等于目标while current.forward[i] and current.forward[i].key < key:
current = current.forward[i]
# 到达第0层,检查目标节点
current = current.forward[0]
if current and current.key == key:
return current.value
returnNone
import random
classSkipListNode:
def__init__(self, key, value, level):
self.key = key
self.value = value
self.forward = [None] * level
@propertydeflevel(self):
returnlen(self.forward)
classSkipList:
def__init__(self, max_level=16, p=0.5):
self.max_level = max_level
self.p = p
self.level = 0self.head = SkipListNode(None, None, max_level)
self._size = 0def_random_level(self):
level = 1while random.random() < self.p and level < self.max_level:
level += 1return level
defsearch(self, key):
current = self.head
for i inrange(self.level - 1, -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 current.value
returnNonedefinsert(self, key, value):
update = [None] * self.max_level
current = self.head
for i inrange(self.level - 1, -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 and current.key == key:
current.value = value
return
new_level = self._random_level()
if new_level > self.level:
for i inrange(self.level, new_level):
update[i] = self.head
self.level = new_level
new_node = SkipListNode(key, value, new_level)
for i inrange(new_level):
new_node.forward[i] = update[i].forward[i]
update[i].forward[i] = new_node
self._size += 1defdelete(self, key):
update = [None] * self.max_level
current = self.head
for i inrange(self.level - 1, -1, -1):
while (current.forward[i] and
current.forward[i].key < key):
current = current.forward[i]
update[i] = current
current = current.forward[0]
ifnot current or current.key != key:
returnFalsefor i inrange(current.level):
update[i].forward[i] = current.forward[i]
while (self.level > 0andself.head.forward[self.level - 1] isNone):
self.level -= 1self._size -= 1returnTruedefdisplay(self):
print("Skip List (level=", self.level,
", size=", self._size, "):", sep="")
level_labels = []
for i inrange(self.level):
nodes = []
cur = self.head.forward[i]
while cur:
nodes.append(str(cur.key))
cur = cur.forward[i]
level_labels.append(f" Level {i}: " + " -> ".join(nodes))
for line inreversed(level_labels):
print(line)
def__len__(self):
returnself._size
def__contains__(self, key):
returnself.search(key) isnotNonedefrange_query(self, low, high):
"""返回键在 [low, high] 范围内的所有 (key, value) 对"""
result = []
current = self.head
for i inrange(self.level - 1, -1, -1):
while (current.forward[i] and
current.forward[i].key < low):
current = current.forward[i]
current = current.forward[0]
while current and current.key <= high:
result.append((current.key, current.value))
current = current.forward[0]
return result