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,56 +1,74 @@
1
1
  require 'help'
2
2
 
3
- describe "List Element" do
4
-
3
+ describe 'List Element' do
5
4
  before do
6
5
  @empty_el = ListElement.new
7
6
  @el = ListElement.new(1)
8
7
  end
9
8
 
10
- describe "not initialized" do
11
-
9
+ describe 'not initialized' do
12
10
  before do
13
11
  @empty_el = ListElement.new
14
12
  end
15
13
 
16
- it "should have no elements." do
14
+ it 'should have no elements.' do
17
15
  @empty_el.data.must_be_nil
18
16
  end
19
17
 
20
- it "should be tail." do
18
+ it 'should be tail.' do
21
19
  assert @empty_el.tail?
22
20
  end
23
21
 
24
- it "#append should link element with another." do
25
- @empty_el.append(2).must_be_instance_of ListElement
22
+ it 'should be head.' do
23
+ assert @empty_el.head?
24
+ end
25
+
26
+ it '#append should return appended element.' do
27
+ el = @empty_el.append(2)
28
+ el.must_be_instance_of ListElement
29
+ el.data.must_equal 2
30
+ el.must_equal @empty_el.next
31
+ end
32
+
33
+ it '#append should link element with another.' do
34
+ @next = @empty_el.append(2)
35
+ @next.must_be_instance_of ListElement
26
36
  @empty_el.next.wont_be_nil
27
37
  @empty_el.next.must_be_instance_of ListElement
28
38
  @empty_el.next.data.must_equal 2
39
+ @next.prev.wont_be_nil
40
+ @next.prev.must_be_instance_of ListElement
29
41
  end
30
42
  end
31
43
 
32
-
33
- describe "initialized" do
34
-
44
+ describe 'initialized' do
35
45
  before do
36
46
  @el = ListElement.new(1)
37
47
  end
38
48
 
39
- it "should have one element" do
49
+ it 'should have one element' do
40
50
  @el.data.must_equal 1
41
51
  end
42
52
 
43
- it "should be tail." do
53
+ it 'should be tail.' do
44
54
  assert @el.tail?
45
55
  end
46
56
 
47
- it "#append should link element with another." do
57
+ it 'should be head.' do
58
+ assert @el.head?
59
+ end
60
+
61
+ it '#append should link element with another.' do
62
+ @next = @el.append(2)
63
+ @next.must_be_instance_of ListElement
48
64
  @el.append(2).must_be_instance_of ListElement
49
65
  @el.next.wont_be_nil
50
66
  @el.next.must_be_instance_of ListElement
51
67
  @el.next.data.must_equal 2
52
- end
53
68
 
69
+ @next.prev.wont_be_nil
70
+ @next.prev.must_be_instance_of ListElement
71
+ @next.prev.data.must_equal 1
72
+ end
54
73
  end
55
-
56
74
  end
@@ -1,26 +1,23 @@
1
1
  require 'help'
2
2
 
3
3
  describe Pair do
4
-
5
4
  before do
6
- @pair = Pair.new(1,2)
5
+ @pair = Pair.new(1, 2)
7
6
  end
8
7
 
9
- it "#first should return first element of a pair" do
8
+ it '#first should return first element of a pair' do
10
9
  @pair.first.must_equal 1
11
10
  end
12
11
 
13
- it "#key should return first element of a pair" do
12
+ it '#key should return first element of a pair' do
14
13
  @pair.key.must_equal 1
15
14
  end
16
15
 
17
- it "#second should return second element of a pair" do
16
+ it '#second should return second element of a pair' do
18
17
  @pair.second.must_equal 2
19
18
  end
20
19
 
21
- it "#value should return second element of a pair" do
20
+ it '#value should return second element of a pair' do
22
21
  @pair.value.must_equal 2
23
22
  end
24
-
25
23
  end
26
-
@@ -1,49 +1,43 @@
1
1
  require 'help'
2
2
 
3
3
  describe PriorityQueue do
4
-
5
- describe "Empty Priority Queue" do
6
-
4
+ describe 'Empty priority queue' do
7
5
  before do
8
6
  @empty_queue = PriorityQueue.new
9
7
  end
10
8
 
11
- it "should be empty." do
9
+ it 'should be empty.' do
12
10
  assert @empty_queue.empty?
13
11
  end
14
12
 
15
- it "should have zero elements." do
13
+ it 'should have zero elements.' do
16
14
  @empty_queue.length.must_equal 0
17
15
  end
18
16
  end
19
17
 
20
-
21
- describe "Not empty priority queue" do
22
-
18
+ describe 'Not empty priority queue' do
23
19
  before do
24
20
  @queue = PriorityQueue.new
25
21
  @queue.enqueue :important, 2
26
22
  @queue.enqueue :not_important, 1
27
23
  end
28
24
 
29
- it "should not be empty." do
25
+ it 'should not be empty.' do
30
26
  refute @queue.empty?
31
27
  @queue.length.must_equal 2
32
-
33
28
  end
34
29
 
