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.
Files changed (117) hide show
  1. data/.gitignore +2 -0
  2. data/README.rdoc +490 -0
  3. data/Rakefile +1 -1
  4. data/lib/ds.rb +17 -19
  5. data/lib/ds/ext/array_x.rb +35 -0
  6. data/lib/ds/graphs/graph.rb +36 -32
  7. data/lib/ds/graphs/graph_as_matrix.rb +22 -23
  8. data/lib/ds/graphs/graph_as_tri_matrix.rb +1 -2
  9. data/lib/ds/lists/list.rb +18 -21
  10. data/lib/ds/matrixes/array_2d.rb +4 -0
  11. data/lib/ds/pair.rb +14 -0
  12. data/lib/ds/queues/priority_queue.rb +36 -0
  13. data/lib/ds/queues/queue.rb +1 -1
  14. data/lib/ds/sets/ordered_set.rb +32 -0
  15. data/lib/ds/trees/binary_heap.rb +45 -14
  16. data/lib/ds/trees/binary_search_tree.rb +3 -1
  17. data/lib/ds/trees/binary_tree.rb +11 -5
  18. data/lib/ds/trees/complete_binary_tree.rb +24 -16
  19. data/lib/ds/trees/tree.rb +3 -3
  20. data/lib/ds/trees/tree_walker.rb +7 -6
  21. data/lib/ds/trees/trie.rb +14 -20
  22. data/lib/ds/version.rb +1 -1
  23. data/test/help.rb +12 -3
  24. data/test/test_array2d.rb +14 -4
  25. data/test/test_array_x.rb +27 -7
  26. data/test/test_binary_heap.rb +19 -1
  27. data/test/test_binary_search_tree.rb +8 -1
  28. data/test/test_binary_tree.rb +7 -1
  29. data/test/test_complete_binary_tree.rb +34 -6
  30. data/test/test_digraph.rb +1 -1
  31. data/test/test_graph.rb +10 -1
  32. data/test/test_list.rb +59 -2
  33. data/test/test_ordered_set.rb +28 -0
  34. data/test/test_pair.rb +26 -0
  35. data/test/test_priority_queue.rb +134 -0
  36. data/test/test_queue.rb +3 -3
  37. data/test/test_stack.rb +0 -2
  38. data/test/test_tree.rb +32 -9
  39. data/test/test_tree_walker.rb +22 -0
  40. data/test/test_trie.rb +20 -2
  41. metadata +13 -81
  42. data/doc/Array.html +0 -264
  43. data/doc/DS.html +0 -292
  44. data/doc/DS/Array2D.html +0 -345
  45. data/doc/DS/BinaryHeap.html +0 -493
  46. data/doc/DS/BinarySearchTree.html +0 -313
  47. data/doc/DS/BinaryTree.html +0 -433
  48. data/doc/DS/CompleteBinaryTree.html +0 -550
  49. data/doc/DS/CyclicList.html +0 -234
  50. data/doc/DS/Digraph.html +0 -299
  51. data/doc/DS/Edge.html +0 -283
  52. data/doc/DS/ExpandableArray.html +0 -316
  53. data/doc/DS/Graph.html +0 -739
  54. data/doc/DS/GraphAsList.html +0 -361
  55. data/doc/DS/GraphAsMatrix.html +0 -633
  56. data/doc/DS/GraphAsTriMatrix.html +0 -274
  57. data/doc/DS/List.html +0 -1263
  58. data/doc/DS/ListElement.html +0 -344
  59. data/doc/DS/Queue.html +0 -517
  60. data/doc/DS/Ring.html +0 -323
  61. data/doc/DS/Stack.html +0 -407
  62. data/doc/DS/Tree.html +0 -770
  63. data/doc/DS/TreeWalker.html +0 -561
  64. data/doc/DS/TriMatrix.html +0 -338
  65. data/doc/created.rid +0 -25
  66. data/doc/ds/graphs/digraph_rb.html +0 -52
  67. data/doc/ds/graphs/edge_rb.html +0 -52
  68. data/doc/ds/graphs/graph_as_list_rb.html +0 -52
  69. data/doc/ds/graphs/graph_as_matrix_rb.html +0 -52
  70. data/doc/ds/graphs/graph_as_tri_matrix_rb.html +0 -52
  71. data/doc/ds/graphs/graph_rb.html +0 -52
  72. data/doc/ds/lists/cyclic_list_rb.html +0 -52
  73. data/doc/ds/lists/list_element_rb.html +0 -52
  74. data/doc/ds/lists/list_rb.html +0 -52
  75. data/doc/ds/lists/ring_rb.html +0 -52
  76. data/doc/ds/matrixes/array_2d_rb.html +0 -52
  77. data/doc/ds/matrixes/expandable_array_rb.html +0 -52
  78. data/doc/ds/matrixes/tri_matrix_rb.html +0 -52
  79. data/doc/ds/queues/queue_rb.html +0 -52
  80. data/doc/ds/stacks/stack_rb.html +0 -52
  81. data/doc/ds/trees/binary_heap_rb.html +0 -52
  82. data/doc/ds/trees/binary_search_tree_rb.html +0 -52
  83. data/doc/ds/trees/binary_tree_rb.html +0 -52
  84. data/doc/ds/trees/complete_binary_tree_rb.html +0 -52
  85. data/doc/ds/trees/tree_rb.html +0 -52
  86. data/doc/ds/trees/tree_walker_rb.html +0 -52
  87. data/doc/ds/version_rb.html +0 -52
  88. data/doc/ds_rb.html +0 -98
  89. data/doc/ext/ext_rb.html +0 -52
  90. data/doc/images/brick.png +0 -0
  91. data/doc/images/brick_link.png +0 -0
  92. data/doc/images/bug.png +0 -0
  93. data/doc/images/bullet_black.png +0 -0
  94. data/doc/images/bullet_toggle_minus.png +0 -0
  95. data/doc/images/bullet_toggle_plus.png +0 -0
  96. data/doc/images/date.png +0 -0
  97. data/doc/images/find.png +0 -0
  98. data/doc/images/loadingAnimation.gif +0 -0
  99. data/doc/images/macFFBgHack.png +0 -0
  100. data/doc/images/package.png +0 -0
  101. data/doc/images/page_green.png +0 -0
  102. data/doc/images/page_white_text.png +0 -0
  103. data/doc/images/page_white_width.png +0 -0
  104. data/doc/images/plugin.png +0 -0
  105. data/doc/images/ruby.png +0 -0
  106. data/doc/images/tag_green.png +0 -0
  107. data/doc/images/wrench.png +0 -0
  108. data/doc/images/wrench_orange.png +0 -0
  109. data/doc/images/zoom.png +0 -0
  110. data/doc/index.html +0 -375
  111. data/doc/js/darkfish.js +0 -116
  112. data/doc/js/jquery.js +0 -32
  113. data/doc/js/quicksearch.js +0 -114
  114. data/doc/js/thickbox-compressed.js +0 -10
  115. data/doc/rdoc.css +0 -763
  116. data/lib/ds/ext/ext.rb +0 -36
  117. data/lib/ds/graphs/graph_as_list.rb +0 -48
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ Rake::TestTask.new do |t|
5
5
  t.libs << 'test'
