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.
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
-