algorithmable 0.3.0 → 0.4.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0dedcc11bcfa5814e48d25ba1090a2495e187b1
|
4
|
+
data.tar.gz: 79d772b02883f4550b8abdc3b48afe7c60e96d89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e8f1d7d60d1bcba3a293c9860516a9bf42d1ac847e2bd7f532f9b33a649b45e89125d1e645c8735d16b6b77d6a0f659da36adbd8d133a22b64b2c9b1529deb9
|
7
|
+
data.tar.gz: b47c85b9d228aef4ebea3d03fe5eefa4a2c41951eb94438b902835dadf1c437270a58dd125c0b1c5ed6e1d78e4e42098ea47dc8fe1c27844b6bd6c9ae7571f7a
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'thread'
|
2
|
+
module Algorithmable
|
3
|
+
module Graphs
|
4
|
+
module Traversals
|
5
|
+
class BreadthFirst
|
6
|
+
include Algorithmable::Graphs::Traversals::Errors
|
7
|
+
|
8
|
+
def initialize(graph, source)
|
9
|
+
vertices_size = graph.vertices.size
|
10
|
+
@visited = Array.new(vertices_size - 1)
|
11
|
+
@edge_to = Array.new(vertices_size - 1)
|
12
|
+
@source = source
|
13
|
+
traverse graph, source
|
14
|
+
end
|
15
|
+
|
16
|
+
def visited?(vertex)
|
17
|
+
@visited[vertex]
|
18
|
+
end
|
19
|
+
|
20
|
+
def path_to(vertex)
|
21
|
+
fail UnvisitedVertexError, vertex unless visited?(vertex)
|
22
|
+
path = []
|
23
|
+
finish = vertex
|
24
|
+
while finish != @source
|
25
|
+
path.push finish
|
26
|
+
finish = @edge_to[finish]
|
27
|
+
end
|
28
|
+
path.push @source
|
29
|
+
path
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def traverse(graph, vertex)
|
35
|
+
queue = ::Queue.new
|
36
|
+
@visited[vertex] = true
|
37
|
+
queue.enq vertex
|
38
|
+
until queue.empty?
|
39
|
+
next_vertex = queue.deq
|
40
|
+
graph.adjacency(next_vertex).each do |neighbour_vertex|
|
41
|
+
unless visited? neighbour_vertex
|
42
|
+
@edge_to[neighbour_vertex] = next_vertex
|
43
|
+
@visited[neighbour_vertex] = true
|
44
|
+
queue.enq neighbour_vertex
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -3,11 +3,15 @@ module Algorithmable
|
|
3
3
|
module Traversals
|
4
4
|
autoload :Errors, 'algorithmable/graphs/traversals/errors'
|
5
5
|
autoload :DepthFirst, 'algorithmable/graphs/traversals/depth_first'
|
6
|
-
autoload :
|
6
|
+
autoload :BreadthFirst, 'algorithmable/graphs/traversals/breadth_first'
|
7
7
|
|
8
8
|
def traverse_with_depth_first(graph, source)
|
9
9
|
DepthFirst.new(graph, source)
|
10
10
|
end
|
11
|
+
|
12
|
+
def traverse_with_breadth_first(graph, source)
|
13
|
+
BreadthFirst.new(graph, source)
|
14
|
+
end
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -21,6 +21,27 @@ module Algorithmable
|
|
21
21
|
def adjacency(vertex)
|
22
22
|
@adj[vertex]
|
23
23
|
end
|
24
|
+
|
25
|
+
def valid_vertex?(vertex)
|
26
|
+
!(0 > vertex || vertex >= @vertices)
|
27
|
+
end
|
28
|
+
|
29
|
+
def degree(vertex)
|
30
|
+
raise "Vertex #{vertex} is not valid." unless valid_vertex?(vertex)
|
31
|
+
adjacency(vertex).size
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
data = ''
|
36
|
+
@vertices.times do |vertex|
|
37
|
+
data += "( #{vertex} => "
|
38
|
+
@adj[vertex].each do |neighbor|
|
39
|
+
data += "#{neighbor} "
|
40
|
+
end
|
41
|
+
data += ') '
|
42
|
+
end
|
43
|
+
"#<#{self.class} @vertices=#{@vertices} @edges=#{@edges} @data=#{data}>"
|
44
|
+
end
|
24
45
|
end
|
25
46
|
end
|
26
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algorithmable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Lishtaba
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- lib/algorithmable.rb
|
143
143
|
- lib/algorithmable/graphs.rb
|
144
144
|
- lib/algorithmable/graphs/traversals.rb
|
145
|
+
- lib/algorithmable/graphs/traversals/breadth_first.rb
|
145
146
|
- lib/algorithmable/graphs/traversals/depth_first.rb
|
146
147
|
- lib/algorithmable/graphs/traversals/errors.rb
|
147
148
|
- lib/algorithmable/graphs/undirected.rb
|