6
6
  t.test_files = FileList['test/test*.rb']
7
7
  #t.pattern = "test/test_*.rb"
8
- t.verbose= true
8
+ t.verbose = true
9
9
  end
10
10
 
11
11
  desc "Run tests"
data/lib/ds.rb CHANGED
@@ -1,25 +1,13 @@
1
1
  require "ds/version"
2
2
 
3
- require "ds/ext/ext"
3
+ require "ds/ext/array_x"
4
+ require "ds/pair"
4
5
 
5
6
  require "ds/matrixes/expandable_array"
6
7
  require "ds/matrixes/array_2d"
7
8
  require "ds/matrixes/tri_matrix"
8
9
 
9
- require "ds/graphs/edge"
10
- require "ds/graphs/graph_as_list"
11
- require "ds/graphs/graph_as_matrix"
12
- require "ds/graphs/graph_as_tri_matrix"
13
- require "ds/graphs/graph"
14
- require "ds/graphs/digraph"
15
-
16
- require "ds/trees/tree"
17
- require "ds/trees/tree_walker"
18
- require "ds/trees/binary_tree"
19
- require "ds/trees/binary_search_tree"
20
- require "ds/trees/complete_binary_tree"
21
- require "ds/trees/binary_heap"
22
- require "ds/trees/trie"
10
+ require "ds/sets/ordered_set"
23
11
 
