PriorityQueue 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/README +53 -5
- data/benchmark/dijkstra.rb +7 -5
- data/doc/c-vs-rb.png +0 -0
- data/doc/compare_big.gp +14 -0
- data/doc/compare_big.png +0 -0
- data/doc/compare_small.gp +15 -0
- data/doc/compare_small.png +0 -0
- data/doc/results.csv +37 -0
- data/ext/priority_queue/priority_queue.c +0 -1
- data/lib/priority_queue/c_priority_queue.rb +1 -0
- data/priority_queue.o +0 -0
- data/priority_queue.so +0 -0
- metadata +49 -41
- data/t.rb +0 -18
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
0.1.2
|
2
|
+
* Repaired benchmark
|
3
|
+
* Added c_priority_queue wrapper, such that one can now require versions
|
4
|
+
explicitly using:
|
5
|
+
require "priority_queue/(c|ruby|poor)_priority_queue"
|
6
|
+
* Improved README
|
7
|
+
|
1
8
|
0.1.1
|
2
9
|
* Removed debug cruft
|
3
10
|
* Added more documentation and examples
|
data/README
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
## Description
|
4
4
|
This is a fibonacci-heap priority-queue implementation. That means
|
5
5
|
|
6
|
-
insert: O(1)
|
7
|
-
decrease_priority: Amortized O(1)
|
8
|
-
delete_min: Amortized O(log n)
|
6
|
+
insert: O(1)
|
7
|
+
decrease_priority: Amortized O(1)
|
8
|
+
delete_min: Amortized O(log n)
|
9
9
|
|
10
10
|
This project is different from K. Kodamas PQueue in that it allows a decrease
|
11
11
|
key operation. That makes PriorityQueue usable for algorithms like dijkstras
|
@@ -29,17 +29,24 @@ guarantee it will work for you.
|
|
29
29
|
|
30
30
|
## Installation
|
31
31
|
|
32
|
+
### Installing from source
|
33
|
+
|
32
34
|
De-compress archive and enter its top directory.
|
33
35
|
Then type:
|
34
36
|
|
35
37
|
($ su)
|
36
|
-
|
38
|
+
# ruby setup.rb
|
37
39
|
|
38
40
|
These simple step installs this program under the default
|
39
41
|
location of Ruby libraries. You can also install files into
|
40
42
|
your favorite directory by supplying setup.rb some options.
|
41
43
|
Try "ruby setup.rb --help".
|
42
44
|
|
45
|
+
### Installing a ruby gem
|
46
|
+
|
47
|
+
($ su)
|
48
|
+
# gem install PriorityQueue
|
49
|
+
|
43
50
|
## Usage
|
44
51
|
|
45
52
|
In this priority queue implementation the queue behaves similarly to a hash
|
@@ -81,5 +88,46 @@ that maps objects onto priorities.
|
|
81
88
|
for more exmples look into the documentation, the unit tests and the benchmark
|
82
89
|
suite.
|
83
90
|
|
84
|
-
|
91
|
+
### Dijkstras shortest path algorithm
|
92
|
+
def dijkstra(start_node)
|
93
|
+
# Nodes that may have neighbours wich can be relaxed further
|
94
|
+
active = PriorityQueue.new
|
95
|
+
# Best distances found so far
|
96
|
+
distances = Hash.new { 1.0 / 0.0 }
|
97
|
+
# Parent pointers describing shortest paths for all nodes
|
98
|
+
parents = Hash.new
|
99
|
+
|
100
|
+
# Initialize with start node
|
101
|
+
active[start_node] = 0
|
102
|
+
until active.empty?
|
103
|
+
u, distance = active.delete_min
|
104
|
+
distances[u] = distance
|
105
|
+
d = distance + 1
|
106
|
+
u.neighbours.each do | v |
|
107
|
+
next unless d < distances[v] # we can't relax this one
|
108
|
+
active[v] = distances[v] = d
|
109
|
+
parents[v] = u
|
110
|
+
end
|
111
|
+
end
|
112
|
+
parents
|
113
|
+
end
|
114
|
+
|
115
|
+
## Performance
|
116
|
+
The benchmark directory contains an example where a random graph is created and
|
117
|
+
the shortests paths from a random node in this graph to all other nodes are
|
118
|
+
calculated with dijkstras shortests path algorithm. The algorithm is used to
|
119
|
+
compare the three different priority queue implementations in this package.
|
120
|
+
|
121
|
+
* PoorPriorityQueue: A minimal priority queue implementation wich has
|
122
|
+
delete_min in O(n).
|
123
|
+
* RubyPriorityQueue: An efficent implementation in pure ruby.
|
124
|
+
* CPriorityQueue: The same efficent implementation as a c extension.
|
125
|
+
|
126
|
+
The results are shown here
|
127
|
+
|
128
|
+
![Runtime for graphs of up to 8_000 Nodes](doc/compare_small.png "Runtime for graphs of up to 8_000 Nodes")
|
129
|
+
|
130
|
+
![Runtime for graphs of up to 600_000 Nodes](doc/compare_big.png "Runtime for graphs of up to 600_000 Nodes")
|
131
|
+
|
132
|
+
## Todo
|
85
133
|
* Only write documentation once
|
data/benchmark/dijkstra.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
1
|
+
$:.unshift "~/lib/ruby"
|
2
|
+
require 'priority_queue/ruby_priority_queue'
|
3
|
+
require 'priority_queue/poor_priority_queue'
|
4
|
+
require 'priority_queue/c_priority_queue'
|
5
5
|
require 'benchmark'
|
6
6
|
|
7
7
|
class Node
|
@@ -79,6 +79,7 @@ degrees = [2, 4, 16]
|
|
79
79
|
degrees = [4, 16]
|
80
80
|
degrees = [16]
|
81
81
|
queues = [ CPriorityQueue, PoorPriorityQueue, RubyPriorityQueue ]
|
82
|
+
queues = [ CPriorityQueue, RubyPriorityQueue ]
|
82
83
|
|
83
84
|
max_time = 400
|
84
85
|
ignore = Hash.new
|
@@ -96,8 +97,9 @@ results = Hash.new { | h, k | h[k] =
|
|
96
97
|
Benchmark.bm(30) do | b |
|
97
98
|
sizes.each do | size |
|
98
99
|
break if !ignore.empty? and ignore.values.inject(true) { | r, v | r and v }
|
100
|
+
puts
|
101
|
+
puts "Testing with graphs of size #{size}"
|
99
102
|
degrees.each do | degree |
|
100
|
-
p ignore
|
101
103
|
repeats.times do | r |
|
102
104
|
nodes = make_graph(size, degree)
|
103
105
|
queues.each do | queue |
|
data/doc/c-vs-rb.png
ADDED
Binary file
|
data/doc/compare_big.gp
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
set term png
|
2
|
+
set out 'compare_big.png'
|
3
|
+
set xlabel 'Number of nodes'
|
4
|
+
set ylabel 'Time in seconds (real)'
|
5
|
+
set yrange [0:240]
|
6
|
+
set ytics 30
|
7
|
+
set grid ytics mytics
|
8
|
+
set mytics 2
|
9
|
+
#set logscale xy
|
10
|
+
set title 'Dijkstras Shortest Path Algorithm using different PQ Implementations'
|
11
|
+
plot \
|
12
|
+
'results.csv' using 1:2 with lines title "CPriorityQueue (Graph of Degree: 4)",\
|
13
|
+
'results.csv' using 1:4 with lines title "RubyPriorityQueue (Graph of Degree: 4)", \
|
14
|
+
'results.csv' using 1:3 with lines title "PoorPriorityQueue (Graph of Degree: 4)"
|
data/doc/compare_big.png
ADDED
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
set term png
|
2
|
+
set out 'compare_small.png'
|
3
|
+
set xlabel 'Number of nodes'
|
4
|
+
set ylabel 'Time in seconds (real)'
|
5
|
+
set yrange [0:60]
|
6
|
+
set xrange [0:8000]
|
7
|
+
set ytics 15
|
8
|
+
set grid ytics mytics
|
9
|
+
set mytics 3
|
10
|
+
#set logscale xy
|
11
|
+
set title 'Dijkstras Shortest Path Algorithm using different PQ Implementations'
|
12
|
+
plot \
|
13
|
+
'results.csv' using 1:2 with lines title "CPriorityQueue (Graph of Degree: 4)",\
|
14
|
+
'results.csv' using 1:4 with lines title "RubyPriorityQueue (Graph of Degree: 4)", \
|
15
|
+
'results.csv' using 1:3 with lines title "PoorPriorityQueue (Graph of Degree: 4)"
|
Binary file
|
data/doc/results.csv
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
size "CPriorityQueue (Graph of Degree: 4)" "PoorPriorityQueue (Graph of Degree: 4)" "RubyPriorityQueue (Graph of Degree: 4)"
|
2
|
+
100 0.00224618911743164 0.00624475479125977 0.00999178886413574
|
3
|
+
200 0.00454645156860352 0.0206499099731445 0.0216238498687744
|
4
|
+
300 0.00689601898193359 0.0456759929656982 0.0333521842956543
|
5
|
+
400 0.00930037498474121 0.0799281597137451 0.0460003852844238
|
6
|
+
500 0.0121791362762451 0.120535612106323 0.0602848052978516
|
7
|
+
600 0.0147404193878174 0.175632238388062 0.0720498085021973
|
8
|
+
700 0.017409610748291 0.239475774765015 0.0866350173950195
|
9
|
+
800 0.019864559173584 0.308732604980469 0.0979691028594971
|
10
|
+
900 0.0226212501525879 0.394028520584106 0.11493763923645
|
11
|
+
1000 0.0251464366912842 0.487221813201904 0.125885772705078
|
12
|
+
2000 0.0565140247344971 2.28050599098206 0.276543807983398
|
13
|
+
3000 0.085650634765625 6.21102161407471 0.448645544052124
|
14
|
+
4000 0.10867018699646 8.67334637641907 0.573670101165771
|
15
|
+
5000 0.138333988189697 14.8025764465332 0.749224042892456
|
16
|
+
6000 0.188258218765259 23.5921889781952 0.926058626174927
|
17
|
+
7000 0.22198920249939 35.1978524208069 1.12497220039368
|
18
|
+
8000 0.253745651245117 51.36594581604 1.34597997665405
|
19
|
+
9000 0.261373472213745 48.2841837882996 1.37383661270142
|
20
|
+
10000 0.296752548217773 63.1833290576935 1.60117835998535
|
21
|
+
20000 0.624662017822266 277.677141237259 3.37345514297485
|
22
|
+
30000 1.0169261932373 733.016969585419 5.47739477157593
|
23
|
+
40000 1.29656438827515 '' 7.03887400627136
|
24
|
+
50000 1.84444799423218 '' 9.04675197601318
|
25
|
+
60000 2.16575860977173 '' 11.4338163852692
|
26
|
+
70000 2.34671788215637 '' 12.989319562912
|
27
|
+
80000 2.91462659835815 '' 14.7507841110229
|
28
|
+
90000 3.36594500541687 '' 17.4672434329987
|
29
|
+
100000 3.74284019470215 '' 19.7872510433197
|
30
|
+
200000 8.33274736404419 '' 44.0830686569214
|
31
|
+
300000 15.3942915916443 '' 75.2278475284576
|
32
|
+
400000 22.4600916385651 '' 109.477935791016
|
33
|
+
500000 29.9784585952759 '' 150.160971403122
|
34
|
+
600000 37.4891954421997 '' 192.808595132828
|
35
|
+
700000 '' '' ''
|
36
|
+
800000 '' '' ''
|
37
|
+
900000 '' '' ''
|
@@ -0,0 +1 @@
|
|
1
|
+
require "priority_queue/CPriorityQueue"
|
data/priority_queue.o
CHANGED
Binary file
|
data/priority_queue.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,67 +1,75 @@
|
|
1
|
-
!ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
rubygems_version: 0.8.11
|
3
3
|
specification_version: 1
|
4
4
|
name: PriorityQueue
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2005-10-
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2005-10-30 00:00:00 +02:00
|
8
8
|
summary: This is a fibonacci-heap priority-queue implementation
|
9
9
|
require_paths:
|
10
|
-
- lib
|
11
|
-
- lib
|
12
|
-
- ext
|
10
|
+
- lib
|
11
|
+
- lib
|
12
|
+
- ext
|
13
13
|
email: priority_queue@brian-schroeder.de
|
14
14
|
homepage: http://ruby.brian-schroeder.de/priority_queue
|
15
15
|
rubyforge_project:
|
16
|
-
description: "This is a fibonacci-heap priority-queue implementation. That means insert:
|
16
|
+
description: "This is a fibonacci-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."
|
17
22
|
autorequire: priority_queue.rb
|
18
23
|
default_executable:
|
19
24
|
bindir: bin
|
20
25
|
has_rdoc: true
|
21
26
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
22
27
|
requirements:
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
-
|
29
|
+
- ">"
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 0.0.0
|
26
32
|
version:
|
27
33
|
platform: ruby
|
28
34
|
signing_key:
|
29
35
|
cert_chain:
|
30
36
|
authors:
|
31
|
-
- Brian Schroeder
|
37
|
+
- Brian Schroeder
|
32
38
|
files:
|
33
|
-
-
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
37
|
-
-
|
38
|
-
-
|
39
|
-
-
|
40
|
-
-
|
41
|
-
- ext
|
42
|
-
- lib
|
43
|
-
- test
|
44
|
-
- benchmark
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
-
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
52
|
-
-
|
53
|
-
-
|
54
|
-
|
55
|
-
|
39
|
+
- Makefile
|
40
|
+
- priority_queue.so
|
41
|
+
- README
|
42
|
+
- priority_queue.o
|
43
|
+
- compare_comments.rb
|
44
|
+
- CHANGELOG
|
45
|
+
- setup.rb
|
46
|
+
- doc
|
47
|
+
- ext
|
48
|
+
- lib
|
49
|
+
- test
|
50
|
+
- benchmark
|
51
|
+
- doc/compare_big.gp
|
52
|
+
- doc/compare_big.png
|
53
|
+
- doc/compare_small.gp
|
54
|
+
- doc/compare_small.png
|
55
|
+
- doc/results.csv
|
56
|
+
- doc/c-vs-rb.png
|
57
|
+
- ext/priority_queue
|
58
|
+
- ext/priority_queue/extconf.rb
|
59
|
+
- ext/priority_queue/priority_queue.c
|
60
|
+
- lib/priority_queue.rb
|
61
|
+
- lib/priority_queue
|
62
|
+
- lib/priority_queue/c_priority_queue.rb
|
63
|
+
- lib/priority_queue/poor_priority_queue.rb
|
64
|
+
- lib/priority_queue/ruby_priority_queue.rb
|
65
|
+
- test/priority_queue_test.rb
|
66
|
+
- benchmark/dijkstra.rb
|
67
|
+
test_files:
|
68
|
+
- test/priority_queue_test.rb
|
56
69
|
rdoc_options: []
|
57
|
-
|
58
70
|
extra_rdoc_files: []
|
59
|
-
|
60
71
|
executables: []
|
61
|
-
|
62
72
|
extensions:
|
63
|
-
- ext/priority_queue/extconf.rb
|
73
|
+
- ext/priority_queue/extconf.rb
|
64
74
|
requirements: []
|
65
|
-
|
66
|
-
dependencies: []
|
67
|
-
|
75
|
+
dependencies: []
|