ds 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +11 -0
  3. data/.rubocop_todo.yml +452 -0
  4. data/.travis.yml +12 -0
  5. data/Gemfile +1 -1
  6. data/README.rdoc +185 -214
  7. data/Rakefile +8 -3
  8. data/ds.gemspec +16 -13
  9. data/lib/ds.rb +20 -30
  10. data/lib/ds/{matrixes → arrays}/array_2d.rb +9 -10
  11. data/lib/ds/arrays/expandable_array.rb +34 -0
  12. data/lib/ds/arrays/heap_store.rb +32 -0
  13. data/lib/ds/arrays/tri_matrix.rb +33 -0
  14. data/lib/ds/lists/list.rb +310 -186
  15. data/lib/ds/lists/list_element.rb +14 -11
  16. data/lib/ds/pair.rb +4 -4
  17. data/lib/ds/queues/priority_queue.rb +33 -20
  18. data/lib/ds/queues/simple_queue.rb +55 -0
  19. data/lib/ds/sets/indexed_set.rb +37 -0
  20. data/lib/ds/stacks/stack.rb +25 -17
  21. data/lib/ds/trees/binary_heap.rb +71 -66
  22. data/lib/ds/trees/binary_tree.rb +40 -44
  23. data/lib/ds/trees/red_black_tree.rb +123 -0
  24. data/lib/ds/trees/red_black_tree/node.rb +21 -0
  25. data/lib/ds/trees/tree.rb +50 -48
  26. data/lib/ds/trees/tree_walker.rb +73 -144
  27. data/lib/ds/trees/trie.rb +67 -37
  28. data/lib/ds/trees/trie/node.rb +48 -0
  29. data/lib/ds/version.rb +2 -1
  30. data/test/help.rb +3 -6
  31. data/test/performance/binary_heap_performance_test.rb +20 -0
  32. data/test/performance/list_performance_test.rb +36 -0
  33. data/test/performance/priority_queue_performance.rb +32 -0
  34. data/test/performance/rbt_performance_test.rb +17 -0
  35. data/test/performance/simple_queue_performance_test.rb +37 -0
  36. data/test/performance/stack_test.rb +45 -0
  37. data/test/test_array2d.rb +29 -31
  38. data/test/test_binary_heap.rb +29 -23
  39. data/test/test_binary_tree.rb +30 -20
  40. data/test/test_expandable_array.rb +6 -10
  41. data/test/test_heap_store.rb +34 -0
  42. data/test/test_indexed_set.rb +26 -0
  43. data/test/test_list.rb +226 -109
  44. data/test/test_list_element.rb +34 -16
  45. data/test/test_pair.rb +5 -8
  46. data/test/test_priority_queue.rb +43 -64
  47. data/test/test_queue.rb +12 -61
  48. data/test/test_red_black_tree.rb +46 -0
  49. data/test/test_stack.rb +35 -39
  50. data/test/test_tree.rb +42 -29
  51. data/test/test_tree_walker.rb +27 -52
  52. data/test/test_tri_matrix.rb +6 -11
  53. data/test/test_trie.rb +59 -17
  54. metadata +80 -35
  55. data/lib/ds/ext/array_x.rb +0 -35
  56. data/lib/ds/graphs/digraph.rb +0 -20
  57. data/lib/ds/graphs/edge.rb +0 -15
  58. data/lib/ds/graphs/graph.rb +0 -111
  59. data/lib/ds/graphs/graph_as_matrix.rb +0 -113
  60. data/lib/ds/graphs/graph_as_tri_matrix.rb +0 -24
  61. data/lib/ds/lists/cyclic_list.rb +0 -21
  62. data/lib/ds/lists/ring.rb +0 -42
  63. data/lib/ds/matrixes/expandable_array.rb +0 -37
  64. data/lib/ds/matrixes/tri_matrix.rb +0 -30
  65. data/lib/ds/queues/queue.rb +0 -53
  66. data/lib/ds/sets/ordered_set.rb +0 -32
  67. data/lib/ds/trees/binary_search_tree.rb +0 -34
  68. data/lib/ds/trees/complete_binary_tree.rb +0 -60
  69. data/test/test_array_x.rb +0 -51
  70. data/test/test_binary_search_tree.rb +0 -39
  71. data/test/test_complete_binary_tree.rb +0 -58
  72. data/test/test_digraph.rb +0 -134
  73. data/test/test_graph.rb +0 -80
  74. data/test/test_ordered_set.rb +0 -28
  75. data/test/test_ring.rb +0 -28
@@ -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
-
@@ -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
-
@@ -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
-
@@ -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
-