algorithmable 0.3.0 → 0.4.0
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
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
|