24
12
  require "ds/lists/list_element"
25
13
  require "ds/lists/list"
@@ -28,12 +16,22 @@ require "ds/lists/ring"
28
16
 
29
17
  require "ds/stacks/stack"
30
18
  require "ds/queues/queue"
19
+ require "ds/queues/priority_queue"
31
20
 
21
+ require "ds/trees/tree"
22
+ require "ds/trees/tree_walker"
23
+ require "ds/trees/binary_tree"
24
+ require "ds/trees/binary_search_tree"
25
+ require "ds/trees/complete_binary_tree"
26
+ require "ds/trees/binary_heap"
27
+ require "ds/trees/trie"
32
28
 
33
-
34
-
35
-
36
-
29
+ require "ds/graphs/edge"
30
+ require "ds/graphs/graph_as_list"
31
+ require "ds/graphs/graph_as_matrix"
32
+ require "ds/graphs/graph_as_tri_matrix"
33
+ require "ds/graphs/graph"
34
+ require "ds/graphs/digraph"
37
35
 
38
36
 
39
37
 
@@ -0,0 +1,35 @@
1
+ module DS
2
+ module ArrayX
3
+
4
+ #Checks if array is already sorted.
5
+ def sorted?(order=:any)
6
+ return true if size < 2
7
+
8
+ if size == 2
9
+ return false if self[0] > self[1] and order == :asc
10
+ return false if self[0] < self[1] and order == :desc
11
+ else
12
+ case order
13
+ when :asc
14
+ (size-2).times{ |i| return false if self[i] > self[i+1] }
15
+ when :desc
16
+ (size-2).times{ |i| return false if self[i] < self[i+1] }
17
+ else
18
+ return (self[0] < self[1])? sorted?(:asc) : sorted?(:desc)
19
+ end
20
+ end
21
+
22
+ true
23
+ end
24
+
25
+ #Checks if array has duplicates.
26
+ def duplications?
27
+ size != uniq.size
28
+ end
29
+
30
+ #Returns array tail.
31
+ def tail
32
+ self[1..-1]
33
+ end
34
+ end
35
+ end
@@ -6,14 +6,12 @@ module DS
6
6
  #Create new graph from array of edges. Second parameter determines
7
7
  #graph internal implementation: :list (Adjency List), :tri_matrix (Triangular
8
8
  #Matrix), :matrix (Matrix).
9
- def initialize(edges,store = :list)
9
+ def initialize(edges,store = :matrix)
10
10
  case store
11
11
  when :matrix
12
12
  @g = GraphAsMatrix.new(edges)
13
13
  when :tri_matrix
14
14
  @g = GraphAsTriMatrix.new(edges)
15
- else
16
- @g = GraphAsList.new(edges)
17
15
  end
18
16
  end
19
17
 
@@ -23,14 +21,47 @@ module DS
23
21
  new(edges,:tri_matrix)
24
22
  end
25
23
 
26
- def add(x,y)
27
- @g.add(x,y)
24
+ #Adds new edge to graph.
25
+ def add(x,y,weight=1)
26
+ e = Edge.new(x,y,weight)
27
+ add_edges([e])
28
28
  end
29
29
 
30
+ #Adds new edges to graph.
31
+ def add_edges(edges)
32
+ @g.add_edges(edges)
33
+ end
34
+
35
+
36
+ #Removes conection between vertex x and y.
30
37
  def remove(x,y)
31
38
  @g.remove(x,y)
32
39
  end
33
40
 
41
+ #Returns all neighbors for given vertex.
42
+ def neighbors v
43
+ @g.neighbors v
44
+ end
45
+
46
+ #Returns vertex degree.
47
+ def degree x
48
+ @g.degree x
49
+ end
50
+
51
+ #Checks if two elements are connected.
52
+ def edge? x,y
53
+ @g.edge? x,y
54
+ end
55
+
56
+ #Returns Edge(x,y) if exist.
57
+ def get_edge x, y
58
+ @g.get_edge x,y
59
+ end
60
+
61
+ def vertex_size
62
+ @g.vertex_size
63
+ end
64
+
34
65
  def each_vertex &block
