algorithmix 0.0.0.4.1 → 0.0.0.5
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/README.md +2 -0
- data/algorithmix.gemspec +2 -6
- data/lib/algorithmix/data_structure/generic/deque.rb +5 -0
- data/lib/algorithmix/data_structure/generic/priority_queue.rb +354 -0
- data/lib/algorithmix/data_structure/generic/queue.rb +5 -0
- data/lib/algorithmix/data_structure/generic/stack.rb +5 -0
- data/lib/algorithmix/data_structure/heap/binary_heap.rb +5 -0
- data/lib/algorithmix/version.rb +1 -1
- metadata +6 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 975f3659a8220362ddb0e074ad0f9c826615e31a
|
4
|
+
data.tar.gz: 450f70a7bb070aae708b3112122c2fb0cc823957
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b63a0d62dee71d7b3da52450a8fccb6b945fcdb99117d72f727099aa0e86114ae945ec9b7107c1bd2ad772a3e9cb78f559edf3327cdfa64c1be857da69c9951
|
7
|
+
data.tar.gz: 3302c670ade851248a144a0c39504c00309fd7325bb12debe71f0ca2e4182d167484b8f4ea20559b5d7ab02a5cfbc5f370bdebd5d10d3b2d8de6c6684a0fdfb0
|
data/README.md
CHANGED
@@ -9,6 +9,8 @@ The gem contains various implementations of known and unknown data structures an
|
|
9
9
|
:construction: Because the gem is still not ready, with each new implementation of a data structure or an algorithm, a new
|
10
10
|
minor version will be released.
|
11
11
|
|
12
|
+
 Fix couple of bugs in BinaryHeap
