splaytree 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d251409b924ce93ff916bf31539babb39da6ff50
4
- data.tar.gz: 96ce8b423c24cc2cdc21d8e9a3afe04f89aaae78
3
+ metadata.gz: c63b99bb2fb5b4964f06f89b6d30ee8aec87b00a
4
+ data.tar.gz: b04a5e1d21bd39e3e0b5a237104b8c43f36811c6
5
5
  SHA512:
6
- metadata.gz: 9815b103c477f5fccde78d85fd48c00b89b13aa0162495fe53eeb843c96cb4bb36721d260d687ae35d41fbf2981e8a5f68fe452b5d46663f908d171a319da07a
7
- data.tar.gz: ac6a350fd0a2a98df6bf46dde19837c84fd8ed34499410629f3840bdb3b365896aacedd75971298423f052e020d93ddfb9f702386d582c693334be9fa349dbcb
6
+ metadata.gz: ddfb60c119269a6105ee7656aec1143dec67d465031f02df748981778703c781c3313d213fd927eb4222ec2e9b6d70a3c0eee1b78461057194ea486251612e52
7
+ data.tar.gz: cb55c77d73bfabed3183cf6281ec2453f2445ee3ce188a7f6b610a186a71de7db8e511cbbc9953e4e7faf8350a95022b555e5298eb19d9d1e099f3def02fef92
@@ -26,8 +26,8 @@ class Splaytree
26
26
  deleted
27
27
  end
28
28
 
29
- def has_duplicates?
30
- @duplicates.length > 0
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 self.object_id == parent.left.object_id
71
- parent.set_left(self.right)
72
- self.set_right(parent)
70
+ if object_id == parent.left.object_id
71
+ parent.set_left(right)
72
+ set_right(parent)
73
73
  else
74
- parent.set_right(self.left)
75
- self.set_left(parent)
74
+ parent.set_right(left)
75
+ set_left(parent)
76
76
  end
77
77
  end
78
78
 
79
79
  def zigzig?
80
- (self.object_id == parent.left.object_id && parent.object_id == gparent.left.object_id) ||
81
- (self.object_id == parent.right.object_id && parent.object_id == gparent.right.object_id)
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 <=>(node)
98
- return unless node
99
- self.key <=> node.key
97
+ def <=>(other)
98
+ return unless other
99
+ key <=> other.key
100
100
  end
101
101
 
102
102
  end
@@ -1,3 +1,3 @@
1
1
  class Splaytree
2
- VERSION = "0.1.0"
2
+ VERSION = '0.2.0'
3
3
  end
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 has_key?(key)
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 get_with_duplicates(key)
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
- fail
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
- if !current.left
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
- if !current.right
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
- fail
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
- return true
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
- return true
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.has_duplicates?
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 self.empty?
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(&block)
191
+ def each_key
200
192
  each { |node| yield node.key }
201
193
  end
202
194
 
203
- def each_value(&block)
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
- each_with_index do |node, index|
219
- result << { node: node.key, parent: node.parent&.key, left: node.left&.key, right: node.right&.key }
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 do
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 do
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
- while !node.root? do
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.1.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-22 00:00:00.000000000 Z
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: A splay tree is a self-adjusting binary search tree with the additional
84
- property that recently accessed elements are quick to access again. It performs
85
- basic operations such as insertion, look-up and removal in O(log n) amortized time.
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: []