Skip to content

Commit 061987c

Browse files
committed
implemented skip list
1 parent cf9e042 commit 061987c

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import random
2+
3+
4+
class _Node:
5+
def __init__(self, value, level):
6+
self.value = value
7+
# forward[i] is the next node at level i
8+
self.forward = [None] * (level + 1)
9+
10+
11+
class SkipList:
12+
MAX_LEVEL = 16
13+
P = 0.5 # probability for level increase
14+
15+
def __init__(self):
16+
# head is a dummy node with no value but MAX_LEVEL pointers
17+
self.head = _Node(None, self.MAX_LEVEL)
18+
self.level = 0 # current highest level in use
19+
self.size = 0
20+
21+
def _random_level(self):
22+
lvl = 0
23+
while random.random() < self.P and lvl < self.MAX_LEVEL:
24+
lvl += 1
25+
return lvl
26+
27+
def insert(self, value):
28+
"""Insert value in sorted order."""
29+
update = [None] * (self.MAX_LEVEL + 1)
30+
current = self.head
31+
32+
# 1) Search for position from top level down
33+
for lvl in range(self.level, -1, -1):
34+
while current.forward[lvl] is not None and current.forward[lvl].value < value:
35+
current = current.forward[lvl]
36+
update[lvl] = current
37+
38+
# 2) Check if already present -> do nothing
39+
next_node = current.forward[0]
40+
if next_node is not None and next_node.value == value:
41+
return
42+
43+
# 3) Choose random level for new node
44+
new_level = self._random_level()
45+
if new_level > self.level:
46+
for i in range(self.level + 1, new_level + 1):
47+
update[i] = self.head
48+
self.level = new_level
49+
50+
# 4) Insert node, fixing pointers at each level
51+
new_node = _Node(value, new_level)
52+
for i in range(new_level + 1):
53+
new_node.forward[i] = update[i].forward[i]
54+
update[i].forward[i] = new_node
55+
56+
self.size += 1
57+
58+
def __contains__(self, value):
59+
"""Implements `value in sl` using fast skip-list search."""
60+
current = self.head
61+
for lvl in range(self.level, -1, -1):
62+
while current.forward[lvl] is not None and current.forward[lvl].value < value:
63+
current = current.forward[lvl]
64+
current = current.forward[0]
65+
return current is not None and current.value == value
66+
67+
def to_list(self):
68+
"""Return all values in sorted order from the bottom level."""
69+
result = []
70+
current = self.head.forward[0]
71+
while current is not None:
72+
result.append(current.value)
73+
current = current.forward[0]
74+
return result

0 commit comments

Comments
 (0)