ds 0.0.2 → 0.0.3
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.
- data/.gitignore +2 -0
- data/README.rdoc +490 -0
- data/Rakefile +1 -1
- data/lib/ds.rb +17 -19
- data/lib/ds/ext/array_x.rb +35 -0
- data/lib/ds/graphs/graph.rb +36 -32
- data/lib/ds/graphs/graph_as_matrix.rb +22 -23
- data/lib/ds/graphs/graph_as_tri_matrix.rb +1 -2
- data/lib/ds/lists/list.rb +18 -21
- data/lib/ds/matrixes/array_2d.rb +4 -0
- data/lib/ds/pair.rb +14 -0
- data/lib/ds/queues/priority_queue.rb +36 -0
- data/lib/ds/queues/queue.rb +1 -1
- data/lib/ds/sets/ordered_set.rb +32 -0
- data/lib/ds/trees/binary_heap.rb +45 -14
- data/lib/ds/trees/binary_search_tree.rb +3 -1
- data/lib/ds/trees/binary_tree.rb +11 -5
- data/lib/ds/trees/complete_binary_tree.rb +24 -16
- data/lib/ds/trees/tree.rb +3 -3
- data/lib/ds/trees/tree_walker.rb +7 -6
- data/lib/ds/trees/trie.rb +14 -20
- data/lib/ds/version.rb +1 -1
- data/test/help.rb +12 -3
- data/test/test_array2d.rb +14 -4
- data/test/test_array_x.rb +27 -7
- data/test/test_binary_heap.rb +19 -1
- data/test/test_binary_search_tree.rb +8 -1
- data/test/test_binary_tree.rb +7 -1
- data/test/test_complete_binary_tree.rb +34 -6
- data/test/test_digraph.rb +1 -1
- data/test/test_graph.rb +10 -1
- data/test/test_list.rb +59 -2
- data/test/test_ordered_set.rb +28 -0
- data/test/test_pair.rb +26 -0
- data/test/test_priority_queue.rb +134 -0
- data/test/test_queue.rb +3 -3
- data/test/test_stack.rb +0 -2
- data/test/test_tree.rb +32 -9
- data/test/test_tree_walker.rb +22 -0
- data/test/test_trie.rb +20 -2
- metadata +13 -81
- data/doc/Array.html +0 -264
- data/doc/DS.html +0 -292
- data/doc/DS/Array2D.html +0 -345
- data/doc/DS/BinaryHeap.html +0 -493
- data/doc/DS/BinarySearchTree.html +0 -313
- data/doc/DS/BinaryTree.html +0 -433
- data/doc/DS/CompleteBinaryTree.html +0 -550
- data/doc/DS/CyclicList.html +0 -234
- data/doc/DS/Digraph.html +0 -299
- data/doc/DS/Edge.html +0 -283
- data/doc/DS/ExpandableArray.html +0 -316
- data/doc/DS/Graph.html +0 -739
- data/doc/DS/GraphAsList.html +0 -361
- data/doc/DS/GraphAsMatrix.html +0 -633
- data/doc/DS/GraphAsTriMatrix.html +0 -274
- data/doc/DS/List.html +0 -1263
- data/doc/DS/ListElement.html +0 -344
- data/doc/DS/Queue.html +0 -517
- data/doc/DS/Ring.html +0 -323
- data/doc/DS/Stack.html +0 -407
- data/doc/DS/Tree.html +0 -770
- data/doc/DS/TreeWalker.html +0 -561
- data/doc/DS/TriMatrix.html +0 -338
- data/doc/created.rid +0 -25
- data/doc/ds/graphs/digraph_rb.html +0 -52
- data/doc/ds/graphs/edge_rb.html +0 -52
- data/doc/ds/graphs/graph_as_list_rb.html +0 -52
- data/doc/ds/graphs/graph_as_matrix_rb.html +0 -52
- data/doc/ds/graphs/graph_as_tri_matrix_rb.html +0 -52
- data/doc/ds/graphs/graph_rb.html +0 -52
- data/doc/ds/lists/cyclic_list_rb.html +0 -52
- data/doc/ds/lists/list_element_rb.html +0 -52
- data/doc/ds/lists/list_rb.html +0 -52
- data/doc/ds/lists/ring_rb.html +0 -52
- data/doc/ds/matrixes/array_2d_rb.html +0 -52
- data/doc/ds/matrixes/expandable_array_rb.html +0 -52
- data/doc/ds/matrixes/tri_matrix_rb.html +0 -52
- data/doc/ds/queues/queue_rb.html +0 -52
- data/doc/ds/stacks/stack_rb.html +0 -52
- data/doc/ds/trees/binary_heap_rb.html +0 -52
- data/doc/ds/trees/binary_search_tree_rb.html +0 -52
- data/doc/ds/trees/binary_tree_rb.html +0 -52
- data/doc/ds/trees/complete_binary_tree_rb.html +0 -52
- data/doc/ds/trees/tree_rb.html +0 -52
- data/doc/ds/trees/tree_walker_rb.html +0 -52
- data/doc/ds/version_rb.html +0 -52
- data/doc/ds_rb.html +0 -98
- data/doc/ext/ext_rb.html +0 -52
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -375
- data/doc/js/darkfish.js +0 -116
- data/doc/js/jquery.js +0 -32
- data/doc/js/quicksearch.js +0 -114
- data/doc/js/thickbox-compressed.js +0 -10
- data/doc/rdoc.css +0 -763
- data/lib/ds/ext/ext.rb +0 -36
- data/lib/ds/graphs/graph_as_list.rb +0 -48
data/test/test_array_x.rb
CHANGED
|
@@ -5,6 +5,8 @@ describe ArrayX do
|
|
|
5
5
|
before do
|
|
6
6
|
@asc = [1,3,6,9,10,13].extend(ArrayX)
|
|
7
7
|
@desc = [9,8,7,7,4,3,2].extend(ArrayX)
|
|
8
|
+
@short = [1,2].extend(ArrayX)
|
|
9
|
+
|
|
8
10
|
@empty = [].extend(ArrayX)
|
|
9
11
|
@one = [3].extend(ArrayX)
|
|
10
12
|
@not_sorted = [3,4,9,1,1,2,8].extend(ArrayX)
|
|
@@ -15,16 +17,34 @@ describe ArrayX do
|
|
|
15
17
|
assert @asc.sorted?
|
|
16
18
|
assert @empty.sorted?
|
|
17
19
|
assert @one.sorted?
|
|
20
|
+
assert @short.sorted?
|
|
18
21
|
refute @not_sorted.sorted?
|
|
19
|
-
|
|
22
|
+
assert @desc.sorted?(:desc)
|
|
23
|
+
refute @desc.sorted?(:asc)
|
|
24
|
+
assert @asc.sorted?(:asc)
|
|
25
|
+
refute @asc.sorted?(:desc)
|
|
26
|
+
refute @not_sorted.sorted?(:des)
|
|
27
|
+
refute @not_sorted.sorted?(:asc)
|
|
28
|
+
assert @short.sorted?(:asc)
|
|
29
|
+
refute @short.sorted?(:desc)
|
|
30
|
+
|
|
31
|
+
assert @one.sorted?(:asc)
|
|
32
|
+
assert @one.sorted?(:asc)
|
|
20
33
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@asc.
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "#duplications? should check if array has duplicates." do
|
|
37
|
+
refute @asc.duplications?
|
|
38
|
+
assert @desc.duplications?
|
|
39
|
+
assert @not_sorted.duplications?
|
|
40
|
+
refute @empty.duplications?
|
|
41
|
+
end
|
|
25
42
|
|
|
26
|
-
|
|
27
|
-
@
|
|
43
|
+
it "#tail should return array without first element." do
|
|
44
|
+
@asc.tail.must_equal [3,6,9,10,13]
|
|
45
|
+
@short.tail.must_equal [2]
|
|
46
|
+
@one.tail.must_equal []
|
|
47
|
+
@empty.tail.must_be_nil
|
|
28
48
|
end
|
|
29
49
|
end
|
|
30
50
|
|
data/test/test_binary_heap.rb
CHANGED
|
@@ -6,7 +6,7 @@ describe BinaryHeap do
|
|
|
6
6
|
@arr = [9,8,4,5,11,6]
|
|
7
7
|
@arr2 = [4,2,9,11,3,5,1]
|
|
8
8
|
@heap = BinaryHeap.new(*@arr)
|
|
9
|
-
@heap2 = BinaryHeap.
|
|
9
|
+
@heap2 = BinaryHeap.max(*@arr2)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
it "should create heap from array" do
|
|
@@ -18,18 +18,36 @@ describe BinaryHeap do
|
|
|
18
18
|
@heap.insert(13).to_a.must_equal [13,9,11,5,8,4,6]
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
it "#shift should remove element from heap maintaining heap relation." do
|
|
22
|
+
@heap.shift.must_equal 11
|
|
23
|
+
@heap.to_a.must_equal [9,8,6,5,4]
|
|
24
|
+
@heap.shift.must_equal 9
|
|
25
|
+
@heap.to_a.must_equal [8,5,6,4]
|
|
26
|
+
@heap.shift.must_equal 8
|
|
27
|
+
@heap.to_a.must_equal [6,5,4]
|
|
28
|
+
@heap.shift.must_equal 6
|
|
29
|
+
@heap.to_a.must_equal [5,4]
|
|
30
|
+
@heap.shift.must_equal 5
|
|
31
|
+
@heap.to_a.must_equal [4]
|
|
32
|
+
@heap.shift.must_equal 4
|
|
33
|
+
@heap.shift.must_be_nil
|
|
34
|
+
end
|
|
35
|
+
|
|
21
36
|
describe "Minimal Heap" do
|
|
22
37
|
|
|
23
38
|
before do
|
|
24
39
|
@min_heap = BinaryHeap.new(*@arr){|parent,child| parent < child}
|
|
40
|
+
@min_heap2 = BinaryHeap.min(*@arr)
|
|
25
41
|
end
|
|
26
42
|
|
|
27
43
|
it "should create heap from array." do
|
|
28
44
|
@min_heap.to_a.must_equal [4,5,6,8,11,9]
|
|
45
|
+
@min_heap2.to_a.must_equal [4,5,6,8,11,9]
|
|
29
46
|
end
|
|
30
47
|
|
|
31
48
|
it "#insert should insert new element to the heap maintaining heap relation." do
|
|
32
49
|
@min_heap.insert(3).to_a.must_equal [3,5,4,8,11,9,6]
|
|
50
|
+
@min_heap2.insert(3).to_a.must_equal [3,5,4,8,11,9,6]
|
|
33
51
|
end
|
|
34
52
|
end
|
|
35
53
|
end
|
|
@@ -3,6 +3,8 @@ require 'help'
|
|
|
3
3
|
describe BinarySearchTree do
|
|
4
4
|
|
|
5
5
|
before do
|
|
6
|
+
|
|
7
|
+
|
|
6
8
|
t = BinarySearchTree.new(7)
|
|
7
9
|
c1 = t.insert 5
|
|
8
10
|
c2 = t.insert 8
|
|
@@ -16,13 +18,18 @@ describe BinarySearchTree do
|
|
|
16
18
|
|
|
17
19
|
@bin_tree = BinaryTree.new
|
|
18
20
|
[2,5,8,9,11,12,14].each{|x| @bin_tree.insert(x)}
|
|
19
|
-
|
|
21
|
+
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
it "should be valid Binary Search Tree." do
|
|
23
25
|
assert BinarySearchTree.valid?(@bst)
|
|
24
26
|
end
|
|
25
27
|
|
|
28
|
+
it "#from_array should create new valid BinarySearchTree." do
|
|
29
|
+
b = BinarySearchTree.from_array([8,1,5,2,7,6,3])
|
|
30
|
+
assert BinarySearchTree.valid?(b)
|
|
31
|
+
TreeWalker.new(b).traverse(:inorder).must_equal [1,2,3,5,6,7,8]
|
|
32
|
+
end
|
|
26
33
|
|
|
27
34
|
it "not every Binary Tree is valid Binary Search Tree." do
|
|
28
35
|
refute BinarySearchTree.valid?(@bin_tree)
|
data/test/test_binary_tree.rb
CHANGED
|
@@ -10,6 +10,10 @@ describe BinaryTree do
|
|
|
10
10
|
@izo_tree = BinaryTree.new
|
|
11
11
|
[2,7,8,3,11,12,14].each{|x| @izo_tree.insert(x)}
|
|
12
12
|
|
|
13
|
+
@small_tree = BinaryTree.new(2)
|
|
14
|
+
@small_tree << BinaryTree.new(7)
|
|
15
|
+
@small_tree << BinaryTree.new(8)
|
|
16
|
+
|
|
13
17
|
@bin_walker = TreeWalker.new(@bin_tree)
|
|
14
18
|
|
|
15
19
|
end
|
|
@@ -35,7 +39,7 @@ describe BinaryTree do
|
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
it "#lowest_height should return node which lies closest to the root." do
|
|
38
|
-
assert @bin_tree.lowest_height.must_equal 9
|
|
42
|
+
assert @bin_tree.lowest_height.data.must_equal 9
|
|
39
43
|
end
|
|
40
44
|
|
|
41
45
|
it "#mirror should mirror tree." do
|
|
@@ -45,6 +49,8 @@ describe BinaryTree do
|
|
|
45
49
|
|
|
46
50
|
it "#isometric should check if tree is isometric to antother." do
|
|
47
51
|
assert @bin_tree.izometric?(@izo_tree)
|
|
52
|
+
assert @izo_tree.izometric?(@bin_tree)
|
|
53
|
+
refute @bin_tree.izometric?(@small_tree)
|
|
48
54
|
end
|
|
49
55
|
|
|
50
56
|
end
|
|
@@ -4,27 +4,55 @@ describe CompleteBinaryTree do
|
|
|
4
4
|
|
|
5
5
|
before do
|
|
6
6
|
@tree = CompleteBinaryTree.new(1,2,3,4,5,6,7)
|
|
7
|
+
@empty_tree = CompleteBinaryTree.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "#<< should add new element." do
|
|
11
|
+
@empty_tree << 1
|
|
12
|
+
@empty_tree << 2
|
|
13
|
+
@empty_tree.root.must_equal 1
|
|
7
14
|
end
|
|
8
15
|
|
|
9
16
|
it "#root should return root of the tree." do
|
|
10
17
|
@tree.root.must_equal 1
|
|
11
18
|
end
|
|
12
19
|
|
|
20
|
+
it "#left_index should return index of left child" do
|
|
21
|
+
@tree.left_index(0).must_equal 1
|
|
22
|
+
@tree.left_index(1).must_equal 3
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "#right_index should return index of left child" do
|
|
26
|
+
@tree.right_index(0).must_equal 2
|
|
27
|
+
@tree.right_index(1).must_equal 4
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "#parent_index should return index of left child" do
|
|
31
|
+
@tree.parent_index(1).must_equal 0
|
|
32
|
+
@tree.parent_index(3).must_equal 1
|
|
33
|
+
end
|
|
34
|
+
|
|
13
35
|
it "#left should return left child" do
|
|
14
|
-
@tree.left(
|
|
15
|
-
@tree.left(
|
|
36
|
+
@tree.left(0).must_equal 2
|
|
37
|
+
@tree.left(1).must_equal 4
|
|
16
38
|
end
|
|
17
39
|
|
|
18
40
|
it "#right should return right child" do
|
|
19
|
-
@tree.right(
|
|
20
|
-
@tree.right(
|
|
41
|
+
@tree.right(0).must_equal 3
|
|
42
|
+
@tree.right(1).must_equal 5
|
|
21
43
|
end
|
|
22
44
|
|
|
23
45
|
it "#parent should return parent." do
|
|
46
|
+
@tree.parent(3).must_equal 2
|
|
24
47
|
@tree.parent(4).must_equal 2
|
|
25
|
-
@tree.parent(
|
|
26
|
-
|
|
48
|
+
@tree.parent(1).must_equal 1
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "#children should return children." do
|
|
52
|
+
@tree.children(0).must_equal [2,3]
|
|
27
53
|
end
|
|
28
54
|
|
|
55
|
+
|
|
56
|
+
|
|
29
57
|
end
|
|
30
58
|
|
data/test/test_digraph.rb
CHANGED
|
@@ -63,7 +63,7 @@ describe Digraph do
|
|
|
63
63
|
|
|
64
64
|
it "#add_edge should add new edge." do
|
|
65
65
|
@digraph.add_edges([Edge.new("Marc","Kate")])
|
|
66
|
-
@digraph.vertex_size.must_equal
|
|
66
|
+
@digraph.vertex_size.must_equal 5
|
|
67
67
|
assert @digraph.edge?("Marc","Kate")
|
|
68
68
|
refute @digraph.edge?("Kate","Marc")
|
|
69
69
|
refute @digraph.edge?("Tom","Kate")
|
data/test/test_graph.rb
CHANGED
|
@@ -37,9 +37,18 @@ describe Graph do
|
|
|
37
37
|
refute @graph.edge?("Tom","Kate")
|
|
38
38
|
end
|
|
39
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
|
+
|
|
40
49
|
it "#remove_edge should remove edge." do
|
|
41
50
|
@graph.remove("Marc","Jack")
|
|
42
|
-
@graph.vertex_size.must_equal
|
|
51
|
+
@graph.vertex_size.must_equal 4
|
|
43
52
|
refute @graph.edge?("Marc","Jack")
|
|
44
53
|
refute @graph.edge?("Jack","Marc")
|
|
45
54
|
end
|
data/test/test_list.rb
CHANGED
|
@@ -5,6 +5,9 @@ describe List do
|
|
|
5
5
|
before do
|
|
6
6
|
@list = List.from_array([1,2,3,4])
|
|
7
7
|
@list2 = List.from_array([4,5,7])
|
|
8
|
+
|
|
9
|
+
@numbers = List.from_array((1..10).to_a)
|
|
10
|
+
@even_numbers = List.from_array([2,4,6,8,10])
|
|
8
11
|
end
|
|
9
12
|
|
|
10
13
|
it "#from_array should transform array to list." do
|
|
@@ -49,12 +52,17 @@ describe List do
|
|
|
49
52
|
@list.insert_before(7,@list.tail)
|
|
50
53
|
@list.to_a.must_equal [8,1,9,2,3,7,4]
|
|
51
54
|
|
|
55
|
+
proc { @list.insert_before(1,nil)}.must_raise ListError
|
|
52
56
|
end
|
|
53
57
|
|
|
54
58
|
it "#insert_after should insert new element after another." do
|
|
55
59
|
second = @list.head.next
|
|
56
60
|
@list.insert_after(9,second)
|
|
57
61
|
@list.to_a.must_equal [1,2,9,3,4]
|
|
62
|
+
|
|
63
|
+
tail = @list.tail
|
|
64
|
+
@list.insert_after(11,tail)
|
|
65
|
+
@list.to_a.must_equal [1,2,9,3,4,11]
|
|
58
66
|
end
|
|
59
67
|
|
|
60
68
|
|
|
@@ -100,6 +108,11 @@ describe List do
|
|
|
100
108
|
@list2.merge(@list).to_a.must_equal [1,2,3,4,4,5,7]
|
|
101
109
|
end
|
|
102
110
|
|
|
111
|
+
it "#merge should be symetric operation." do
|
|
112
|
+
@list.merge(@list2).to_a.must_equal [1,2,3,4,4,5,7]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
|
|
103
116
|
it "#orderize should order elements by evaluating block." do
|
|
104
117
|
not_sorted_list = List.from_array([3,-1,0,-8,2,0,1])
|
|
105
118
|
not_sorted_list.orderize{|elem| elem <=> 0}.to_a.must_equal [-1,-8,0,0,3,2,1]
|
|
@@ -107,6 +120,11 @@ describe List do
|
|
|
107
120
|
|
|
108
121
|
it "#remove! should remove all elements that occur on the other list." do
|
|
109
122
|
@list.remove!(@list2).to_a.must_equal [1,2,3]
|
|
123
|
+
@numbers.remove!(@even_numbers).to_a.must_equal [1,3,5,7,9]
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "#remove! should remove all elements that occur on the other list#2." do
|
|
127
|
+
@list2.remove!(@list).to_a.must_equal [5,7]
|
|
110
128
|
end
|
|
111
129
|
|
|
112
130
|
it "#looped? should check if list has cycle." do
|
|
@@ -114,9 +132,16 @@ describe List do
|
|
|
114
132
|
refute @list.looped?
|
|
115
133
|
end
|
|
116
134
|
|
|
135
|
+
it "#each_with_index should iterate list." do
|
|
136
|
+
h = {}
|
|
137
|
+
@list.each_with_index{|e,i| h[i] = e.data}
|
|
138
|
+
h.must_equal({0 => 1, 1 => 2, 2 => 3, 3 => 4})
|
|
139
|
+
end
|
|
140
|
+
|
|
117
141
|
it "should include Enumerable methods." do
|
|
118
|
-
@list.map{ |e| e }.must_equal [1,2,3,4]
|
|
119
|
-
@list.inject(0){ |mem, var| mem = mem + var }.must_equal 10
|
|
142
|
+
@list.map{ |e| e.data }.must_equal [1,2,3,4]
|
|
143
|
+
@list.inject(0){ |mem, var| mem = mem + var.data }.must_equal 10
|
|
144
|
+
@list.find { |e| e.data == 1.0 }.data.must_equal 1
|
|
120
145
|
end
|
|
121
146
|
|
|
122
147
|
|
|
@@ -134,5 +159,37 @@ describe List do
|
|
|
134
159
|
|
|
135
160
|
end
|
|
136
161
|
|
|
162
|
+
if ENV['BENCH']
|
|
163
|
+
describe "performance" do
|
|
164
|
+
|
|
165
|
+
before do
|
|
166
|
+
@arr = (1..10_000).to_a.sort_by{rand}
|
|
167
|
+
|
|
168
|
+
10000.times do |n|
|
|
169
|
+
@list.append 4
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
bench_performance_constant "#append should be const operation.", 0.999 do |n|
|
|
175
|
+
n.times do
|
|
176
|
+
@list.append 3
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
bench_performance_constant "#prepend should be const operation.", 0.999 do |n|
|
|
181
|
+
n.times do
|
|
182
|
+
@list.prepend 3
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
bench_performance_linear "#reverse! should be linear operation.", 0.999 do |n|
|
|
187
|
+
list =List.from_array(@arr[0..n])
|
|
188
|
+
list.reverse!
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
end
|
|
137
192
|
end
|
|
138
193
|
|
|
194
|
+
end
|
|
195
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
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_pair.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe Pair do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
@pair = Pair.new(1,2)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "#first should return first element of a pair" do
|
|
10
|
+
@pair.first.must_equal 1
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "#key should return first element of a pair" do
|
|
14
|
+
@pair.key.must_equal 1
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "#second should return second element of a pair" do
|
|
18
|
+
@pair.second.must_equal 2
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "#value should return second element of a pair" do
|
|
22
|
+
@pair.value.must_equal 2
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
require 'help'
|
|
2
|
+
|
|
3
|
+
describe PriorityQueue do
|
|
4
|
+
|
|
5
|
+
describe "Empty Priority Queue" do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@empty_queue = PriorityQueue.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should be empty." do
|
|
12
|
+
assert @empty_queue.empty?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should have zero elements." do
|
|
16
|
+
@empty_queue.length.must_equal 0
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
describe "Not empty priority queue" do
|
|
22
|
+
|
|
23
|
+
before do
|
|
24
|
+
@queue = PriorityQueue.new
|
|
25
|
+
@queue.enqueue :important, 2
|
|
26
|
+
@queue.enqueue :not_important, 1
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should not be empty." do
|
|
30
|
+
refute @queue.empty?
|
|
31
|
+
@queue.length.must_equal 2
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "#peek should return element with highest priority." do
|
|
36
|
+
@queue.peek.must_equal :important
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
it "#enqueue and #push should add element to priority queue." do
|
|
41
|
+
@queue.enqueue :very_important, 5
|
|
42
|
+
@queue.push :nevermind, 0
|
|
43
|
+
@queue.length.must_equal 4
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "#dequeue and #shift should remove element with highest priority." do
|
|
47
|
+
x = @queue.dequeue
|
|
48
|
+
@queue.length.must_equal 1
|
|
49
|
+
x.must_equal :important
|
|
50
|
+
@queue.dequeue.must_equal :not_important
|
|
51
|
+
@queue.length.must_equal 0
|
|
52
|
+
@queue.dequeue.must_be_nil
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "Priority Queue with duplications" do
|
|
57
|
+
|
|
58
|
+
before do
|
|
59
|
+
@dup_queue = PriorityQueue.new
|
|
60
|
+
@dup_queue.enqueue :same_important, 2
|
|
61
|
+
@dup_queue.enqueue :important, 2
|
|
62
|
+
@dup_queue.enqueue :not_important, 1
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should not be empty" do
|
|
66
|
+
refute @dup_queue.empty?
|
|
67
|
+
@dup_queue.length.must_equal 3
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "#peek should return element with highest priority." do
|
|
71
|
+
assert [:important,:same_important].include? @dup_queue.peek
|
|
72
|
+
@dup_queue.dequeue
|
|
73
|
+
assert [:important,:same_important].include? @dup_queue.peek
|
|
74
|
+
@dup_queue.dequeue
|
|
75
|
+
@dup_queue.peek.must_equal :not_important
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "#enqueue and #push should add element to priority queue." do
|
|
79
|
+
@dup_queue.push :nevermind, 0
|
|
80
|
+
@dup_queue.push :another_important, 2
|
|
81
|
+
@dup_queue.length.must_equal 5
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "#dequeue and #shift should remove element with highest priority." do
|
|
85
|
+
x = @dup_queue.dequeue
|
|
86
|
+
assert [:important,:same_important].include? x
|
|
87
|
+
@dup_queue.length.must_equal 2
|
|
88
|
+
|
|
89
|
+
@dup_queue.enqueue :important, 2
|
|
90
|
+
@dup_queue.length.must_equal 3
|
|
91
|
+
@dup_queue.dequeue.must_equal :important
|
|
92
|
+
@dup_queue.dequeue.must_equal :important
|
|
93
|
+
end
|
|
94
|
+
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
|
+
end
|