35
66
  @g.each_vertex &block
36
67
  end
@@ -39,9 +70,6 @@ module DS
39
70
  @g.each_edge &block
40
71
  end
41
72
 
42
- def neighbors v
43
- @g.neighbors v
44
- end
45
73
 
46
74
  def bfs s
47
75
  colors = {}
@@ -78,30 +106,6 @@ module DS
78
106
  res
79
107
  end
80
108
 
81
- def add_edges(edges)
82
- @g.add_edges(edges)
83
- end
84
109
 
85
- #Returns vertex degree. Second parameter determines direction - :in incoming
86
- #edges, :out - outcoming edges, :all - incoming and outcoming edges.
87
- def degree x
88
- @g.degree x
89
- end
90
-
91
- def edge? x,y
92
- @g.edge? x,y
93
- end
94
-
95
- def get_edge x, y
96
- @g.get_edge x,y
97
- end
98
-
99
- def vertex_size
100
- @g.vertex_size
101
- end
102
-
103
- def edge_size
104
- @g.vmax+1
105
- end
106
110
  end
107
111
  end
@@ -5,38 +5,31 @@ module DS
5
5
  @store = Array2D.new
6
6
  @max = 0
7
7
 
8
- @v = 0 #vertex count
9
-
10
- @map = [] #maps objects to matrix indexes.
8
+ @map = OrderedSet.new #maps objects to matrix indexes.
11
9
 
12
10
  add_edges(edges)
13
11
  end
14
12
 
15
- #Checks if two elements are connected.
16
- def edge? x,y
17
- v1 = @map.index(x)
18
- v2 = @map.index(y)
19
- @store[v1,v2] > 0
20
- end
21
-
22
13
  #Adds new edges to graph.
23
14
  def add_edges(edges)
24
15
  for e in edges
25
- x = @map.extend(ArrayX).push_uniq e.from
26
- y = @map.extend(ArrayX).push_uniq e.to
16
+ x = @map.push e.from
17
+ y = @map.push e.to
27
18
 
28
19
  @store[x,y] = e.weight
20
+
29
21
  @max = [@max, x, y].max
30
- @v = @v + 1
31
22
  end
32
23
  end
33
24
 
34
25
  #Returns all neighbors for given vertex.
35
26
  def neighbors(v)
36
27
  n = []
28
+ vertexes = @map.to_a
37
29
  v = @map.index(v)
30
+
38
31
  0.upto @max do |i|
39
- n << @map[i] if @store[v,i] > 0
32
+ n << vertexes[i] if @store[v,i] > 0
40
33
  end
41
34
  n
42
35
  end
@@ -46,11 +39,12 @@ module DS
46
39
  v1 = @map.index(x)
47
40
  v2 = @map.index(y)
48
41
 
42
+ vertexes = @map.to_a
43
+
49
44
  @store[v1,v2] = 0
50
- if (degree @map[@max]) == 0
45
+ if (degree vertexes[@max]) == 0
51
46
  @max -= 1
52
47
  end
53
- @v -= 1
54
48
  end
55
49
 
56
50
  #Returns Edge(x,y) if exist.
@@ -58,19 +52,22 @@ module DS
58
52
  s = @map.index x
59
53
  t = @map.index y
60
54
  if @store[s,t] > 0
61
- Edge.new(@map[s], @map[t], @store[s,t])
55
+ Edge.new(x, y, @store[s,t])
62
56
  else
63
57
  nil
64
58
  end
65
59
  end
66
60
 
67
- def vmax
68
- @max
61
+ #Checks if two elements are connected.
62
+ def edge? x,y
63
+ v1 = @map.index(x)
64
+ v2 = @map.index(y)
65
+ @store[v1,v2] > 0
69
66
  end
70
-
67
+
71
68
  #Returns vertex counter.
72
69
  def vertex_size
73
- @v
70
+ @map.size
74
71
  end
75
72
 
76
73
 
@@ -98,14 +95,16 @@ module DS
98
95
 
99
96
  #Vertex iterator
100
97
  def each_vertex
101
- (0..@max).each {|v| yield @map[v]}
98
+ vertexes = @map.to_a
99
+ (0..@max).each {|v| yield vertexes[v]}
102
100
  end
103
101
 
