pairing_heap 2.0.0 → 3.0.1
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/.github/workflows/main.yml +5 -5
- data/.standard.yml +1 -1
- data/Gemfile.lock +8 -5
- data/lib/pairing_heap/version.rb +1 -1
- data/lib/pairing_heap.rb +70 -23
- data/pairing_heap.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf15d6556408f19ba67e1f798e83b19677749f585d8868b15230370701b16760
|
4
|
+
data.tar.gz: 94dd6f48156bb51bb91b422c3378eaac5e55647b76c4c8f7952b8b96ad404053
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96ccf738766bac2a178dd6cec820ef462417aef4871554d0b3e9b91eed9cc8fd0a2cf73cda2c4a86992a708230d4694c6b30c8042831b22c30d5f6fcdaffdc1f
|
7
|
+
data.tar.gz: 2eefc3b1629951839e5821e9b5b3bbf01a24d3d9d938887e2eaa01343509cf3439f68517f502c0a8279d89108d846d6963f0986e88ff96490b3add51c4ab387a
|
data/.github/workflows/main.yml
CHANGED
@@ -12,10 +12,10 @@ jobs:
|
|
12
12
|
runs-on: ${{ matrix.os }}
|
13
13
|
steps:
|
14
14
|
- uses: actions/checkout@v3
|
15
|
-
-
|
15
|
+
- name: Set up ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
16
17
|
with:
|
17
18
|
ruby-version: ${{ matrix.ruby }}
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
bundle exec rake
|
19
|
+
bundler-cache: true
|
20
|
+
- name: Run the default task
|
21
|
+
run: bundle exec rake
|
data/.standard.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pairing_heap (
|
4
|
+
pairing_heap (3.0.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
|
-
codecov (0.6.0)
|
11
|
-
simplecov (>= 0.15, < 0.22)
|
12
10
|
docile (1.4.0)
|
13
11
|
json (2.6.3)
|
12
|
+
json (2.6.3-java)
|
14
13
|
language_server-protocol (3.17.0.2)
|
15
14
|
minitest (5.15.0)
|
16
15
|
parallel (1.22.1)
|
@@ -36,7 +35,7 @@ GEM
|
|
36
35
|
rubocop (>= 1.7.0, < 2.0)
|
37
36
|
rubocop-ast (>= 0.4.0)
|
38
37
|
ruby-progressbar (1.11.0)
|
39
|
-
simplecov (0.
|
38
|
+
simplecov (0.22.0)
|
40
39
|
docile (~> 1.1)
|
41
40
|
simplecov-html (~> 0.11)
|
42
41
|
simplecov_json_formatter (~> 0.1)
|
@@ -49,14 +48,18 @@ GEM
|
|
49
48
|
unicode-display_width (2.3.0)
|
50
49
|
|
51
50
|
PLATFORMS
|
51
|
+
universal-java-17
|
52
|
+
x86_64-darwin-19
|
53
|
+
x86_64-darwin-20
|
52
54
|
x86_64-darwin-21
|
53
55
|
x86_64-darwin-22
|
56
|
+
x86_64-linux
|
54
57
|
|
55
58
|
DEPENDENCIES
|
56
|
-
codecov (= 0.6.0)
|
57
59
|
minitest (~> 5.0)
|
58
60
|
pairing_heap!
|
59
61
|
rake (~> 13.0)
|
62
|
+
simplecov (~> 0.22.0)
|
60
63
|
standard (~> 1.20)
|
61
64
|
|
62
65
|
BUNDLED WITH
|
data/lib/pairing_heap/version.rb
CHANGED
data/lib/pairing_heap.rb
CHANGED
@@ -83,7 +83,7 @@ module PairingHeap
|
|
83
83
|
# @param elem Element to be pushed
|
84
84
|
# @param priority Priority of the element
|
85
85
|
# @raise [ArgumentError] if the element is already in the heap
|
86
|
-
# @return [
|
86
|
+
# @return [self]
|
87
87
|
def push(elem, priority = elem)
|
88
88
|
raise ArgumentError, "Element already in the heap" if @nodes.key?(elem)
|
89
89
|
|
@@ -101,16 +101,20 @@ module PairingHeap
|
|
101
101
|
|
102
102
|
# Returns the element at the top of the heap
|
103
103
|
# Time Complexity: O(1)
|
104
|
+
# @return [Object]
|
105
|
+
# @return [nil] if the heap is empty
|
104
106
|
def peek
|
105
107
|
@root&.elem
|
106
108
|
end
|
107
109
|
|
108
110
|
# @return [Object]
|
111
|
+
# @return [nil] if the heap is empty
|
109
112
|
def peek_priority
|
110
113
|
@root&.priority
|
111
114
|
end
|
112
115
|
|
113
116
|
# @return [Array(Object, Object)]
|
117
|
+
# @return [Array(nil, nil)] if the heap is empty
|
114
118
|
def peek_with_priority
|
115
119
|
[@root&.elem, @root&.priority]
|
116
120
|
end
|
@@ -137,9 +141,10 @@ module PairingHeap
|
|
137
141
|
# Removes element from the top of the heap and returns it
|
138
142
|
# Time Complexity: O(N)
|
139
143
|
# Amortized time Complexity: O(log(N))
|
140
|
-
# @
|
144
|
+
# @return [Object] The top element
|
145
|
+
# @return [nil] If the heap is empty
|
141
146
|
def pop
|
142
|
-
|
147
|
+
return nil if @root.nil?
|
143
148
|
|
144
149
|
elem = @root.elem
|
145
150
|
@nodes.delete(elem)
|
@@ -153,18 +158,22 @@ module PairingHeap
|
|
153
158
|
end
|
154
159
|
alias_method :dequeue, :pop
|
155
160
|
|
161
|
+
# @see #pop
|
156
162
|
# @return [Object]
|
163
|
+
# @return [nil] if the heap is empty
|
157
164
|
def pop_priority
|
158
165
|
node = @root
|
159
166
|
pop
|
160
|
-
node
|
167
|
+
node&.priority
|
161
168
|
end
|
162
169
|
|
170
|
+
# @see #pop
|
163
171
|
# @return [Array(Object, Object)]
|
172
|
+
# @return [Array(nil, nil)] If the heap is empty
|
164
173
|
def pop_with_priority
|
165
174
|
node = @root
|
166
175
|
pop
|
167
|
-
[node
|
176
|
+
[node&.elem, node&.priority]
|
168
177
|
end
|
169
178
|
|
170
179
|
# Changes a priority of element to a more prioritary one
|
@@ -173,7 +182,7 @@ module PairingHeap
|
|
173
182
|
# @param elem Element
|
174
183
|
# @param priority New priority
|
175
184
|
# @raise [ArgumentError] if the element is not in the heap or the new priority is less prioritary
|
176
|
-
# @return [
|
185
|
+
# @return [self]
|
177
186
|
def change_priority(elem, priority)
|
178
187
|
node = @nodes[elem]
|
179
188
|
raise ArgumentError, "Provided element is not in heap" if node.nil?
|
@@ -182,8 +191,8 @@ module PairingHeap
|
|
182
191
|
end
|
183
192
|
|
184
193
|
node.priority = priority
|
185
|
-
return if node.parent.nil?
|
186
|
-
return if @order[node.parent.priority, node.priority]
|
194
|
+
return self if node.parent.nil?
|
195
|
+
return self if @order[node.parent.priority, node.priority]
|
187
196
|
|
188
197
|
node.remove_from_parents_list!
|
189
198
|
@root = meld(node, @root)
|
@@ -195,7 +204,7 @@ module PairingHeap
|
|
195
204
|
# Time Complexity: O(N)
|
196
205
|
# Amortized Time Complexity: O(log(N))
|
197
206
|
# @raise [ArgumentError] if the element is not in the heap
|
198
|
-
# @return [
|
207
|
+
# @return [self]
|
199
208
|
def delete(elem)
|
200
209
|
node = @nodes[elem]
|
201
210
|
raise ArgumentError, "Provided element is not in heap" if node.nil?
|
@@ -221,14 +230,21 @@ module PairingHeap
|
|
221
230
|
self
|
222
231
|
end
|
223
232
|
|
233
|
+
# Check if element is in the heap
|
234
|
+
# Time Complexity: O(1)
|
235
|
+
# @return [Boolean]
|
236
|
+
def include?(key)
|
237
|
+
@nodes.key?(key)
|
238
|
+
end
|
239
|
+
alias_method :exists?, :include?
|
240
|
+
|
224
241
|
# Returns priority of the provided element
|
225
242
|
# Time Complexity: O(1)
|
226
|
-
# @raise [ArgumentError] if the element is not in the heap
|
227
243
|
# @return [Object]
|
244
|
+
# @return [nil] If element does not exist
|
228
245
|
def get_priority(elem)
|
229
246
|
node = @nodes[elem]
|
230
|
-
|
231
|
-
node.priority
|
247
|
+
node&.priority
|
232
248
|
end
|
233
249
|
|
234
250
|
# Returns a pair where first element is success flag, and second element is priority
|
@@ -242,11 +258,22 @@ module PairingHeap
|
|
242
258
|
[true, node.priority]
|
243
259
|
end
|
244
260
|
|
245
|
-
# Returns enumerator of elements.
|
246
|
-
# @
|
261
|
+
# Returns enumerator of elements.
|
262
|
+
# @note There are no order guarantees.
|
263
|
+
# @yieldparam [Object] element Element in the heap
|
264
|
+
# @return [Enumerator<Object>]
|
247
265
|
def each
|
248
266
|
return to_enum(__method__) { size } unless block_given?
|
249
|
-
|
267
|
+
@nodes.each_value { |node| yield node.elem }
|
268
|
+
end
|
269
|
+
|
270
|
+
# Returns enumerator of elements.
|
271
|
+
# @note There are no order guarantees.
|
272
|
+
# @return [Enumerator<Array(Object, Object)>] if no block given
|
273
|
+
# @yieldparam [Array(Object, Object)] element Element in the heap with its priority
|
274
|
+
def each_with_priority
|
275
|
+
return to_enum(__method__) { size } unless block_given?
|
276
|
+
@nodes.each_value { |node| yield [node.elem, node.priority] }
|
250
277
|
end
|
251
278
|
|
252
279
|
private
|
@@ -294,7 +321,7 @@ module PairingHeap
|
|
294
321
|
# Time Complexity: O(1)
|
295
322
|
# @param elem Element to be pushed
|
296
323
|
# @param priority Priority of the element
|
297
|
-
# @return [
|
324
|
+
# @return [self]
|
298
325
|
def push(elem, priority = elem)
|
299
326
|
node = Node.new(elem, priority)
|
300
327
|
@root = if @root
|
@@ -310,16 +337,20 @@ module PairingHeap
|
|
310
337
|
|
311
338
|
# Returns the element at the top of the heap
|
312
339
|
# Time Complexity: O(1)
|
340
|
+
# @return [Object]
|
341
|
+
# @return [nil] If the heap is empty
|
313
342
|
def peek
|
314
343
|
@root&.elem
|
315
344
|
end
|
316
345
|
|
317
346
|
# @return [Object]
|
347
|
+
# @return [nil] If the heap is empty
|
318
348
|
def peek_priority
|
319
349
|
@root&.priority
|
320
350
|
end
|
321
351
|
|
322
352
|
# @return [Array(Object, Object)]
|
353
|
+
# @return [Array(nil, nil)] If the heap is empty
|
323
354
|
def peek_with_priority
|
324
355
|
[@root&.elem, @root&.priority]
|
325
356
|
end
|
@@ -344,9 +375,10 @@ module PairingHeap
|
|
344
375
|
# Removes an element from the top of the heap and returns it
|
345
376
|
# Time Complexity: O(N)
|
346
377
|
# Amortized time Complexity: O(log(N))
|
347
|
-
# @
|
378
|
+
# @return [Object] The top element
|
379
|
+
# @return [nil] If the heap is empty
|
348
380
|
def pop
|
349
|
-
|
381
|
+
return nil if @root.nil?
|
350
382
|
@size -= 1
|
351
383
|
|
352
384
|
elem = @root.elem
|
@@ -357,27 +389,42 @@ module PairingHeap
|
|
357
389
|
end
|
358
390
|
alias_method :dequeue, :pop
|
359
391
|
|
392
|
+
# @see #pop
|
360
393
|
# @return [Object]
|
394
|
+
# @return [nil] If the heap is empty
|
361
395
|
def pop_priority
|
362
396
|
node = @root
|
363
397
|
pop
|
364
|
-
node
|
398
|
+
node&.priority
|
365
399
|
end
|
366
400
|
|
401
|
+
# @see #pop
|
367
402
|
# @return [Array(Object, Object)]
|
403
|
+
# @return [Array(nil, nil)] If the heap is empty
|
368
404
|
def pop_with_priority
|
369
405
|
node = @root
|
370
406
|
pop
|
371
|
-
[node
|
407
|
+
[node&.elem, node&.priority]
|
372
408
|
end
|
373
409
|
|
374
|
-
# Returns enumerator of elements.
|
375
|
-
# @
|
410
|
+
# Returns enumerator of elements.
|
411
|
+
# @note There are no order guarantees.
|
412
|
+
# @yieldparam [Object] element element in the heap
|
413
|
+
# @return [Enumerator<Object>] if no block given
|
376
414
|
def each
|
377
415
|
return to_enum(__method__) { size } unless block_given?
|
378
416
|
NodeVisitor.visit_node(@root) { |x| yield x.elem }
|
379
417
|
end
|
380
418
|
|
419
|
+
# @return [Enumerator<Array(Object, Object)>] if no block given
|
420
|
+
# @yieldparam [Array(Object, Object)] element Element in the heap with its priority
|
421
|
+
# Returns enumerator of elements.
|
422
|
+
# @note There are no order guarantees.
|
423
|
+
def each_with_priority
|
424
|
+
return to_enum(__method__) { size } unless block_given?
|
425
|
+
NodeVisitor.visit_node(@root) { |x| yield [x.elem, x.priority] }
|
426
|
+
end
|
427
|
+
|
381
428
|
private
|
382
429
|
|
383
430
|
include MergePairs
|
@@ -424,7 +471,7 @@ module PairingHeap
|
|
424
471
|
# Time Complexity: O(N)
|
425
472
|
# Amortized Time Complexity: O(log(N))
|
426
473
|
# @raise [ArgumentError] if the element is not in the heap
|
427
|
-
# @return [
|
474
|
+
# @return [self]
|
428
475
|
def change_priority(elem, priority)
|
429
476
|
raise ArgumentError, "Provided element is not in heap" unless @nodes.key?(elem)
|
430
477
|
if !@order[priority, @nodes[elem].priority]
|
data/pairing_heap.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
|
33
33
|
spec.add_development_dependency "minitest", "~> 5.0"
|
34
34
|
spec.add_development_dependency "rake", "~> 13.0"
|
35
|
-
spec.add_development_dependency "
|
35
|
+
spec.add_development_dependency "simplecov", "~> 0.22.0"
|
36
36
|
spec.add_development_dependency "standard", "~> 1.20"
|
37
37
|
|
38
38
|
# For more information and examples about making a new gem, checkout our
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pairing_heap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcin Henryk Bartkowiak
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '13.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: simplecov
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.22.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.22.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: standard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|