|
13
|
+
|
12
14
|
 [**BinaryHeap**](https://github.com/monzita/algorithmix/wiki/BinaryHeap)
|
13
15
|
|
14
16
|
 [**Deque**](https://github.com/monzita/algorithmix/wiki/Deque)
|
data/algorithmix.gemspec
CHANGED
@@ -10,12 +10,8 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["*@*.*"]
|
11
11
|
spec.summary = %q{The gem contains various implementations of known and uknown data structures and algorithms}
|
12
12
|
spec.description = <<-DOC
|
13
|
-
|
14
|
-
|
15
|
-
2. Queue\n
|
16
|
-
3. Deque\n
|
17
|
-
4. Binary heap\n
|
18
|
-
|
13
|
+
The gem contains various implementations of known and uknown data structures and algorithms.
|
14
|
+
/Currently the gem contains: #stack, #queue, #deque, #binary_heap, #priority_queue/
|
19
15
|
DOC
|
20
16
|
spec.homepage = "https://github.com/monzita/algorithmix/wiki"
|
21
17
|
spec.license = "MIT"
|
@@ -0,0 +1,354 @@
|
|
1
|
+
# Documentation: https://github.com/monzita/algorithmix/wiki/PriorityQueue
|
2
|
+
|
3
|
+
module Algorithmix
|
4
|
+
module DataStructure
|
5
|
+
module Generic
|
6
|
+
|
7
|
+
class PriorityQueue
|
8
|
+
attr_reader :binary_heap
|
9
|
+
|
10
|
+
# Creates a new priority queue.
|
11
|
+
#
|
12
|
+
# @param obj [#to_a] can be any object, which responds to #to_a method
|
13
|
+
# @kwarg copy [true, false] if set to true, makes a copy of content of the given object
|
14
|
+
# @kwarg min [true, false] sets the main property of the new priority queue. By default max priority queue is created.
|
15
|
+
# @raise ArgumentError, if given object doesn't respond to to_a method.
|
16
|
+
# @return [PriorityQueue]
|
17
|
+
def initialize(obj = nil, copy: false, min: false)
|
18
|
+
@binary_heap = Heap::BinaryHeap.new(obj, copy: copy, min: min)
|
19
|
+
@max = min ? false : true
|
20
|
+
end
|
21
|
+
|
22
|
+
# Assigns content of an object, to content of the queue.
|
23
|
+
#
|
24
|
+
# @param obj [#to_a]
|
25
|
+
# @kwarg copy [true, false]
|
26
|
+
# @raise ArgumentError
|
27
|
+
# @return self object [PriorityQeue]
|
28
|
+
def assign(obj, copy: false)
|
29
|
+
@binary_heap.assign(obj, copy: copy)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Inserts a value in the queue.
|
34
|
+
#
|
35
|
+
# @param value
|
36
|
+
# @return [PriorityQueue] self object
|
37
|
+
def push(value)
|
38
|
+
@binary_heap.insert(value)
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
# (see #push)
|
43
|
+
def <<
|
44
|
+
push(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Removes the element with highest or lowest priority of the queue.
|
48
|
+
#
|
49
|
+
# @raise Algorithmix::EmptyContainerError, if the queue is empty.
|
50
|
+
# @return element with the highest or lowest priority
|
51
|
+
def pop
|
52
|
+
raise EmptyContainerError, "The priority queue is empty." if @binary_heap.empty?
|
53
|
+
@binary_heap.extract
|
54
|
+
end
|
55
|
+
|
56
|
+
# Returns the element with the highest or lowest priority without removing it from the queue.
|
57
|
+
def front
|
58
|
+
@binary_heap.top
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns number of elements in the queue.
|
62
|
+
def size
|
63
|
+
@binary_heap.size
|
64
|
+
end
|
65
|
+
|
66
|
+
# (see #size)
|
67
|
+
def length
|
68
|
+
@binary_heap.size
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns information for the content of the queue - are there any elements, or no.
|
72
|
+
def empty?
|
73
|
+
@binary_heap.empty?
|
74
|
+
end
|
75
|
+
|
76
|
+
# Comapres contents of the queue and a queue given as argument.
|
77
|
+
#
|
78
|
+
# @param priority_queue [PriorityQueue]
|
79
|
+
# @raise ArgumentError, if given object is not a PriorityQueue.
|
80
|
+
# @return [true, false] true if contents are equal, false otherwise
|
81
|
+
def ==(priority_queue)
|
82
|
+
raise ArgumentError, "Undefined method PriorityQueue#== for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
83
|
+
to_a == priority_queue.to_a
|
84
|
+
end
|
85
|
+
|
86
|
+
# (see #==)
|
87
|
+
def eql?(priority_queue)
|
88
|
+
raise ArgumentError, "Undefined method PriorityQueue#eql? for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
89
|
+
self == priority_queue
|
90
|
+
end
|
91
|
+
|
92
|
+
# Comapres contents of the queue and a queue given as argument.
|
93
|
+
#
|
94
|
+
# @param priority_queue [PriorityQueue]
|
95
|
+
# @raise ArgumentError, if given object is not a PriorityQueue.
|
96
|
+
# @return [true, false] true if contents are different, false otherwise
|
97
|
+
def !=(priority_queue)
|
98
|
+
raise ArgumentError, "Undefined method PriorityQueue#!= for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
99
|
+
to_a != priority_queue.to_a
|
100
|
+
end
|
101
|
+
|
102
|
+
# (see #!=)
|
103
|
+
def diff?(priority_queue)
|
104
|
+
raise ArgumentError, "Undefined method PriorityQueue#diff? for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
105
|
+
self != priority_queue
|
106
|
+
end
|
107
|
+
|
108
|
+
# Comapres contents of the queue and a queue given as argument.
|
109
|
+
#
|
110
|
+
# @param priority_queue [PriorityQueue]
|
111
|
+
# @raise ArgumentError, if given object is not a PriorityQueue.
|
112
|
+
# @return 1 if content of the queue is > content of the given queue, 0 if contents are euqal, -1 if content of the given queue is > content of the queue
|
113
|
+
def <=>(priority_queue)
|
114
|
+
raise ArgumentError, "Undefined method PriorityQueue#<=> for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
115
|
+
to_a <=> priority_queue.to_a
|
116
|
+
end
|
117
|
+
|
118
|
+
# Converts content of the queue to an array.
|
119
|
+
#
|
120
|
+
# @return array with elements of the queue
|
121
|
+
def to_a
|
122
|
+
@binary_heap.to_a
|
123
|
+
end
|
124
|
+
|
125
|
+
# Clears content of the queue.
|
126
|
+
#
|
127
|
+
# @return [PriorityQueue] self object
|
128
|
+
def clear
|
129
|
+
@binary_heap.clear
|
130
|
+
self
|
131
|
+
end
|
132
|
+
|
133
|
+
# Concatenates contents of the queue and a queue given as argument.
|
134
|
+
#
|
135
|
+
# @param priority_queue [PriorityQueue]
|
136
|
+
# @raise ArgumentError, if given object is not a priority queue
|
137
|
+
# @return [PriorityQueue] a new priority queue
|
138
|
+
def +(priority_queue)
|
139
|
+
raise ArgumentError, "Undefined method PriorityQueue#+ for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
140
|
+
PriorityQueue.new(@binary_heap + priority_queue.send(:binary_heap), min: !@max)
|
141
|
+
end
|
142
|
+
|
143
|
+
# (see #+)
|
144
|
+
def concat(priority_queue)
|
145
|
+
raise ArgumentError, "Undefined method PriorityQueue#concat for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
146
|
+
self + priority_queue
|
147
|
+
end
|
148
|
+
|
149
|
+
# (see #+)
|
150
|
+
def merge(priority_queue)
|
151
|
+
raise ArgumentError, "Undefined method PriorityQueue#merge for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
152
|
+
self + priority_queue
|
153
|
+
end
|
154
|
+
|
155
|
+
# Concatenates contents of the queue and a queue given as argument.
|
156
|
+
#
|
157
|
+
# @param priority_queue [PriorityQueue]
|
158
|
+
# @raise ArgumentError, if given object is not a priority queue
|
159
|
+
# @return [PriorityQueue] self object
|
160
|
+
def concat!(priority_queue)
|
161
|
+
raise ArgumentError, "Undefined method PriorityQueue#concat! for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
162
|
+
@binary_heap.concat!(priority_queue.send(:binary_heap))
|
163
|
+
self
|
164
|
+
end
|
165
|
+
|
166
|
+
# Concatenates contents of the queue and a queue given as argument.
|
167
|
+
#
|
168
|
+
# @param priority_queue [PriorityQueue]
|
169
|
+
# @raise ArgumentError, if given object is not a priority queue
|
170
|
+
# @return [PriorityQueue] self object
|
171
|
+
def merge!(priority_queue)
|
172
|
+
raise ArgumentError, "Undefined method PriorityQueue#merge! for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
173
|
+
@binary_heap.merge!(priority_queue.send(:binary_heap))
|
174
|
+
self
|
175
|
+
end
|
176
|
+
|
177
|
+
# Unites contents of the queue and a queue given as argument.
|
178
|
+
#
|
179
|
+
# @param priority_queue [PriorityQueue]
|
180
|
+
# @raise ArgumentError, if given object is not a priority queue
|
181
|
+
# @return [PriorityQueue] a new priority queue
|
182
|
+
def |(priority_queue)
|
183
|
+
raise ArgumentError, "Undefined method PriorityQueue#| for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
184
|
+
PriorityQueue.new(@binary_heap | priority_queue.send(:binary_heap), min: !@max)
|
185
|
+
end
|
186
|
+
|
187
|
+
# (see #|)
|
188
|
+
def union(priority_queue)
|
189
|
+
raise ArgumentError, "Undefined method PriorityQueue#union for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
190
|
+
self | priority_queue
|
191
|
+
end
|
192
|
+
|
193
|
+
# Unites contents of the queue and a queue given as argument.
|
194
|
+
#
|
195
|
+
# @param priority_queue [PriorityQueue]
|
196
|
+
# @raise ArgumentError, if given object is not a priority queue
|
197
|
+
# @return [PriorityQueue] self object
|
198
|
+
def union!(priority_queue)
|
199
|
+
raise ArgumentError, "Undefined method PriorityQueue#union! for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
200
|
+
@binary_heap = @binary_heap | priority_queue.send(:binary_heap)
|
201
|
+
self
|
202
|
+
end
|
203
|
+
|
204
|
+
# Finds the intersection of contents of the queue and a queue given as argument.
|
205
|
+
#
|
206
|
+
# @param priority_queue [PriorityQueue]
|
207
|
+
# @raise ArgumentError, if given object is not a priority queue
|
208
|
+
# @return [PriorityQueue] a new priority queue
|
209
|
+
def &(priority_queue)
|
210
|
+
raise ArgumentError, "Undefined method PriorityQueue#& for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
211
|
+
PriorityQueue.new(@binary_heap & priority_queue.send(:binary_heap), min: !@max)
|
212
|
+
end
|
213
|
+
|
214
|
+
# (see #&)
|
215
|
+
def intersect(priority_queue)
|
216
|
+
raise ArgumentError, "Undefined method PriorityQueue#intersect for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
217
|
+
self & priority_queue
|
218
|
+
end
|
219
|
+
|
220
|
+
# Finds the intersection contents of the queue and a queue given as argument.
|
221
|
+
#
|
222
|
+
# @param priority_queue [PriorityQueue]
|
223
|
+
# @raise ArgumentError, if given object is not a priority queue
|
224
|
+
# @return [PriorityQueue] self object
|
225
|
+
def intersect!(priority_queue)
|
226
|
+
raise ArgumentError, "Undefined method PriorityQueue#intersect! for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
227
|
+
@binary_heap.intersect!(priority_queue.send(:binary_heap))
|
228
|
+
self
|
229
|
+
end
|
230
|
+
|
231
|
+
# Finds the difference of contents of the queue and a queue given as argument.
|
232
|
+
#
|
233
|
+
# @param priority_queue [PriorityQueue]
|
234
|
+
# @raise ArgumentError, if given object is not a priority queue
|
235
|
+
# @return [PriorityQueue] a new priority queue
|
236
|
+
def -(priority_queue)
|
237
|
+
raise ArgumentError, "Undefined method PriorityQueue#- for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
238
|
+
PriorityQueue.new(@binary_heap - priority_queue.send(:binary_heap), min: !@max)
|
239
|
+
end
|
240
|
+
|
241
|
+
# (see #-)
|
242
|
+
def difference(priority_queue)
|
243
|
+
raise ArgumentError, "Undefined method PriorityQueue#difference for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
244
|
+
self - priority_queue
|
245
|
+
end
|
246
|
+
|
247
|
+
# Finds the difference of contents of the queue and a queue given as argument.
|
248
|
+
#
|
249
|
+
# @param priority_queue [PriorityQueue]
|
250
|
+
# @raise ArgumentError, if given object is not a priority queue
|
251
|
+
# @return [PriorityQueue] self object
|
252
|
+
def difference!(priority_queue)
|
253
|
+
raise ArgumentError, "Undefined method PriorityQueue#difference! for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
254
|
+
@binary_heap.difference!(priority_queue.send(:binary_heap))
|
255
|
+
self
|
256
|
+
end
|
257
|
+
|
258
|
+
# Finds the symmetric difference of contents of the queue and a queue given as argument.
|
259
|
+
#
|
260
|
+
# @param priority_queue [PriorityQueue]
|
261
|
+
# @raise ArgumentError, if given object is not a priority queue
|
262
|
+
# @return [PriorityQueue] a new priority queue
|
263
|
+
def ^(priority_queue)
|
264
|
+
raise ArgumentError, "Undefined method PriorityQueue#^ for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
265
|
+
PriorityQueue.new(@binary_heap ^ priority_queue.send(:binary_heap), min: !@max)
|
266
|
+
end
|
267
|
+
|
268
|
+
# (see #^)
|
269
|
+
def symmetric_difference(priority_queue)
|
270
|
+
raise ArgumentError, "Undefined method PriorityQueue#symmetric_difference for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
271
|
+
self ^ priority_queue
|
272
|
+
end
|
273
|
+
|
274
|
+
# Finds the symmetric difference of contents of the queue and a queue given as argument.
|
275
|
+
#
|
276
|
+
# @param priority_queue [PriorityQueue]
|
277
|
+
# @raise ArgumentError, if given object is not a priority queue
|
278
|
+
# @return [PriorityQueue] self object
|
279
|
+
def symmetric_difference!(priority_queue)
|
280
|
+
raise ArgumentError, "Undefined method PriorityQueue#symmetric_difference! for #{priority_queue}:#{priority_queue.class}" unless priority_queue.is_a?(PriorityQueue)
|
281
|
+
@binary_heap.symmetric_difference!(priority_queue.send(:binary_heap))
|
282
|
+
self
|
283
|
+
end
|
284
|
+
|
285
|
+
# Filters elements of the queue by given condition.
|
286
|
+
#
|
287
|
+
# @param &block
|
288
|
+
# @return [PriorityQueue] a new priority queue
|
289
|
+
def select(&block)
|
290
|
+
PriorityQueue.new(@binary_heap.select { |e| block.call(e) }, min: !@max)
|
291
|
+
end
|
292
|
+
|
293
|
+
# Filters elements of the queue by given condition.
|
294
|
+
#
|
295
|
+
# @param &block
|
296
|
+
# @return [PriorityQueue] self object
|
297
|
+
def select!(&block)
|
298
|
+
@binary_heap.select! { |e| block.call(e) }
|
299
|
+
self
|
300
|
+
end
|
301
|
+
|
302
|
+
# (see #select)
|
303
|
+
def filter(&block)
|
304
|
+
select(&block)
|
305
|
+
end
|
306
|
+
|
307
|
+
# (see #select!)
|
308
|
+
def filter!(&block)
|
309
|
+
select!(&block)
|
310
|
+
end
|
311
|
+
|
312
|
+
# (see #select)
|
313
|
+
def find_all(&block)
|
314
|
+
select(&block)
|
315
|
+
end
|
316
|
+
|
317
|
+
# (see #select!)
|
318
|
+
def find_all!(&block)
|
319
|
+
select!(&block)
|
320
|
+
end
|
321
|
+
|
322
|
+
# Applies a function to each element of the queue.
|
323
|
+
#
|
324
|
+
# @param &block
|
325
|
+
# @return [PriorityQueue] a new priority queue
|
326
|
+
def map(&block)
|
327
|
+
PriorityQueue.new(@binary_heap.map { |e| block.call(e)}, min: !@max)
|
328
|
+
end
|
329
|
+
|
330
|
+
# Applies a function to each element of the queue.
|
331
|
+
#
|
332
|
+
# @param &block
|
333
|
+
# @return [PriorityQueue] self object
|
334
|
+
def map!(&block)
|
335
|
+
@binary_heap.map! { |e| block.call(e) }
|
336
|
+
self
|
337
|
+
end
|
338
|
+
|
339
|
+
# (see #map)
|
340
|
+
def apply(&block)
|
341
|
+
map(&block)
|
342
|
+
end
|
343
|
+
|
344
|
+
# (see #map!)
|
345
|
+
def apply!(&block)
|
346
|
+
map!(&block)
|
347
|
+
end
|
348
|
+
|
349
|
+
private :binary_heap
|
350
|
+
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
data/lib/algorithmix/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algorithmix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.0.
|
4
|
+
version: 0.0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Monika Ilieva
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,18 +66,9 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.0.0
|
69
|
-
description:
|
70
|
-
|
71
|
-
|
72
|
-
1. Stack
|
73
|
-
|
74
|
-
2. Queue
|
75
|
-
|
76
|
-
3. Deque
|
77
|
-
|
78
|
-
4. Binary heap
|
79
|
-
|
80
|
-
|
69
|
+
description: " The gem contains various implementations of
|
70
|
+
known and uknown data structures and algorithms. \n /Currently
|
71
|
+
the gem contains: #stack, #queue, #deque, #binary_heap, #priority_queue/\n"
|
81
72
|
email:
|
82
73
|
- "*@*.*"
|
83
74
|
executables: []
|
@@ -97,6 +88,7 @@ files:
|
|
97
88
|
- bin/setup
|
98
89
|
- lib/algorithmix.rb
|
99
90
|
- lib/algorithmix/data_structure/generic/deque.rb
|
91
|
+
- lib/algorithmix/data_structure/generic/priority_queue.rb
|
100
92
|
- lib/algorithmix/data_structure/generic/queue.rb
|
101
93
|
- lib/algorithmix/data_structure/generic/stack.rb
|
102
94
|
- lib/algorithmix/data_structure/heap/binary_heap.rb
|