ds 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +11 -0
- data/.rubocop_todo.yml +452 -0
- data/.travis.yml +12 -0
- data/Gemfile +1 -1
- data/README.rdoc +185 -214
- data/Rakefile +8 -3
- data/ds.gemspec +16 -13
- data/lib/ds.rb +20 -30
- data/lib/ds/{matrixes → arrays}/array_2d.rb +9 -10
- data/lib/ds/arrays/expandable_array.rb +34 -0
- data/lib/ds/arrays/heap_store.rb +32 -0
- data/lib/ds/arrays/tri_matrix.rb +33 -0
- data/lib/ds/lists/list.rb +310 -186
- data/lib/ds/lists/list_element.rb +14 -11
- data/lib/ds/pair.rb +4 -4
- data/lib/ds/queues/priority_queue.rb +33 -20
- data/lib/ds/queues/simple_queue.rb +55 -0
- data/lib/ds/sets/indexed_set.rb +37 -0
- data/lib/ds/stacks/stack.rb +25 -17
- data/lib/ds/trees/binary_heap.rb +71 -66
- data/lib/ds/trees/binary_tree.rb +40 -44
- data/lib/ds/trees/red_black_tree.rb +123 -0
- data/lib/ds/trees/red_black_tree/node.rb +21 -0
- data/lib/ds/trees/tree.rb +50 -48
- data/lib/ds/trees/tree_walker.rb +73 -144
- data/lib/ds/trees/trie.rb +67 -37
- data/lib/ds/trees/trie/node.rb +48 -0
- data/lib/ds/version.rb +2 -1
- data/test/help.rb +3 -6
- data/test/performance/binary_heap_performance_test.rb +20 -0
- data/test/performance/list_performance_test.rb +36 -0
- data/test/performance/priority_queue_performance.rb +32 -0
- data/test/performance/rbt_performance_test.rb +17 -0
- data/test/performance/simple_queue_performance_test.rb +37 -0
- data/test/performance/stack_test.rb +45 -0
- data/test/test_array2d.rb +29 -31
- data/test/test_binary_heap.rb +29 -23
- data/test/test_binary_tree.rb +30 -20
- data/test/test_expandable_array.rb +6 -10
- data/test/test_heap_store.rb +34 -0
- data/test/test_indexed_set.rb +26 -0
- data/test/test_list.rb +226 -109
- data/test/test_list_element.rb +34 -16
- data/test/test_pair.rb +5 -8
- data/test/test_priority_queue.rb +43 -64
- data/test/test_queue.rb +12 -61
- data/test/test_red_black_tree.rb +46 -0
- data/test/test_stack.rb +35 -39
- data/test/test_tree.rb +42 -29
- data/test/test_tree_walker.rb +27 -52
- data/test/test_tri_matrix.rb +6 -11
- data/test/test_trie.rb +59 -17
- metadata +80 -35
- data/lib/ds/ext/array_x.rb +0 -35
- data/lib/ds/graphs/digraph.rb +0 -20
- data/lib/ds/graphs/edge.rb +0 -15
- data/lib/ds/graphs/graph.rb +0 -111
- data/lib/ds/graphs/graph_as_matrix.rb +0 -113
- data/lib/ds/graphs/graph_as_tri_matrix.rb +0 -24
- data/lib/ds/lists/cyclic_list.rb +0 -21
- data/lib/ds/lists/ring.rb +0 -42
- data/lib/ds/matrixes/expandable_array.rb +0 -37
- data/lib/ds/matrixes/tri_matrix.rb +0 -30
- data/lib/ds/queues/queue.rb +0 -53
- data/lib/ds/sets/ordered_set.rb +0 -32
- data/lib/ds/trees/binary_search_tree.rb +0 -34
- data/lib/ds/trees/complete_binary_tree.rb +0 -60
- data/test/test_array_x.rb +0 -51
- data/test/test_binary_search_tree.rb +0 -39
- data/test/test_complete_binary_tree.rb +0 -58
- data/test/test_digraph.rb +0 -134
- data/test/test_graph.rb +0 -80
- data/test/test_ordered_set.rb +0 -28
- data/test/test_ring.rb +0 -28
data/test/test_digraph.rb
DELETED
@@ -1,134 +0,0 @@
|
|
1
|
-
require 'help'
|
2
|
-
|
3
|
-
describe Digraph do
|
4
|
-
|
5
|
-
describe "without weighted edges" do
|
6
|
-
|
7
|
-
before do
|
8
|
-
|
9
|
-
edges = []
|
10
|
-
edges << Edge.new('Lukas','Marc')
|
11
|
-
edges << Edge.new('Lukas','Tom')
|
12
|
-
edges << Edge.new('Marc','Jack')
|
13
|
-
edges << Edge.new('Jack','Marc')
|
14
|
-
edges << Edge.new('Tom','Marc')
|
15
|
-
|
16
|
-
@digraph = Digraph.create(edges)
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
it "#degree should return vertex degree." do
|
21
|
-
@digraph.degree("Marc").must_equal 4
|
22
|
-
@digraph.degree("Tom").must_equal 2
|
23
|
-
@digraph.degree("Lukas").must_equal 2
|
24
|
-
end
|
25
|
-
|
26
|
-
it "#in_degree should return number of incoming edges to the vertex." do
|
27
|
-
@digraph.in_degree("Marc").must_equal 3
|
28
|
-
@digraph.in_degree("Tom").must_equal 1
|
29
|
-
@digraph.in_degree("Lukas").must_equal 0
|
30
|
-
end
|
31
|
-
|
32
|
-
it "#out_degree should return number of outgoing edges from vertex." do
|
33
|
-
@digraph.out_degree("Marc").must_equal 1
|
34
|
-
@digraph.out_degree("Tom").must_equal 1
|
35
|
-
@digraph.out_degree("Lukas").must_equal 2
|
36
|
-
end
|
37
|
-
|
38
|
-
it "#get_edge should return graph edge." do
|
39
|
-
lukas_tom = @digraph.get_edge("Lukas","Tom")
|
40
|
-
lukas_tom.from.must_equal "Lukas"
|
41
|
-
lukas_tom.to.must_equal "Tom"
|
42
|
-
lukas_tom.weight.must_equal 1
|
43
|
-
lukas_tom.must_be_instance_of Edge
|
44
|
-
end
|
45
|
-
|
46
|
-
it "#edge? should check if two vertex are connected." do
|
47
|
-
refute @digraph.edge?("Marc","Tom")
|
48
|
-
refute @digraph.edge?("Jack","Tom")
|
49
|
-
refute @digraph.edge?("Tom","Lukas")
|
50
|
-
|
51
|
-
assert @digraph.edge?("Tom","Marc")
|
52
|
-
assert @digraph.edge?("Lukas","Marc")
|
53
|
-
end
|
54
|
-
|
55
|
-
it "#neighbors should return array containing all neighbors for given vertex." do
|
56
|
-
n = @digraph.neighbors('Tom')
|
57
|
-
n.must_be_instance_of Array
|
58
|
-
n.size.must_equal 1
|
59
|
-
assert n.include?("Marc")
|
60
|
-
refute n.include?("Lukas")
|
61
|
-
refute n.include?("Jack")
|
62
|
-
end
|
63
|
-
|
64
|
-
it "#add_edge should add new edge." do
|
65
|
-
@digraph.add_edges([Edge.new("Marc","Kate")])
|
66
|
-
@digraph.vertex_size.must_equal 5
|
67
|
-
assert @digraph.edge?("Marc","Kate")
|
68
|
-
refute @digraph.edge?("Kate","Marc")
|
69
|
-
refute @digraph.edge?("Tom","Kate")
|
70
|
-
end
|
71
|
-
|
72
|
-
it "#remove_edge should remove edge." do
|
73
|
-
@digraph.remove("Marc","Jack")
|
74
|
-
@digraph.vertex_size.must_equal 4
|
75
|
-
refute @digraph.edge?("Marc","Jack")
|
76
|
-
assert @digraph.edge?("Jack","Marc")
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
describe "with weighted edges" do
|
82
|
-
|
83
|
-
before do
|
84
|
-
edges = []
|
85
|
-
|
86
|
-
edges << Edge.new(:A,:C,5)
|
87
|
-
edges << Edge.new(:A,:D,3)
|
88
|
-
edges << Edge.new(:A,:G,14)
|
89
|
-
edges << Edge.new(:C,:E,3)
|
90
|
-
edges << Edge.new(:C,:F,2)
|
91
|
-
edges << Edge.new(:D,:C,11)
|
92
|
-
edges << Edge.new(:D,:E,7)
|
93
|
-
edges << Edge.new(:D,:G,6)
|
94
|
-
edges << Edge.new(:G,:E,7)
|
95
|
-
edges << Edge.new(:E,:B,5)
|
96
|
-
edges << Edge.new(:G,:B,6)
|
97
|
-
edges << Edge.new(:F,:B,7)
|
98
|
-
|
99
|
-
@wdigraph = Digraph.create(edges)
|
100
|
-
end
|
101
|
-
|
102
|
-
it "edge should be assigned a weight." do
|
103
|
-
d_c = @wdigraph.get_edge(:D,:C)
|
104
|
-
d_c.weight.must_equal 11
|
105
|
-
d_c.from.must_equal :D
|
106
|
-
d_c.to.must_equal :C
|
107
|
-
d_c.must_be_instance_of Edge
|
108
|
-
end
|
109
|
-
|
110
|
-
it "#degree should return vertex degree." do
|
111
|
-
@wdigraph.degree(:E).must_equal 4
|
112
|
-
@wdigraph.degree(:C).must_equal 4
|
113
|
-
@wdigraph.degree(:A).must_equal 3
|
114
|
-
end
|
115
|
-
|
116
|
-
it "#in_degree should return number of incoming edges to the vertex." do
|
117
|
-
@wdigraph.in_degree(:E).must_equal 3
|
118
|
-
@wdigraph.in_degree(:C).must_equal 2
|
119
|
-
@wdigraph.in_degree(:A).must_equal 0
|
120
|
-
end
|
121
|
-
|
122
|
-
it "#out_degree should return number of outgoing edges from vertex." do
|
123
|
-
@wdigraph.out_degree(:E).must_equal 1
|
124
|
-
@wdigraph.out_degree(:B).must_equal 0
|
125
|
-
@wdigraph.out_degree(:A).must_equal 3
|
126
|
-
end
|
127
|
-
|
128
|
-
it "#bfs should iterate over graph in bfs order." do
|
129
|
-
@wdigraph.bfs(:A).must_equal [:A, :C, :D, :G, :E, :F, :B]
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
|
data/test/test_graph.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'help'
|
2
|
-
|
3
|
-
describe Graph do
|
4
|
-
|
5
|
-
before do
|
6
|
-
edges = []
|
7
|
-
edges << Edge.new('Lukas','Marc')
|
8
|
-
edges << Edge.new('Lukas','Tom')
|
9
|
-
edges << Edge.new('Marc','Jack')
|
10
|
-
edges << Edge.new('Tom','Marc')
|
11
|
-
@graph = Graph.create(edges)
|
12
|
-
end
|
13
|
-
|
14
|
-
it "#vertex_size should return number of vertexes" do
|
15
|
-
@graph.vertex_size.must_equal 4
|
16
|
-
end
|
17
|
-
|
18
|
-
it "#degree should return degree for given vertex." do
|
19
|
-
@graph.degree("Marc").must_equal 3
|
20
|
-
@graph.degree("Jack").must_equal 1
|
21
|
-
@graph.degree("Lukas").must_equal 2
|
22
|
-
@graph.degree("Tom").must_equal 2
|
23
|
-
end
|
24
|
-
|
25
|
-
it "#edge? should check if given vertexes are connected." do
|
26
|
-
assert @graph.edge?("Marc","Tom")
|
27
|
-
assert @graph.edge?("Tom","Marc")
|
28
|
-
refute @graph.edge?("Tom","Jack")
|
29
|
-
refute @graph.edge?("Jack","Tom")
|
30
|
-
end
|
31
|
-
|
32
|
-
it "#add_edges should add new edges." do
|
33
|
-
@graph.add_edges([Edge.new("Marc","Kate")])
|
34
|
-
@graph.vertex_size.must_equal 5
|
35
|
-
assert @graph.edge?("Marc","Kate")
|
36
|
-
assert @graph.edge?("Kate","Marc")
|
37
|
-
refute @graph.edge?("Tom","Kate")
|
38
|
-
end
|
39
|
-
|
40
|
-
it "#add should add new edge to graph." do
|
41
|
-
@graph.add('Jack','Lukas')
|
42
|
-
@graph.vertex_size.must_equal 4
|
43
|
-
assert @graph.edge?("Jack","Lukas")
|
44
|
-
assert @graph.edge?("Lukas","Jack")
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
it "#remove_edge should remove edge." do
|
50
|
-
@graph.remove("Marc","Jack")
|
51
|
-
@graph.vertex_size.must_equal 4
|
52
|
-
refute @graph.edge?("Marc","Jack")
|
53
|
-
refute @graph.edge?("Jack","Marc")
|
54
|
-
end
|
55
|
-
|
56
|
-
it "#neighbors should return all neighbors for given vertex." do
|
57
|
-
n = @graph.neighbors('Tom')
|
58
|
-
n.must_be_instance_of Array
|
59
|
-
n.size.must_equal 2
|
60
|
-
assert n.include?("Marc")
|
61
|
-
assert n.include?("Lukas")
|
62
|
-
refute n.include?("Jack")
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should iterate edges." do
|
66
|
-
r = []
|
67
|
-
@graph.each_edge{|e| r.push e}
|
68
|
-
r.size.must_equal 4
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should iterate vertexes." do
|
72
|
-
r = []
|
73
|
-
@graph.each_vertex { |v| r.push v }
|
74
|
-
r.size.must_equal 4
|
75
|
-
r.sort.must_equal ['Jack','Lukas', 'Marc', 'Tom' ]
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
|
data/test/test_ordered_set.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'help'
|
2
|
-
|
3
|
-
describe "OrderedSet" do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@set = OrderedSet.new
|
7
|
-
@set.push(:first).must_equal 0
|
8
|
-
end
|
9
|
-
|
10
|
-
it "#push should add new element to set and return its index." do
|
11
|
-
@set.push(:second).must_equal 1
|
12
|
-
@set.push(:first).must_equal 0
|
13
|
-
end
|
14
|
-
|
15
|
-
it "#index should return element index." do
|
16
|
-
@set.index(:first).must_equal 0
|
17
|
-
@set.push(:second)
|
18
|
-
@set.index(:second).must_equal 1
|
19
|
-
@set.index(:non_exist).must_be_nil
|
20
|
-
end
|
21
|
-
|
22
|
-
it "#to_a should return array." do
|
23
|
-
@set.push(:second)
|
24
|
-
@set.to_a.must_equal [:first,:second]
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
data/test/test_ring.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'help'
|
2
|
-
|
3
|
-
describe "Cyclic List" do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@ring = Ring.from_array([1,2,3,4,5,6,7])
|
7
|
-
end
|
8
|
-
|
9
|
-
it "#from_array should create ring from array." do
|
10
|
-
@ring.must_be_kind_of List
|
11
|
-
@ring.must_be_instance_of Ring
|
12
|
-
@ring.length.must_equal 7
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should be looped." do
|
16
|
-
assert @ring.looped?
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should has cycle." do
|
20
|
-
@ring.cycle_size.must_equal 7
|
21
|
-
end
|
22
|
-
|
23
|
-
it "#eliminate_by should remove elements by given offset until there is one element." do
|
24
|
-
@ring.eliminate_by(3).must_equal 4
|
25
|
-
@ring.eliminate_by(2).must_equal 1
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|