Skip to content

Commit 44dde92

Browse files
committed
Implement skip list using node levels
1 parent 53027c3 commit 44dde92

1 file changed

Lines changed: 60 additions & 23 deletions

File tree

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,74 @@
1+
import random
2+
3+
MAX_LEVEL = 4
4+
5+
6+
class Node:
7+
def __init__(self, value, level):
8+
self.value = value
9+
self.forward = [None] * level
10+
11+
112
class SkipList:
213
def __init__(self):
3-
self.items = []
14+
self.head = Node(None, MAX_LEVEL)
15+
self.level = 1
16+
17+
def _random_level(self):
18+
level = 1
19+
20+
while level < MAX_LEVEL and random.random() < 0.5:
21+
level += 1
22+
23+
return level
424

525
def insert(self, value):
6-
left = 0
7-
right = len(self.items)
26+
update = [None] * MAX_LEVEL
27+
current = self.head
828

9-
while left < right:
10-
mid = (left + right) // 2
29+
for i in range(self.level - 1, -1, -1):
30+
while (
31+
current.forward[i] is not None
32+
and current.forward[i].value < value
33+
):
34+
current = current.forward[i]
1135

12-
if self.items[mid] < value:
13-
left = mid + 1
14-
else:
15-
right = mid
36+
update[i] = current
1637

17-
self.items.insert(left, value)
38+
node_level = self._random_level()
1839

19-
def __contains__(self, value):
20-
left = 0
21-
right = len(self.items) - 1
40+
if node_level > self.level:
41+
for i in range(self.level, node_level):
42+
update[i] = self.head
43+
44+
self.level = node_level
2245

23-
while left <= right:
24-
mid = (left + right) // 2
46+
new_node = Node(value, node_level)
2547

26-
if self.items[mid] == value:
27-
return True
48+
for i in range(node_level):
49+
new_node.forward[i] = update[i].forward[i]
50+
update[i].forward[i] = new_node
51+
52+
def __contains__(self, value):
53+
current = self.head
2854

29-
if self.items[mid] < value:
30-
left = mid + 1
31-
else:
32-
right = mid - 1
55+
for i in range(self.level - 1, -1, -1):
56+
while (
57+
current.forward[i] is not None
58+
and current.forward[i].value < value
59+
):
60+
current = current.forward[i]
3361

34-
return False
62+
current = current.forward[0]
63+
64+
return current is not None and current.value == value
3565

3666
def to_list(self):
37-
return list(self.items)
67+
result = []
68+
current = self.head.forward[0]
69+
70+
while current is not None:
71+
result.append(current.value)
72+
current = current.forward[0]
73+
74+
return result

0 commit comments

Comments
 (0)