Skip to content

Commit 2263473

Browse files
committed
implement skip list
1 parent 134e683 commit 2263473

1 file changed

Lines changed: 71 additions & 0 deletions

File tree

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import random
2+
3+
4+
class Node:
5+
def __init__(self, value, level):
6+
self.value = value
7+
self.next = [None] * (level + 1) # next[i] the next node at level i
8+
9+
10+
class SkipList:
11+
MAX_LEVEL = 16
12+
P = 0.5
13+
14+
def __init__(self):
15+
self.head = Node(None, self.MAX_LEVEL)
16+
self.level = 0 # highest level currently in use
17+
18+
def _random_level(self):
19+
lvl = 0
20+
while random.random() < self.P and lvl < self.MAX_LEVEL:
21+
lvl += 1
22+
return lvl
23+
24+
def insert(self, value):
25+
update = [None] * (self.MAX_LEVEL + 1)
26+
x = self.head
27+
28+
# Find the place where the new value should go
29+
for i in range(self.level, -1, -1):
30+
while x.next[i] and x.next[i].value < value:
31+
x = x.next[i]
32+
update[i] = x
33+
34+
x0 = x.next[0]
35+
if x0 and x0.value == value:
36+
return
37+
38+
node_level = self._random_level()
39+
40+
if node_level > self.level:
41+
for i in range(self.level + 1, node_level + 1):
42+
update[i] = self.head
43+
self.level = node_level
44+
45+
new_node = Node(value, node_level)
46+
for i in range(node_level + 1):
47+
new_node.next[i] = update[i].next[i]
48+
update[i].next[i] = new_node
49+
50+
# Check if value exists
51+
def contains(self, value):
52+
x = self.head
53+
for lvl in range(self.level, -1, -1):
54+
while x.next[lvl] and x.next[lvl].value < value:
55+
x = x.next[lvl]
56+
57+
x = x.next[0]
58+
return x is not None and x.value == value
59+
60+
def __contains__(self, value):
61+
return self.contains(value)
62+
63+
def to_list(self):
64+
result = []
65+
x = self.head.next[0]
66+
while x:
67+
result.append(x.value)
68+
x = x.next[0]
69+
return result
70+
71+

0 commit comments

Comments
 (0)