ds 0.0.4 → 0.0.6
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 +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
|
-
|