35
- it "#peek should return element with highest priority." do
30
+ it '#peek should return element with highest priority.' do
36
31
  @queue.peek.must_equal :important
37
32
  end
38
33
 
39
-
40
- it "#enqueue and #push should add element to priority queue." do
34
+ it '#enqueue and #push should add element to priority queue.' do
41
35
  @queue.enqueue :very_important, 5
42
36
  @queue.push :nevermind, 0
43
37
  @queue.length.must_equal 4
44
38
  end
45
39
 
46
- it "#dequeue and #shift should remove element with highest priority." do
40
+ it '#dequeue and #shift should remove element with highest priority.' do
47
41
  x = @queue.dequeue
48
42
  @queue.length.must_equal 1
49
43
  x.must_equal :important
@@ -53,37 +47,61 @@ describe PriorityQueue do
53
47
  end
54
48
  end
55
49
 
56
- describe "Priority Queue with duplications" do
50
+ describe 'Not empty priority queue with custom order' do
51
+ before do
52
+ @queue = PriorityQueue.new { |a, b| a < b }
53
+ @queue.enqueue 'gamma', 'g'
54
+ @queue.enqueue 'alpha', 'a'
55
+ @queue.enqueue 'beta', 'b'
56
+ end
57
57
 
58
+ it 'should not be empty.' do
59
+ refute @queue.empty?
60
+ @queue.length.must_equal 3
61
+ end
62
+
63
+ it '#peek should return element with highest priority.' do
64
+ @queue.peek.must_equal 'alpha'
65
+ end
66
+
67
+ it '#dequeue and #shift should remove element with highest priority.' do
68
+ x = @queue.dequeue
69
+ @queue.length.must_equal 2
70
+ x.must_equal 'alpha'
71
+ @queue.dequeue.must_equal 'beta'
72
+ @queue.length.must_equal 1
73
+ end
74
+ end
75
+
76
+ describe 'PriorityQueue with duplications' do
58
77
  before do
59
- @dup_queue = PriorityQueue.new
60
- @dup_queue.enqueue :same_important, 2
78
+ @dup_queue = PriorityQueue.new(Pair.new(2, :same_important))
61
79
  @dup_queue.enqueue :important, 2
62
80
  @dup_queue.enqueue :not_important, 1
63
81
  end
64
82
 
65
- it "should not be empty" do
83
+ it 'should not be empty' do
66
84
  refute @dup_queue.empty?
67
85
  @dup_queue.length.must_equal 3
68
86
  end
69
87
 
70
- it "#peek should return element with highest priority." do
71
- assert [:important,:same_important].include? @dup_queue.peek
88
+ it '#peek should return element with highest priority.' do
89
+ assert [:important, :same_important].include? @dup_queue.peek
72
90
  @dup_queue.dequeue
73
- assert [:important,:same_important].include? @dup_queue.peek
91
+ assert [:important, :same_important].include? @dup_queue.peek
74
92
  @dup_queue.dequeue
75
93
  @dup_queue.peek.must_equal :not_important
76
94
  end
77
95
 
78
- it "#enqueue and #push should add element to priority queue." do
96
+ it '#enqueue and #push should add element to priority queue.' do
79
97
  @dup_queue.push :nevermind, 0
80
98
  @dup_queue.push :another_important, 2
81
99
  @dup_queue.length.must_equal 5
82
100
  end
83
101
 
84
- it "#dequeue and #shift should remove element with highest priority." do
85
- x = @dup_queue.dequeue
86
- assert [:important,:same_important].include? x
102
+ it '#dequeue and #shift should remove element with highest priority.' do
103
+ x = @dup_queue.dequeue
104
+ assert [:important, :same_important].include? x
87
105
  @dup_queue.length.must_equal 2
88
106
 
89
107
  @dup_queue.enqueue :important, 2
@@ -92,43 +110,4 @@ describe PriorityQueue do
92
110
  @dup_queue.dequeue.must_equal :important
93
111
  end
94
112
  end
95
-
96
-
97
- if ENV['BENCH']
98
- describe "performance" do
99
-
100
- before do
101
-
102
- @queue = PriorityQueue.new
103
- 10000.times do |n|
104
- @queue.push :elem, rand(10)
105
- end
106
-
107
- @empty_queue = PriorityQueue.new
108
- end
109
-
110
-
111
- bench_performance_constant "#accessing max element should be const operation.", 0.999 do |n|
112
- n.times do
113
- @queue.peek
114
- end
115
- end
116
-
117
-
118
- bench_performance_constant "#removing max element should be log operation.", 0.999 do |n|
119
- n.times do
120
- @queue.dequeue
121
- end
122
- end
123
-
124
- bench_performance_constant "creating new priority queue should be linear operation.", 0.999 do |n|
125
- n.times do
126
- @empty_queue.push :elem, rand(10)
127
- end
128
- end
129
-
130
-
131
-
132
- end
133
- end
134
113
  end
@@ -1,36 +1,27 @@
1
1
  require 'help'
2
2
 
