splaytree 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/splaytree/node.rb +12 -12
- data/lib/splaytree/version.rb +1 -1
- data/lib/splaytree.rb +27 -35
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c63b99bb2fb5b4964f06f89b6d30ee8aec87b00a
|
4
|
+
data.tar.gz: b04a5e1d21bd39e3e0b5a237104b8c43f36811c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddfb60c119269a6105ee7656aec1143dec67d465031f02df748981778703c781c3313d213fd927eb4222ec2e9b6d70a3c0eee1b78461057194ea486251612e52
|
7
|
+
data.tar.gz: cb55c77d73bfabed3183cf6281ec2453f2445ee3ce188a7f6b610a186a71de7db8e511cbbc9953e4e7faf8350a95022b555e5298eb19d9d1e099f3def02fef92
|
data/lib/splaytree/node.rb
CHANGED
@@ -26,8 +26,8 @@ class Splaytree
|
|
26
26
|
deleted
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
29
|
+
def duplicates?
|
30
|
+
!@duplicates.empty?
|
31
31
|
end
|
32
32
|
|
33
33
|
def root?
|
@@ -67,18 +67,18 @@ class Splaytree
|
|
67
67
|
self.parent = nil
|
68
68
|
end
|
69
69
|
|
70
|
-
if
|
71
|
-
parent.set_left(
|
72
|
-
|
70
|
+
if object_id == parent.left.object_id
|
71
|
+
parent.set_left(right)
|
72
|
+
set_right(parent)
|
73
73
|
else
|
74
|
-
parent.set_right(
|
75
|
-
|
74
|
+
parent.set_right(left)
|
75
|
+
set_left(parent)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
def zigzig?
|
80
|
-
(
|
81
|
-
(
|
80
|
+
(object_id == parent.left.object_id && parent.object_id == gparent.left.object_id) ||
|
81
|
+
(object_id == parent.right.object_id && parent.object_id == gparent.right.object_id)
|
82
82
|
end
|
83
83
|
|
84
84
|
def to_s
|
@@ -94,9 +94,9 @@ class Splaytree
|
|
94
94
|
[key, value]
|
95
95
|
end
|
96
96
|
|
97
|
-
def <=>(
|
98
|
-
return unless
|
99
|
-
|
97
|
+
def <=>(other)
|
98
|
+
return unless other
|
99
|
+
key <=> other.key
|
100
100
|
end
|
101
101
|
|
102
102
|
end
|
data/lib/splaytree/version.rb
CHANGED
data/lib/splaytree.rb
CHANGED
@@ -4,23 +4,19 @@ require 'splaytree/node'
|
|
4
4
|
class Splaytree
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
-
attr_reader :root
|
7
|
+
attr_reader :root, :size
|
8
|
+
alias_method :length, :size
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@root = nil
|
11
12
|
@size = 0
|
12
13
|
end
|
13
14
|
|
14
|
-
def size
|
15
|
-
@size
|
16
|
-
end
|
17
|
-
alias_method :length, :size
|
18
|
-
|
19
15
|
def empty?
|
20
16
|
@root.nil?
|
21
17
|
end
|
22
18
|
|
23
|
-
def
|
19
|
+
def key?(key)
|
24
20
|
!!get(key)
|
25
21
|
end
|
26
22
|
|
@@ -55,9 +51,7 @@ class Splaytree
|
|
55
51
|
def min
|
56
52
|
return if empty?
|
57
53
|
node = @root
|
58
|
-
while node.left
|
59
|
-
node = node.left
|
60
|
-
end
|
54
|
+
node = node.left while node.left
|
61
55
|
splay(node)
|
62
56
|
node.to_h
|
63
57
|
end
|
@@ -65,9 +59,7 @@ class Splaytree
|
|
65
59
|
def max
|
66
60
|
return if empty?
|
67
61
|
node = @root
|
68
|
-
while node.right
|
69
|
-
node = node.right
|
70
|
-
end
|
62
|
+
node = node.right while node.right
|
71
63
|
splay(node)
|
72
64
|
node.to_h
|
73
65
|
end
|
@@ -76,7 +68,7 @@ class Splaytree
|
|
76
68
|
height_recursive(@root)
|
77
69
|
end
|
78
70
|
|
79
|
-
def
|
71
|
+
def duplicates(key)
|
80
72
|
return if empty?
|
81
73
|
get(key)
|
82
74
|
return if @root.key != key
|
@@ -99,7 +91,7 @@ class Splaytree
|
|
99
91
|
break if node.right.nil?
|
100
92
|
node = node.right
|
101
93
|
else
|
102
|
-
|
94
|
+
raise TypeError, 'Keys should be comparable!'
|
103
95
|
end
|
104
96
|
end
|
105
97
|
splay(node)
|
@@ -118,25 +110,25 @@ class Splaytree
|
|
118
110
|
node.add_duplicate!(value)
|
119
111
|
break
|
120
112
|
when -1
|
121
|
-
|
113
|
+
unless current.left
|
122
114
|
current.set_left(node)
|
123
115
|
break
|
124
116
|
end
|
125
117
|
current = current.left
|
126
118
|
when 1
|
127
|
-
|
119
|
+
unless current.right
|
128
120
|
current.set_right(node)
|
129
121
|
break
|
130
122
|
end
|
131
123
|
current = current.right
|
132
124
|
else
|
133
|
-
|
125
|
+
raise TypeError, 'Keys should be comparable!'
|
134
126
|
end
|
135
127
|
end
|
136
128
|
end
|
137
129
|
splay(node)
|
138
130
|
@size += 1
|
139
|
-
|
131
|
+
true
|
140
132
|
end
|
141
133
|
alias_method :[]=, :insert
|
142
134
|
|
@@ -145,14 +137,14 @@ class Splaytree
|
|
145
137
|
get(key)
|
146
138
|
return false if @root.key != key
|
147
139
|
@root.value = value
|
148
|
-
|
140
|
+
true
|
149
141
|
end
|
150
142
|
|
151
143
|
def remove(key)
|
152
144
|
return if empty?
|
153
145
|
get(key)
|
154
146
|
return if @root.key != key
|
155
|
-
if @root.
|
147
|
+
if @root.duplicates?
|
156
148
|
deleted = @root.remove_duplicate!
|
157
149
|
else
|
158
150
|
deleted = @root.value
|
@@ -177,7 +169,7 @@ class Splaytree
|
|
177
169
|
end
|
178
170
|
|
179
171
|
def each
|
180
|
-
return if
|
172
|
+
return if empty?
|
181
173
|
stack = []
|
182
174
|
node = @root
|
183
175
|
loop do
|
@@ -196,11 +188,11 @@ class Splaytree
|
|
196
188
|
end
|
197
189
|
end
|
198
190
|
|
199
|
-
def each_key
|
191
|
+
def each_key
|
200
192
|
each { |node| yield node.key }
|
201
193
|
end
|
202
194
|
|
203
|
-
def each_value
|
195
|
+
def each_value
|
204
196
|
each { |node| yield node.value }
|
205
197
|
end
|
206
198
|
|
@@ -215,8 +207,14 @@ class Splaytree
|
|
215
207
|
def report
|
216
208
|
return if empty?
|
217
209
|
result = []
|
218
|
-
|
219
|
-
|
210
|
+
each do |node|
|
211
|
+
item = {
|
212
|
+
node: node.key,
|
213
|
+
parent: node.parent && node.parent.key,
|
214
|
+
left: node.left && node.left.key,
|
215
|
+
right: node.right && node.right.key
|
216
|
+
}
|
217
|
+
result << item
|
220
218
|
end
|
221
219
|
result
|
222
220
|
end
|
@@ -226,11 +224,7 @@ class Splaytree
|
|
226
224
|
def get_one_higher_of_root
|
227
225
|
return if @root.right.nil?
|
228
226
|
node = @root.right
|
229
|
-
while node.left
|
230
|
-
if node.left
|
231
|
-
node = node.left
|
232
|
-
end
|
233
|
-
end
|
227
|
+
node = node.left while node.left
|
234
228
|
splay(node)
|
235
229
|
node.to_h
|
236
230
|
end
|
@@ -238,9 +232,7 @@ class Splaytree
|
|
238
232
|
def get_one_lower_of_root
|
239
233
|
return if @root.left.nil?
|
240
234
|
node = @root.left
|
241
|
-
while node.right
|
242
|
-
node = node.right
|
243
|
-
end
|
235
|
+
node = node.right while node.right
|
244
236
|
splay(node)
|
245
237
|
node.to_h
|
246
238
|
end
|
@@ -254,7 +246,7 @@ class Splaytree
|
|
254
246
|
end
|
255
247
|
|
256
248
|
def splay(node)
|
257
|
-
|
249
|
+
until node.root?
|
258
250
|
parent = node.parent
|
259
251
|
if parent.root?
|
260
252
|
node.rotate
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: splaytree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artur Babagulyyev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,9 +80,11 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.1'
|
83
|
-
description:
|
84
|
-
|
85
|
-
|
83
|
+
description: |-
|
84
|
+
Splay tree is an efficient implementation of a balanced
|
85
|
+
binary search tree that takes advantage of locality
|
86
|
+
in the keys used in incoming lookup requests.
|
87
|
+
For many applications, there is excellent key locality.
|
86
88
|
email:
|
87
89
|
- artur.babagulyyev@gmail.com
|
88
90
|
executables: []
|