@@ -26,7 +26,7 @@ import Foundation
26
26
27
27
// Stack from : https://github.com/raywenderlich/swift-algorithm-club/tree/master/Stack
28
28
public struct Stack < T> {
29
- fileprivate var array = [ T ] ( )
29
+ fileprivate var array : [ T ] = [ ]
30
30
31
31
public var isEmpty : Bool {
32
32
return array. isEmpty
@@ -62,53 +62,48 @@ extension Stack: Sequence {
62
62
63
63
private func coinFlip( ) -> Bool {
64
64
#if os(Linux)
65
- return random ( ) % 2 == 0
65
+ return random ( ) % 2 == 0
66
66
#elseif os(OSX)
67
- return arc4random_uniform ( 2 ) == 1
67
+ return arc4random_uniform ( 2 ) == 1
68
68
#endif
69
69
}
70
70
71
71
72
- // MARK: - Node
73
-
74
72
public class DataNode < Key: Comparable , Payload> {
75
73
public typealias Node = DataNode < Key , Payload >
76
74
77
75
var data : Payload ?
78
76
fileprivate var key : Key ?
79
- internal var next : Node ?
80
- internal var down : Node ?
77
+ var next : Node ?
78
+ var down : Node ?
81
79
82
80
public init ( key: Key , data: Payload ) {
83
81
self . key = key
84
82
self . data = data
85
83
}
86
84
87
- public init ( asHead head: Bool ) {
88
- }
85
+ public init ( asHead head: Bool ) { }
89
86
90
87
}
91
88
92
89
93
- // MARK: - Skip List
94
-
95
90
open class SkipList < Key: Comparable , Payload> {
96
91
public typealias Node = DataNode < Key , Payload >
97
92
98
93
fileprivate( set) var head : Node ?
99
94
100
- public init ( ) { }
95
+ public init ( ) { }
101
96
102
97
}
103
98
104
99
105
100
106
- // MARK: - Searching
101
+ // MARK: - Search lanes for a node with a given key
107
102
108
103
extension SkipList {
109
104
110
- internal func findNode( key: Key ) -> Node ? {
111
- var currentNode : Node ? = self . head
105
+ func findNode( key: Key ) -> Node ? {
106
+ var currentNode : Node ? = head
112
107
var isFound : Bool = false
113
108
114
109
while !isFound {
@@ -117,7 +112,7 @@ extension SkipList {
117
112
switch node. next {
118
113
case . none:
119
114
120
- currentNode = node. down
115
+ currentNode = node. down
121
116
case . some( let value) where value. key != nil :
122
117
123
118
if value. key == key {
@@ -149,26 +144,26 @@ extension SkipList {
149
144
150
145
}
151
146
152
- internal func search( key: Key ) -> Payload ? {
153
- guard let node = self . findNode ( key: key) else {
147
+ func search( key: Key ) -> Payload ? {
148
+ guard let node = findNode ( key: key) else {
154
149
return nil
155
150
}
156
151
157
152
return node. next!. data
158
153
}
159
-
154
+
160
155
}
161
156
162
157
163
158
164
- // MARK: - Inserting
159
+ // MARK: - Insert a node into lanes depending on skip list status ( bootstrap base-layer if head is empty / start insertion from current head ).
165
160
166
161
extension SkipList {
167
- private func bootstrapBaseLayer( key: Key , data: Payload ) -> Void {
168
- self . head = Node ( asHead: true )
169
- var node = Node ( key: key, data: data)
162
+ private func bootstrapBaseLayer( key: Key , data: Payload ) {
163
+ head = Node ( asHead: true )
164
+ var node = Node ( key: key, data: data)
170
165
171
- self . head!. next = node
166
+ head!. next = node
172
167
173
168
var currentTopNode = node
174
169
@@ -177,17 +172,17 @@ extension SkipList {
177
172
node = Node ( key: key, data: data)
178
173
node. down = currentTopNode
179
174
newHead. next = node
180
- newHead. down = self . head
181
- self . head = newHead
175
+ newHead. down = head
176
+ head = newHead
182
177
currentTopNode = node
183
178
}
184
179
185
180
}
186
181
187
182
188
- private func insertItem( key: Key , data: Payload ) -> Void {
183
+ private func insertItem( key: Key , data: Payload ) {
189
184
var stack = Stack < Node > ( )
190
- var currentNode : Node ? = self . head
185
+ var currentNode : Node ? = head
191
186
192
187
while currentNode != nil {
193
188
@@ -219,8 +214,8 @@ extension SkipList {
219
214
node = Node ( key: key, data: data)
220
215
node. down = currentTopNode
221
216
newHead. next = node
222
- newHead. down = self . head
223
- self . head = newHead
217
+ newHead. down = head
218
+ head = newHead
224
219
currentTopNode = node
225
220
226
221
} else {
@@ -236,32 +231,32 @@ extension SkipList {
236
231
}
237
232
238
233
239
- internal func insert( key: Key , data: Payload ) {
240
- if self . head != nil {
241
- if let node = self . findNode ( key: key) {
242
- // replace in case key already exists
234
+ func insert( key: Key , data: Payload ) {
235
+ if head != nil {
236
+ if let node = findNode ( key: key) {
237
+ // replace, in case of key already exists.
243
238
var currentNode = node. next
244
239
while currentNode != nil && currentNode!. key == key {
245
240
currentNode!. data = data
246
241
currentNode = currentNode!. down
247
242
}
248
243
} else {
249
- self . insertItem ( key: key, data: data)
244
+ insertItem ( key: key, data: data)
250
245
}
251
246
252
247
} else {
253
- self . bootstrapBaseLayer ( key: key, data: data)
248
+ bootstrapBaseLayer ( key: key, data: data)
254
249
}
255
250
}
256
251
257
252
}
258
253
259
254
260
- // MARK: - Removing
255
+ // MARK: - Remove a node with a given key. First, find its position in layers at the top, then remove it from each lane by traversing down to the base layer.
261
256
262
257
extension SkipList {
263
- public func remove( key: Key ) -> Void {
264
- guard let item = self . findNode ( key: key) else {
258
+ public func remove( key: Key ) {
259
+ guard let item = findNode ( key: key) else {
265
260
return
266
261
}
267
262
@@ -285,9 +280,12 @@ extension SkipList {
285
280
}
286
281
}
287
282
283
+
284
+ // MARK: - Get associated payload from a node with a given key.
285
+
288
286
extension SkipList {
289
287
290
288
public func get( key: Key ) -> Payload ? {
291
- return self . search ( key: key)
289
+ return search ( key: key)
292
290
}
293
291
}
0 commit comments