104
102
  #Edge iterator
105
103
  def each_edge
104
+ vertexes = @map.to_a
106
105
  for v0 in 0..@max
107
106
  for v1 in 0..v0-1
108
- yield Edge.new(@map[v0],@map[v1],@store[v0,v1]) if @store[v0,v1] > 0
107
+ yield Edge.new(vertexes[v0],vertexes[v1],@store[v0,v1]) if @store[v0,v1] > 0
109
108
  end
110
109
  end
111
110
  end
@@ -4,8 +4,7 @@ module DS
4
4
  def initialize(edges)
5
5
  @store = TriMatrix.new(0)
6
6
  @max = 0
7
- @map = []
8
- @v = 0
7
+ @map = OrderedSet.new
9
8
 
10
9
  add_edges(edges)
11
10
  end
@@ -55,7 +55,7 @@ module DS
55
55
  el = el.next
56
56
  end
57
57
 
58
- raise "Element not found" unless el
58
+ raise ListError, "Element not found" unless el
59
59
 
60
60
  prev.next = el.next
61
61
  el.next = nil
@@ -106,7 +106,7 @@ module DS
106
106
  end
107
107
 
108
108
  if el.nil?
109
- raise "List element not found"
109
+ raise ListError, "List element not found"
110
110
  else
111
111
  prev.next = x
112
112
  x.next = el
@@ -212,9 +212,17 @@ module DS
212
212
  b = b.next
213
213
  end
214
214
 
215
- a = a.next
216
- prev.next = a
217
- b = b.next
215
+ if prev.nil?
216
+ prev = a
217
+ a = a.next
218
+ prev.next = nil
219
+ self.head = a
220
+ b = b.next
221
+ else
222
+ a = a.next
223
+ prev.next = a
224
+ b = b.next
225
+ end
218
226
  end
219
227
  self
220
228
  end
@@ -267,37 +275,26 @@ module DS
267
275
 
268
276
  @head = prev
269
277
  self
270
-
271
278
  end
272
279
 
273
- #Prints list.
274
- def print
275
- each { |e| p }
276
- end
277
280
 
278
281
  #Converts list to array.
279
282
  def to_a
280
- map { |e| e}
283
+ map { |e| e.data}
281
284
  end
282
285
 
283
286
  #Default list iterator.
284
287
  def each
285
288
  elem = @head
286
289
  while elem
287
- yield elem.data
290
+ yield elem
288
291
  elem = elem.next
289
292
  end
290
293
  end
291
294
 
292
- def each_with_index
293
- elem = @head
294
- i = 0
295
- while elem
296
- yield elem,i
297
- elem = elem.next
298
- i = i + 1
299
- end
300
- end
295
+ end
301
296
 
297
+ class ListError < StandardError
302
298
  end
299
+
303
300
  end
@@ -28,6 +28,10 @@ module DS
28
28
  end
29
29
 
30
30
  def to_a
31
+ @store
32
+ end
33
+
34
+ def flatten
31
35
  @store.flatten
32
36
  end
33
37
 
@@ -0,0 +1,14 @@
1
+ module DS
2
+ class Pair
3
+ attr_accessor :key, :value
4
+
5
+ alias :first :key
6
+ alias :second :value
7
+
8
+ def initialize(x,y)
9
+ @key = x
10
+ @value = y
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,36 @@
1
+ module DS
2
+ class PriorityQueue < Queue
3
+
4
+ #Create new priority queue. Internaly uses heap to store elements.
5
+ def initialize
6
+ @store = BinaryHeap.new {|parent,child| parent.key >= child.key}
7
+ end
8
+
9
+
10
+ #Adds element to queue with given priority.
11
+ def enqueue x, priority
12
+ pair = Pair.new(priority,x)
13
+ @store.insert(pair)
14
+ self
15
+ end
16
+
17
+ alias :push :enqueue
18
+
19
+ #Removes element with highest priority from queue .
20
+ def dequeue
21
+ if x = @store.shift
22
+ x.value
23
+ else
24
+ x
25
+ end
26
+ end
27
+
28
+ alias :shift :dequeue
29
+
30
+ #Returns element with highest priority.
31
+ def peek
32
+ @store.data.first.value
33
+ end
34
+
35
+ end
36
+ end