PriorityQueue 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/test.rb ADDED
@@ -0,0 +1,11 @@
1
+ class A
2
+ def initialize a
3
+ @a = a
4
+ end
5
+
6
+ def other_a(a)
7
+ a.instance_eval { @a }
8
+ end
9
+ end
10
+
11
+ p A.new(2).other_a(A.new(1))
@@ -0,0 +1,358 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Priority Queue tests
4
+
5
+ $:.unshift '../ext/priority_queue/CPriorityQueue'
6
+ $:.unshift '../lib/'
7
+
8
+ require 'test/unit'
9
+
10
+ require 'priority_queue/ruby_priority_queue'
11
+ require 'priority_queue/poor_priority_queue'
12
+ begin
13
+ require 'priority_queue/CPriorityQueue'
14
+ rescue LoadError
15
+ require 'CPriorityQueue'
16
+ end
17
+
18
+
19
+ module PriorityQueueTest
20
+ # Check that the order is maintained
21
+ def teardown
22
+ last = @q.min_priority
23
+ while priority = @q.delete_min_return_priority
24
+ assert_operator(last, :<=, priority)
25
+ last = priority
26
+ end
27
+ end
28
+
29
+ def test_length
30
+ 20.times do | i |
31
+ assert_equal(i, @q.length)
32
+ @q[i] = i
33
+ end
34
+ 10.times do | i |
35
+ assert_equal(20-i, @q.length)
36
+ @q.delete_min
37
+ end
38
+ 10.times do | i |
39
+ assert_equal(10+i, @q.length)
40
+ @q[i] = i
41
+ end
42
+ @q.delete(5)
43
+ assert_equal(19, @q.length)
44
+ end
45
+
46
+ def test_merge
47
+ @q1 = @q.class.new
48
+ @q2 = @q.class.new
49
+
50
+ 20.times do | i |
51
+ @q1[i] = i
52
+ @q2[i+20] = i+20
53
+ end
54
+ end
55
+
56
+ # Assure that delete min works
57
+ def test_delete_min
58
+ assert_equal(nil, @q.delete_min, "Empty queue should pop nil")
59
+ @q["n1"] = 0
60
+ assert_equal(["n1", 0], @q.delete_min)
61
+ @q["n1"] = 0
62
+ @q["n2"] = -1
63
+ assert_equal(["n2", -1], @q.delete_min)
64
+ end
65
+
66
+ def test_delete_min_return_key
67
+ assert_equal(nil, @q.delete_min_return_key, "Empty queue should pop nil")
68
+ @q["n1"] = 0
69
+ assert_equal("n1", @q.delete_min_return_key)
70
+ @q["n1"] = 0
71
+ @q["n2"] = -1
72
+ assert_equal("n2", @q.delete_min_return_key)
73
+ end
74
+
75
+ def test_delete_min_return_priority
76
+ assert_equal(nil, @q.delete_min_return_priority, "Empty queue should pop nil")
77
+ @q["n1"] = 0
78
+ assert_equal(0, @q.delete_min_return_priority)
79
+ @q["n1"] = 0
80
+ @q["n2"] = -1
81
+ assert_equal(-1, @q.delete_min_return_priority)
82
+ end
83
+
84
+ def test_has_key?
85
+ assert(!@q.has_key?(1))
86
+ @q[1] = 1
87
+ assert(@q.has_key?(1))
88
+ end
89
+
90
+ def test_empty?
91
+ assert_equal(true, @q.empty?, "Empty queue should return true on empty?")
92
+ @q["node1"] = 10
93
+ assert_equal(false, @q.empty?, "Filled queue should return false on empty?")
94
+ end
95
+
96
+ def test_push_pop
97
+ 20.times do | i |
98
+ @q.push i, i
99
+ end
100
+
101
+ 20.times do | i |
102
+ assert_equal([i, i], @q.delete_min)
103
+ end
104
+
105
+ assert_equal(nil, @q.delete_min)
106
+ end
107
+
108
+ def test_push_decrease_pop
109
+ 50.times do | i |
110
+ @q.push i, i
111
+ end
112
+
113
+ 10.times do | i |
114
+ assert_equal([i, i], @q.delete_min)
115
+ end
116
+
117
+ 10.times do | i |
118
+ @q[i+10] = i
119
+ end
120
+
121
+ 10.times do | i |
122
+ assert_equal([i+10, i], @q.delete_min)
123
+ end
124
+
125
+ 30.times do | i |
126
+ assert_equal([i+20, i+20], @q.delete_min)
127
+ end
128
+
129
+ assert_equal(nil, @q.delete_min)
130
+ end
131
+
132
+ def test_min_key
133
+ assert_equal(nil, @q.min_key)
134
+ @q["node1"] = 0
135
+ assert_equal("node1", @q.min_key)
136
+ @q["node2"] = 1
137
+ assert_equal("node1", @q.min_key)
138
+ @q["node3"] = -1
139
+ assert_equal("node3", @q.min_key)
140
+ end
141
+
142
+ def test_min_priority
143
+ assert_equal(nil, @q.min_priority)
144
+ @q["node1"] = 0
145
+ assert_equal(0, @q.min_priority)
146
+ @q["node2"] = 1
147
+ assert_equal(0, @q.min_priority)
148
+ @q["node3"] = -1
149
+ assert_equal(-1, @q.min_priority)
150
+ end
151
+
152
+ def test_access
153
+ assert_equal(0, @q["node1"] = 0)
154
+ assert_equal(["node1", 0], @q.min)
155
+ assert_equal(1, @q["node2"] = 1)
156
+ assert_equal(1, @q["node2"])
157
+ assert_equal("node1", @q.min_key)
158
+ assert_equal(2, @q["node3"] = 2)
159
+ assert_equal(2, @q["node3"])
160
+ assert_equal("node1", @q.min_key)
161
+ assert_equal(-1, @q["node3"] = -1)
162
+ assert_equal(-1, @q["node3"])
163
+ assert_equal("node3", @q.min_key)
164
+ end
165
+
166
+ def test_min
167
+ assert_equal(nil, @q.min)
168
+ @q["node1"] = 10
169
+ assert_equal(["node1", 10], @q.min)
170
+ @q["node2"] = 5
171
+ assert_equal(["node2", 5], @q.min)
172
+ end
173
+
174
+ def test_decrease_priority
175
+
176
+ 20.times do | i |
177
+ @q.push i, i / 20.0
178
+ end
179
+
180
+ assert_equal([0, 0], @q.delete_min)
181
+
182
+ @q[10] = -1
183
+ @q[11] = -0.5
184
+
185
+ [10, 11, (1..9).to_a, (12..19).to_a, nil].flatten.each do | shall |
186
+ key, priority = *@q.delete_min
187
+ assert_equal(shall, key)
188
+ end
189
+ end
190
+
191
+ def test_increase_priority
192
+ 20.times do | i |
193
+ @q[i] = i
194
+ end
195
+ @q[10] = 5
196
+ assert_equal([0,0], @q.delete_min)
197
+ assert_equal(10, @q[10] = 10)
198
+ assert_equal(20, @q[11] = 20)
199
+ assert_equal([1,1], @q.delete_min)
200
+ end
201
+
202
+ def test_delete
203
+ @q[1] = 1
204
+ @q[2] = 2
205
+ @q[3] = 3
206
+ assert_equal(1, @q[1])
207
+ assert_equal([1,1], @q.min)
208
+ assert_equal([1,1], @q.delete(1))
209
+ assert_equal(nil, @q[1])
210
+ assert_equal([2,2], @q.min)
211
+ assert_equal(nil, @q.delete(1))
212
+ end
213
+
214
+ def test_example_1
215
+ assert_equal(0, @q["node1"] = 0)
216
+ assert_equal(1, @q["node2"] = 1)
217
+ assert_equal("node1", @q.min_key)
218
+ assert_equal(0, @q[@q.min_key])
219
+ assert_equal(0, @q.min_priority)
220
+
221
+ @q["node2"] = -1
222
+ assert_equal(["node2", -1], @q.delete_min)
223
+ assert_equal(nil, @q["node2"])
224
+ @q["node3"] = 1
225
+
226
+ assert_equal(["node3", 1], @q.delete("node3"))
227
+ assert_equal(nil, @q.delete("node2"))
228
+ end
229
+
230
+ def test_dup
231
+ ('a'..'z').each do | n |
232
+ @q[n] = n[0]
233
+ end
234
+ qq = @q.dup
235
+ until @q.empty?
236
+ puts "--"
237
+ puts @q.inspect
238
+ puts qq.inspect
239
+ assert_equal(@q.delete_min, qq.delete_min)
240
+ end
241
+ end
242
+
243
+ def test_each
244
+ ('a'..'z').each do | n |
245
+ @q[n] = n[0]
246
+ end
247
+ queue = ('a'..'z').inject([]) { | r, n | r << [n, n[0]] }
248
+ assert_equal(queue.sort, @q.to_a.sort)
249
+ end
250
+
251
+ extend self
252
+ end
253
+
254
+ class CPriorityQueueTest #< Test::Unit::TestCase
255
+ include PriorityQueueTest
256
+
257
+ def setup
258
+ @q = CPriorityQueue.new
259
+ end
260
+
261
+ def test_to_dot
262
+ 5.times do | i |
263
+ @q.push "N#{i}", i
264
+ end
265
+ @q.delete_min
266
+ assert_equal(
267
+ ['digraph fibonaccy_heap {',
268
+ ' NODE [label="N1 (1)",shape=box];',
269
+ ' NODE [label="N3 (3)",shape=box];',
270
+ ' NODE [label="N4 (4)",shape=box];',
271
+ ' NODE -> NODE;',
272
+ ' NODE -> NODE;',
273
+ ' NODE [label="N2 (2)",shape=box];',
274
+ ' NODE -> NODE;',
275
+ '}',''].join("\n"), @q.to_dot.gsub(/NODE[0-9]*/, 'NODE'))
276
+ end
277
+
278
+ end
279
+
280
+ class PoorPriorityQueueTest #< Test::Unit::TestCase
281
+ include PriorityQueueTest
282
+
283
+ def setup
284
+ @q = PoorPriorityQueue.new
285
+ end
286
+
287
+ end
288
+
289
+ class RubyPriorityQueueTest < Test::Unit::TestCase
290
+ include PriorityQueueTest
291
+
292
+ def setup
293
+ @q = RubyPriorityQueue.new
294
+ end
295
+
296
+ def test_private_link_nodes
297
+ q = RubyPriorityQueue.new
298
+ q[0] = 0
299
+ q[1] = 1
300
+ tc = self
301
+ q.instance_eval do
302
+ n0 = @nodes[0]
303
+ n1 = @nodes[1]
304
+ n0.right = n0.left = n0
305
+ n1.right = n1.left = n1
306
+ tc.assert_equal(n0, link_nodes(n0, n1))
307
+ tc.assert_equal(n0.child, n1)
308
+ tc.assert_equal(n1.child, nil)
309
+ tc.assert_equal(n0.left, n0)
310
+ tc.assert_equal(n1.left, n1)
311
+ tc.assert_equal(n0.right, n0)
312
+ tc.assert_equal(n1.right, n1)
313
+ end
314
+ q = RubyPriorityQueue.new
315
+ q[0] = 0
316
+ q[1] = 1
317
+ q.instance_eval do
318
+ n0 = @nodes[0]
319
+ n1 = @nodes[1]
320
+ n0.right = n0.left = n0
321
+ n1.right = n1.left = n1
322
+ tc.assert_equal(n0, link_nodes(n1, n0))
323
+ tc.assert_equal(n0.child, n1)
324
+ tc.assert_equal(n1.child, nil)
325
+ tc.assert_equal(n0.left, n0)
326
+ tc.assert_equal(n1.left, n1)
327
+ tc.assert_equal(n0.right, n0)
328
+ tc.assert_equal(n1.right, n1)
329
+ end
330
+ end
331
+
332
+
333
+ def test_private_delete_first
334
+ q = RubyPriorityQueue.new
335
+ q[0] = 0
336
+ q[1] = 1
337
+ q[2] = 2
338
+ tc = self
339
+ q.instance_eval do
340
+ 2.times do
341
+ r = @rootlist
342
+ tc.assert_equal(r, delete_first)
343
+ tc.assert_equal(r.right, r)
344
+ tc.assert_equal(r.left, r)
345
+ tc.assert_not_equal(r, @rootlist.left)
346
+ tc.assert_not_equal(r, @rootlist.right)
347
+ end
348
+ r = @rootlist
349
+ tc.assert_equal(r, delete_first)
350
+ tc.assert_equal(r.right, r)
351
+ tc.assert_equal(r.left, r)
352
+ tc.assert_equal(nil, @rootlist)
353
+
354
+ tc.assert_equal(nil, delete_first)
355
+ end
356
+ end
357
+ end
358
+
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: PriorityQueue
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2005-10-26 00:00:00 +02:00
8
+ summary: This is a fibonacy heap priority queue implementation
9
+ require_paths:
10
+ - lib
11
+ - lib
12
+ - ext
13
+ email: priority_queue@brian-schroeder.de
14
+ homepage: http://ruby.brian-schroeder.de/priority_queue
15
+ rubyforge_project:
16
+ description: "This is a fibonacy heap priority queue implementation. That means insert:
17
+ O(1) decrease_priority: Amortized O(1) delete_min: Amortized O(log n)
18
+ This project is different from K. Kodamas PQueue in that it allows a decrease
19
+ key operation. That makes PriorityQueue usable for algorithms like dijkstras
20
+ shortest path algorithm, while PQueue is more suitable for Heapsort and the
21
+ like."
22
+ autorequire: priority_queue.rb
23
+ default_executable:
24
+ bindir: bin
25
+ has_rdoc: true
26
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
27
+ requirements:
28
+ -
29
+ - ">"
30
+ - !ruby/object:Gem::Version
31
+ version: 0.0.0
32
+ version:
33
+ platform: ruby
34
+ signing_key:
35
+ cert_chain:
36
+ authors:
37
+ - Brian Schroeder
38
+ files:
39
+ - README
40
+ - test.rb
41
+ - CHANGELOG
42
+ - setup.rb
43
+ - doc
44
+ - ext
45
+ - lib
46
+ - test
47
+ - benchmark
48
+ - doc/result-PriorityQueue.png
49
+ - doc/results.png
50
+ - doc/result-PoorPriorityQueue.png
51
+ - doc/result-RubyPriorityQueue.png
52
+ - ext/priority_queue
53
+ - ext/priority_queue/extconf.rb
54
+ - ext/priority_queue/priority_queue.c
55
+ - lib/priority_queue.rb
56
+ - lib/priority_queue
57
+ - lib/priority_queue/poor_priority_queue.rb
58
+ - lib/priority_queue/ruby_priority_queue.rb
59
+ - test/priority_queue_test.rb
60
+ - benchmark/result-PriorityQueue.gp
61
+ - benchmark/result-RubyPriorityQueue.gp
62
+ - benchmark/dijkstra.rb
63
+ - benchmark/result-PoorPriorityQueue.gp
64
+ - benchmark/result-CPriorityQueue.png
65
+ - benchmark/results.csv
66
+ - benchmark/results.png
67
+ - benchmark/result-PoorPriorityQueue.png
68
+ - benchmark/result-RubyPriorityQueue.png
69
+ - benchmark/results.gp
70
+ - benchmark/result-CPriorityQueue.gp
71
+ test_files: []
72
+ rdoc_options: []
73
+ extra_rdoc_files: []
74
+ executables: []
75
+ extensions:
76
+ - ext/priority_queue/extconf.rb
77
+ requirements: []
78
+ dependencies: []