3
3
https://epaperpress.com/sortsearch/download/skiplist.pdf
4
4
"""
5
5
6
- from typing import List , Tuple , Optional
6
+ from typing import List , Tuple , Optional , TypeVar , Generic
7
7
from random import random
8
8
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 ]] = []
9
18
10
- class Node :
11
19
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
+
12
28
return f"Node({ self .key } : { self .value } )"
13
29
14
30
@property
15
31
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
+
16
46
return len (self .forward )
17
47
18
- def __init__ (self , key , value ):
19
- self .key = key
20
- self .value = value
21
- self .forward : List [Node ] = []
22
48
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
23
55
24
- class SkipList :
25
56
def __str__ (self ):
26
57
items = list (self )
27
58
@@ -66,7 +97,7 @@ def random_level(self) -> int:
66
97
67
98
return level
68
99
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 ] ]]:
70
101
"""
71
102
:param key: Searched key,
72
103
: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]]:
76
107
# Nodes with refer or should refer to output node
77
108
update_vector = []
78
109
79
- node : Node = self .head
110
+ node = self .head
80
111
81
112
for i in reversed (range (self .level )):
82
113
# 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]]:
99
130
else :
100
131
return None , update_vector
101
132
102
- def delete (self , key ):
133
+ def delete (self , key : KT ):
103
134
"""
104
135
:param key: Key to remove from list.
105
136
@@ -109,7 +140,7 @@ def delete(self, key):
109
140
>>> skip_list.insert(3, "Three")
110
141
>>> list(skip_list)
111
142
[1, 2, 3]
112
- >>> skip_list.delete(2, )
143
+ >>> skip_list.delete(2)
113
144
>>> list(skip_list)
114
145
[1, 3]
115
146
"""
@@ -125,7 +156,7 @@ def delete(self, key):
125
156
else :
126
157
update_node .forward = update_node .forward [:i ]
127
158
128
- def insert (self , key , value ):
159
+ def insert (self , key : KT , value : VT ):
129
160
"""
130
161
:param key: Key to insert.
131
162
:param value: Value associated with given key.
@@ -162,7 +193,7 @@ def insert(self, key, value):
162
193
else :
163
194
update_node .forward [i ] = new_node
164
195
165
- def find (self , key ) :
196
+ def find (self , key : VT ) -> Optional [ VT ] :
166
197
"""
167
198
:param key: Search key.
168
199
:return: Value associated with given key or None if given key is not present.
@@ -182,11 +213,7 @@ def find(self, key):
182
213
if node is not None :
183
214
return node .value
184
215
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
190
217
191
218
192
219
def test_insert ():
0 commit comments