3
- describe Queue do
4
-
5
- describe "Empty Queue" do
6
-
3
+ describe SimpleQueue do
4
+ describe 'empty queue' do
7
5
  before do
8
- @empty_queue = Queue.new
6
+ @empty_queue = SimpleQueue.new
9
7
  end
10
8
 
11
- it "should be empty." do
9
+ it 'should be empty.' do
12
10
  assert @empty_queue.empty?
13
11
  end
14
12
 
15
- it "should have zero elements." do
13
+ it 'should have zero elements.' do
16
14
  @empty_queue.length.must_equal 0
17
15
  end
18
16
  end
19
17
 
20
-
21
- describe "Not empty queue" do
22
-
18
+ describe 'not empty queue' do
23
19
  before do
24
- @queue = DS::Queue.new
25
- @queue.enqueue 1
26
- @queue.enqueue 2
27
-
28
- @queue2 = DS::Queue.create
29
- @queue2.enqueue 1
30
- @queue2.enqueue 2
20
+ @queue = SimpleQueue.new(1, 2)
21
+ @queue2 = SimpleQueue.create(1, 2)
31
22
  end
32
23
 
33
- it "should not be empty." do
24
+ it 'should not be empty.' do
34
25
  refute @queue.empty?
35
26
  @queue.length.must_equal 2
36
27
 
@@ -38,13 +29,12 @@ describe Queue do
38
29
  @queue2.length.must_equal 2
39
30
  end
40
31
 
41
- it "#peek should return element from forehead of queue." do
32
+ it '#peek should return element from forehead of queue.' do
42
33
  @queue.peek.must_equal 1
43
34
  @queue2.peek.must_equal 1
44
35
  end
45
36
 
46
-
47
- it "#enqueue and #push should add element to queue." do
37
+ it '#enqueue and #push should add element to queue.' do
48
38
  @queue.enqueue 3
49
39
  @queue.length.must_equal 3
50
40
 
@@ -58,7 +48,7 @@ describe Queue do
58
48
  @queue2.length.must_equal 4
59
49
  end
60
50
 
61
- it "#dequeue and #shift should remove element from queue." do
51
+ it '#dequeue and #shift should remove element from queue.' do
62
52
  x = @queue.dequeue
63
53
  @queue.length.must_equal 1
64
54
  x.must_equal 1
@@ -67,44 +57,5 @@ describe Queue do
67
57
  @queue2.length.must_equal 1
68
58
  x.must_equal 1
69
59
  end
70
-
71
-
72
- if ENV['BENCH']
73
- describe "performance" do
74
-
75
- before do
76
- 100000.times do |n|
77
- @queue.push 4
78
- @queue2.push 4
79
- end
80
- end
81
-
82
-
83
- bench_performance_constant "#shift(array implementation) should be const operation.", 0.999 do |n|
84
- n.times do
85
- @queue.shift
86
- end
87
- end
88
-
89
- bench_performance_constant "#shift(list implementation) should be const operation.", 0.999 do |n|
90
- n.times do
91
- @queue2.shift
92
- end
93
- end
94
-
95
- bench_performance_constant "#push(array implementation) should be const operation.", 0.999 do |n|
96
- n.times do
97
- @queue.push 2
98
- end
99
- end
100
-
101
- bench_performance_constant "#push(list implementation) should be const operation.", 0.999 do |n|
102
- n.times do
103
- @queue2.push 2
104
- end
105
- end
106
- end
107
- end
108
-
109
60
  end
110
61
  end
@@ -0,0 +1,46 @@
1
+ require 'help'
2
+
3
+ describe Tree do
4
+ before do
5
+ @tree = RedBlackTree.new
6
+ @tree.insert(:a, 1)
7
+ @tree.insert(:b, 2)
8
+ end
9
+
10
+ it '#new creates new RBT from hash' do
11
+ @dict = RedBlackTree.new(a: 1, b: 2, c: 3)
12
+ @dict[:a].must_equal 1
13
+ @dict[:b].must_equal 2
14
+ @dict[:c].must_equal 3
15
+ end
16
+
17
+ it '#insert add new element into tree' do
18
+ @tree.insert(:c, 3)
19
+ @tree.get(:c).must_equal 3
20
+ end
21
+
22
+ it '#get returns element if it is on tree' do
23
+ @tree.get(:b).must_equal 2
24
+ @tree.get(:x).must_equal nil
25
+ end
26
+
27
+ it 'has hash like methods' do
28
+ @tree[:c] = 3
29
+ @tree[:c].must_equal 3
30
+ end
31
+
32
+ it '#size returns tree size' do
33
+ @tree.size.must_equal(2)
34
+ end
35
+
36
+ it '#map returns nodes in order' do
37
+ @tree.insert(:e, 3)
38
+ @tree.insert(:d, 3)
39
+ @tree.insert(:c, 3)
40
+ @tree.map(&:key).must_equal [:a, :b, :c, :d, :e]
41
+ end
42
+
43
+ it '#to_h converts tree to Hash' do
44
+ @tree.to_h.must_equal a: 1, b: 2
45
+ end
46
+ end