Skip to content

Commit c7f0472

Browse files
author
Artur Parowicz
committed
Add missing type hints and doctests
1 parent 7beee46 commit c7f0472

File tree

1 file changed

+45
-18
lines changed

1 file changed

+45
-18
lines changed

data_structures/linked_list/skip_list.py

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,56 @@
33
https://epaperpress.com/sortsearch/download/skiplist.pdf
44
"""
55

6-
from typing import List, Tuple, Optional
6+
from typing import List, Tuple, Optional, TypeVar, Generic
77
from random import random
88

9+
KT = TypeVar("KT")
10+
VT = TypeVar("VT")
11+
12+
13+
class Node(Generic[KT, VT]):
14+
def __init__(self, key: KT, value: VT):
15+
self.key = key
16+
self.value = value
17+
self.forward: List[Node[KT, VT]] = []
918

10-
class Node:
1119
def __repr__(self):
20+
"""
21+
:return: Visual representation of Node
22+
23+
>>> node = Node("Key", 2)
24+
>>> repr(node)
25+
'Node(Key: 2)'
26+
"""
27+
1228
return f"Node({self.key}: {self.value})"
1329

1430
@property
1531
def level(self) -> int:
32+
"""
33+
:return: Number of forward references
34+
35+
>>> node = Node("Key", 2)
36+
>>> node.level
37+
0
38+
>>> node.forward.append(Node("Key2", 4))
39+
>>> node.level
40+
1
41+
>>> node.forward.append(Node("Key3", 6))
42+
>>> node.level
43+
2
44+
"""
45+
1646
return len(self.forward)
1747

18-
def __init__(self, key, value):
19-
self.key = key
20-
self.value = value
21-
self.forward: List[Node] = []
2248

49+
class SkipList(Generic[KT, VT]):
50+
def __init__(self, p: float = 0.5, max_level: int = 16):
51+
self.head: Node = Node("root", None)
52+
self.level: int = 0
53+
self.p = p
54+
self.max_level = max_level
2355

24-
class SkipList:
2556
def __str__(self):
2657
items = list(self)
2758

@@ -66,7 +97,7 @@ def random_level(self) -> int:
6697

6798
return level
6899

69-
def _locate_node(self, key) -> Tuple[Optional[Node], List[Node]]:
100+
def _locate_node(self, key) -> Tuple[Optional[Node[KT, VT]], List[Node[KT, VT]]]:
70101
"""
71102
:param key: Searched key,
72103
:return: Tuple with searched node (or None if given key is not present)
@@ -76,7 +107,7 @@ def _locate_node(self, key) -> Tuple[Optional[Node], List[Node]]:
76107
# Nodes with refer or should refer to output node
77108
update_vector = []
78109

79-
node: Node = self.head
110+
node = self.head
80111

81112
for i in reversed(range(self.level)):
82113
# i < node.level - When node level is lesser than `i` decrement `i`.
@@ -99,7 +130,7 @@ def _locate_node(self, key) -> Tuple[Optional[Node], List[Node]]:
99130
else:
100131
return None, update_vector
101132

102-
def delete(self, key):
133+
def delete(self, key: KT):
103134
"""
104135
:param key: Key to remove from list.
105136
@@ -109,7 +140,7 @@ def delete(self, key):
109140
>>> skip_list.insert(3, "Three")
110141
>>> list(skip_list)
111142
[1, 2, 3]
112-
>>> skip_list.delete(2,)
143+
>>> skip_list.delete(2)
113144
>>> list(skip_list)
114145
[1, 3]
115146
"""
@@ -125,7 +156,7 @@ def delete(self, key):
125156
else:
126157
update_node.forward = update_node.forward[:i]
127158

128-
def insert(self, key, value):
159+
def insert(self, key: KT, value: VT):
129160
"""
130161
:param key: Key to insert.
131162
:param value: Value associated with given key.
@@ -162,7 +193,7 @@ def insert(self, key, value):
162193
else:
163194
update_node.forward[i] = new_node
164195

165-
def find(self, key):
196+
def find(self, key: VT) -> Optional[VT]:
166197
"""
167198
:param key: Search key.
168199
:return: Value associated with given key or None if given key is not present.
@@ -182,11 +213,7 @@ def find(self, key):
182213
if node is not None:
183214
return node.value
184215

185-
def __init__(self, p: float = 0.5, max_level: int = 16):
186-
self.head = Node("root", None)
187-
self.level = 0
188-
self.p = p
189-
self.max_level = max_level
216+
return None
190217

191218

192219
def test_insert():

0 commit comments

Comments
 (0)