ds 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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/.gitignore
CHANGED
data/README.rdoc
ADDED
@@ -0,0 +1,490 @@
|
|
1
|
+
= DS - Data Structures
|
2
|
+
|
3
|
+
DS provides some common data structures not implement in Ruby natively.
|
4
|
+
|
5
|
+
The DS gem supports the folowing data structures:
|
6
|
+
|
7
|
+
* Pair
|
8
|
+
* Stacks
|
9
|
+
* Stack
|
10
|
+
* Queues
|
11
|
+
* Queue
|
12
|
+
* PriorityQueue
|
13
|
+
* Lists
|
14
|
+
* List
|
15
|
+
* CyclicList
|
16
|
+
* Ring
|
17
|
+
* Trees
|
18
|
+
* Tree
|
19
|
+
* BinaryTree
|
20
|
+
* CompleteBinaryTree
|
21
|
+
* BinaryHeap
|
22
|
+
* BinarySearchTree
|
23
|
+
* Trie
|
24
|
+
* Graphs
|
25
|
+
* Graph
|
26
|
+
* Digraph
|
27
|
+
* Matrixes
|
28
|
+
* Array2D
|
29
|
+
* ExpandableArray
|
30
|
+
* TriMatrix
|
31
|
+
* Sets
|
32
|
+
* OrderedSet
|
33
|
+
|
34
|
+
|
35
|
+
== Instalation
|
36
|
+
|
37
|
+
gem install ds
|
38
|
+
|
39
|
+
== Usage
|
40
|
+
|
41
|
+
require 'ds'
|
42
|
+
stack = DS::Stack.new
|
43
|
+
|
44
|
+
# To not have to type "DS::" before each class, use:
|
45
|
+
include DS
|
46
|
+
stack = Stack.new
|
47
|
+
|
48
|
+
=== Pair
|
49
|
+
|
50
|
+
Pair is simple key-value data structure.
|
51
|
+
|
52
|
+
Creating new Pair
|
53
|
+
p = Pair.new(3,9)
|
54
|
+
|
55
|
+
Accessors defined on Pair object:
|
56
|
+
|
57
|
+
p.key #=> 3
|
58
|
+
p.first #=> 3
|
59
|
+
p.value #=> 9
|
60
|
+
p.second #=> 9
|
61
|
+
p.second = 27
|
62
|
+
|
63
|
+
=== Stack
|
64
|
+
|
65
|
+
Stack is very simple data structure which allows access only to the top element.
|
66
|
+
More: {Stack}[http://en.wikipedia.org/wiki/Stack_(abstract_data_type)]
|
67
|
+
|
68
|
+
Creating new Stack (implemented as Array).
|
69
|
+
stack = Stack.new
|
70
|
+
|
71
|
+
The following methods are available on a Stack:
|
72
|
+
|
73
|
+
* push
|
74
|
+
* pop
|
75
|
+
* size
|
76
|
+
* empty?
|
77
|
+
* size
|
78
|
+
|
79
|
+
Examples:
|
80
|
+
stack.empty? #=> true
|
81
|
+
stack.push :first
|
82
|
+
stack.push :second
|
83
|
+
stack.size #=> 2
|
84
|
+
stack.peek #=> :second
|
85
|
+
stack.empty? #=> false
|
86
|
+
stack.pop #=> :second
|
87
|
+
stack.size #=> 1
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
=== Queues
|
92
|
+
|
93
|
+
Queues is First-In-First-Out (FIFO) data structure.
|
94
|
+
Which means that first element added to the queue will be the first one to be removed.
|
95
|
+
More: {Queue}[http://en.wikipedia.org/wiki/Queue_(data_structure)]
|
96
|
+
|
97
|
+
|
98
|
+
==== Queue
|
99
|
+
|
100
|
+
Creating new Queue (implemented as Array).
|
101
|
+
q = Queue.new
|
102
|
+
|
103
|
+
Creating new Queue (implemented as List)
|
104
|
+
q1 = Queue.create
|
105
|
+
q1 = Queue.new(:list)
|
106
|
+
|
107
|
+
The following methods are available on a Queue:
|
108
|
+
|
109
|
+
* enqueue(push)
|
110
|
+
* dequeue(shift)
|
111
|
+
* peek
|
112
|
+
* length
|
113
|
+
* empty?
|
114
|
+
|
115
|
+
Examples:
|
116
|
+
q.enqueue :first
|
117
|
+
q.push :second
|
118
|
+
q.peek #=> :first
|
119
|
+
q.length #=> 2
|
120
|
+
q.empty? #=> false
|
121
|
+
q.dequeue #=> :first
|
122
|
+
q.shift #=> :second
|
123
|
+
q.empty? #=> true
|
124
|
+
|
125
|
+
|
126
|
+
==== Priority Queue
|
127
|
+
|
128
|
+
PriorityQueue is special form of Queue (PriorityQueue inherits from Queue).
|
129
|
+
In opposite to simple Queue, in PriorityQueue each element is associated with a "priority".
|
130
|
+
More: {Priority Queue}[http://en.wikipedia.org/wiki/Priority_queue]
|
131
|
+
|
132
|
+
Creating new Priority Queue (implemented as BinaryHeap)
|
133
|
+
|
134
|
+
q = PriorityQueue.new
|
135
|
+
|
136
|
+
Examples:
|
137
|
+
q.push(:important, 3)
|
138
|
+
q.push(:very_important, 5)
|
139
|
+
q.push(:nevermind, 1)
|
140
|
+
|
141
|
+
q.shift #=> :very_important
|
142
|
+
q.peek #=> :important
|
143
|
+
q.length #=> 2
|
144
|
+
q.shift #=> :important
|
145
|
+
q.peek #=> :nevermind
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
=== Lists
|
150
|
+
|
151
|
+
=== List
|
152
|
+
|
153
|
+
List is an ordered collection of values. Each element of list has pointer to the next
|
154
|
+
element (last element points to nil).
|
155
|
+
More: {List}[http://en.wikipedia.org/wiki/List_(data_structure)]
|
156
|
+
|
157
|
+
Creating new List
|
158
|
+
l = List.new(1)
|
159
|
+
l.append(2)
|
160
|
+
or
|
161
|
+
arr = [1,2,3,4]
|
162
|
+
list = List.from_array(arr)
|
163
|
+
|
164
|
+
Examples:
|
165
|
+
|
166
|
+
Simple operation on lists
|
167
|
+
list.length #=> 4
|
168
|
+
list.append(5).to_a #=> [1,2,3,4,5]
|
169
|
+
list.prepend(0).to_a #=> [0,1,2,3,4,5]
|
170
|
+
list.remove(list.head).to_a #=> [1,2,3,4,5]
|
171
|
+
list.shift #=> 1
|
172
|
+
|
173
|
+
Accessing first and last element
|
174
|
+
list.head.data #=> 2
|
175
|
+
list.tail.data #=> 5
|
176
|
+
|
177
|
+
list.first #=> 2
|
178
|
+
list.last #=> 5
|
179
|
+
|
180
|
+
Reversing
|
181
|
+
list.reverse!.to_a #=> [5,4,3,1,0]
|
182
|
+
|
183
|
+
Enumerable methods are also available
|
184
|
+
|
185
|
+
list.map{ |e| e.data } #=> [1,2,3,4]
|
186
|
+
list.inject(0){ |mem, var| mem = mem + var.data } #=> 10
|
187
|
+
|
188
|
+
Other operations
|
189
|
+
* insert_before
|
190
|
+
* insert_after
|
191
|
+
* zip?
|
192
|
+
* merge
|
193
|
+
|
194
|
+
|
195
|
+
==== Ring
|
196
|
+
|
197
|
+
Ring is a Cyclic List where the last element(head) points to the first element(tail).
|
198
|
+
More: {Ring}[http://en.wikipedia.org/wiki/Ring_(data_structure)]
|
199
|
+
|
200
|
+
Creating new Ring
|
201
|
+
ring = Ring.from_array([1,2,3,4,5,6,7])
|
202
|
+
|
203
|
+
Examples:
|
204
|
+
ring.looped? #=> true
|
205
|
+
ring.cycle_size #=> 7
|
206
|
+
ring.eliminate_by(2) #=> 1
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
=== Trees
|
211
|
+
|
212
|
+
==== Tree
|
213
|
+
|
214
|
+
A tree is a data structure consisting of nodes organised as a hierarchy.
|
215
|
+
More: {Tree}[http://en.wikipedia.org/wiki/Tree_(data_structure)]
|
216
|
+
|
217
|
+
Building Tree
|
218
|
+
|
219
|
+
t = Tree.new(2)
|
220
|
+
c1 = t << 5
|
221
|
+
c2 = t << 8
|
222
|
+
t << 9
|
223
|
+
|
224
|
+
c1 << 4
|
225
|
+
c1 << 10
|
226
|
+
c3 = c2 << 3
|
227
|
+
|
228
|
+
Examples:
|
229
|
+
t.leaf? #=> false
|
230
|
+
c3.leaf? #=> true
|
231
|
+
|
232
|
+
t.height #=> 3
|
233
|
+
t.width #=> 3
|
234
|
+
t.leaf_count #=> 4
|
235
|
+
|
236
|
+
t.levels #=> {1=>1,2=>3, 3=>3}
|
237
|
+
|
238
|
+
Other methods
|
239
|
+
* get_leaves
|
240
|
+
* isometric?
|
241
|
+
* mirror!
|
242
|
+
|
243
|
+
Enumerable Module is included.
|
244
|
+
t.map{ |node| node.data } #=> [2,5,8,9,4,10,3]
|
245
|
+
|
246
|
+
|
247
|
+
==== Binary Tree
|
248
|
+
|
249
|
+
BinaryTree is sublass of Tree class. In BinaryTree each node can have at most two children.
|
250
|
+
More: {BinaryTree}[http://en.wikipedia.org/wiki/Binary_tree]
|
251
|
+
|
252
|
+
Building tree
|
253
|
+
bin_tree = BinaryTree.new
|
254
|
+
[2,5,8,9,11,12,14].each{|x| bin_tree.insert(x)} #build complete binary Tree
|
255
|
+
|
256
|
+
Accessors defined on BinaryTree object:
|
257
|
+
bin_tree.left #=> 5
|
258
|
+
bin_tree.right #=> 8
|
259
|
+
|
260
|
+
|
261
|
+
==== BinarySearchTree
|
262
|
+
|
263
|
+
BST is Binary Tree which has the following properties:
|
264
|
+
* The left subtree of a node contains only nodes with keys less than the node's key.
|
265
|
+
* The right subtree of a node contains only nodes with keys greater than the node's key.
|
266
|
+
* Both the left and right subtrees must also be binary search trees.
|
267
|
+
|
268
|
+
Creating
|
269
|
+
bst = BinarySearchTree.from_array([8,1,5,2,7,6,3])
|
270
|
+
|
271
|
+
Examples
|
272
|
+
walker = TreeWalker.new(b)
|
273
|
+
walker.traverse(:inorder).must_equal [1,2,3,5,6,7,8]
|
274
|
+
|
275
|
+
|
276
|
+
==== CompleteBinaryTree
|
277
|
+
|
278
|
+
A complete binary tree is a binary tree in which every level, except possibly
|
279
|
+
the last, is completely filled, and all nodes are as far left as possible.
|
280
|
+
CompleteBinaryTree is binary tree but does not inherit from Tree and BinaryTree class! Nodes are stored
|
281
|
+
internally in array.
|
282
|
+
More: {Complete Binary Tree}[http://en.wikipedia.org/wiki/Complete_binary_tree]
|
283
|
+
|
284
|
+
Creating
|
285
|
+
cbt = CompleteBinaryTree.new(1,2,3,4,5,6,7)
|
286
|
+
|
287
|
+
Examples
|
288
|
+
cbt.root #=> 1
|
289
|
+
cbt.left(0) #=> 2
|
290
|
+
cbt.right(0) #=> 3
|
291
|
+
cbt.parent(1) #=> 0
|
292
|
+
|
293
|
+
cbt.left_index(0) #=> 1
|
294
|
+
cbt.right_index(1) #=> 4
|
295
|
+
cpt.parent_index(1) #=> 0
|
296
|
+
|
297
|
+
|
298
|
+
==== Binary Heap
|
299
|
+
|
300
|
+
BinaryHeap is Complete Binary Tree in which every node satisfies heap property. Binary Heap allows very fast
|
301
|
+
access to maximum or minimum element of the tree.
|
302
|
+
More: {Binary Heap}[http://en.wikipedia.org/wiki/Binary_heap]
|
303
|
+
|
304
|
+
Creating
|
305
|
+
|
306
|
+
Maximum Binary Heap
|
307
|
+
max_heap = BinaryHeap.new(9,8,4,5,11,6)
|
308
|
+
or
|
309
|
+
max_heap = BinaryHeap.max(9,8,4,5,11,6)
|
310
|
+
|
311
|
+
Minimum Binary Heap
|
312
|
+
min_heap = BinaryHeap.min(9,8,4,5,11,6)
|
313
|
+
or
|
314
|
+
BinaryHeap.new(9,8,4,5,11,6){|parent,child| parent < child}
|
315
|
+
|
316
|
+
You can set heap relation by passing block to BinaryHeap constructor.
|
317
|
+
|
318
|
+
Examples
|
319
|
+
max_heap.shift #returns max element (11)
|
320
|
+
max_heap.to_a #=> [9,8,6,5,4]
|
321
|
+
max_heap.insert 15
|
322
|
+
max_heap.shift #=> 15
|
323
|
+
|
324
|
+
min_heap.shift #returns min element (4)
|
325
|
+
|
326
|
+
|
327
|
+
==== Trie
|
328
|
+
|
329
|
+
Trie is an ordered tree data structure which allows very quick search: O(k), where k is word length.
|
330
|
+
More: {Trie}[http://en.wikipedia.org/wiki/Trie]
|
331
|
+
|
332
|
+
Creating
|
333
|
+
trie = Trie.new
|
334
|
+
|
335
|
+
Examples
|
336
|
+
trie.insert("thing",true);
|
337
|
+
trie.find("thing") # => true
|
338
|
+
|
339
|
+
|
340
|
+
==== Traversing Tree
|
341
|
+
|
342
|
+
b= BinaryTree.new
|
343
|
+
[2,5,8,9,11,12,14].each{|x| b.insert(x)}
|
344
|
+
|
345
|
+
walker = TreeWalker.new(b)
|
346
|
+
|
347
|
+
Iterating in postorder
|
348
|
+
walker.traverse(:postorder) #=> [9,11,5,12,14,8,2]
|
349
|
+
Iterating in inorder
|
350
|
+
walker.traverse(:inorder) #=> [9,5,11,2,12,8,14]
|
351
|
+
Iterating in preorder
|
352
|
+
walker.traverse(:preorder) #=> [2,5,9,11,8,12,14]
|
353
|
+
|
354
|
+
Iterating in BFS order
|
355
|
+
walker.each{ |x| x } #=> [2,5,8,9,11,12,14]
|
356
|
+
|
357
|
+
|
358
|
+
You can also pass block to traverse method
|
359
|
+
walker.traverse(:inorder){|n| p n.data**2}
|
360
|
+
|
361
|
+
If you want to change value of tree nodes, use recalculate! method
|
362
|
+
walker.recalculate!(b,:preorder,0){|x,memo| memo = memo+x.data}
|
363
|
+
|
364
|
+
|
365
|
+
|
366
|
+
=== Graphs
|
367
|
+
|
368
|
+
A graph data structure consists of a finite (and possibly mutable) set of
|
369
|
+
ordered pairs, called edges or arcs, of certain entities called nodes or
|
370
|
+
vertices.
|
371
|
+
More: {Graph}[http://en.wikipedia.org/wiki/Graph_(data_structure)]
|
372
|
+
|
373
|
+
|
374
|
+
====Graph
|
375
|
+
|
376
|
+
Creating new Graph
|
377
|
+
|
378
|
+
edges = []
|
379
|
+
edges << Edge.new('Lukas','Marc')
|
380
|
+
edges << Edge.new('Lukas','Tom')
|
381
|
+
edges << Edge.new('Marc','Jack')
|
382
|
+
edges << Edge.new('Tom','Marc')
|
383
|
+
|
384
|
+
New graph implemented as Triangular Matrix
|
385
|
+
graph = Graph.create(edges)
|
386
|
+
|
387
|
+
New graph implemented as Matrix
|
388
|
+
graph = Graph.new(edges,:matrix)
|
389
|
+
|
390
|
+
New graph implemented as Adjency List
|
391
|
+
graph = Graph.new(edges,:list)
|
392
|
+
|
393
|
+
Examples:
|
394
|
+
|
395
|
+
graph.vertex_size #=> 4
|
396
|
+
graph.degree("Marc") #=> 3
|
397
|
+
graph.edge?("Marc","Tom") #=> true
|
398
|
+
graph.edge?("Tom","Jack") #=> false
|
399
|
+
graph.add_edges([Edge.new("Marc","Kate")])
|
400
|
+
graph.remove("Marc","Jack")
|
401
|
+
graph.neighbors('Tom') #=> ["Marc","Lucas"]
|
402
|
+
|
403
|
+
Iterating
|
404
|
+
graph.each_edge{|e| p e}
|
405
|
+
graph.each_vertex{ |v| p v }
|
406
|
+
|
407
|
+
|
408
|
+
==== Digraph
|
409
|
+
|
410
|
+
Creating Directed Weighted Graph is simple like that:
|
411
|
+
|
412
|
+
edges = []
|
413
|
+
|
414
|
+
edges << Edge.new(:A,:C,5)
|
415
|
+
edges << Edge.new(:A,:D,3)
|
416
|
+
edges << Edge.new(:A,:G,14)
|
417
|
+
edges << Edge.new(:C,:E,3)
|
418
|
+
edges << Edge.new(:C,:F,2)
|
419
|
+
edges << Edge.new(:D,:C,11)
|
420
|
+
edges << Edge.new(:D,:E,7)
|
421
|
+
edges << Edge.new(:D,:G,6)
|
422
|
+
edges << Edge.new(:G,:E,7)
|
423
|
+
edges << Edge.new(:E,:B,5)
|
424
|
+
edges << Edge.new(:G,:B,6)
|
425
|
+
edges << Edge.new(:F,:B,7)
|
426
|
+
|
427
|
+
wdigraph = Digraph.create(edges)
|
428
|
+
|
429
|
+
Examples
|
430
|
+
wdigraph.get_edge(:D,:C).weight #=> 11
|
431
|
+
wdigraph.degree(:E) #=> 4
|
432
|
+
wdigraph.in_degree(:E) #=> 3
|
433
|
+
wdigraph.out_degree(:E) #=> 1
|
434
|
+
wdigraph.bfs(:A) #=> [:A, :C, :D, :G, :E, :F, :B]
|
435
|
+
|
436
|
+
|
437
|
+
|
438
|
+
|
439
|
+
=== Matrixes
|
440
|
+
|
441
|
+
==== Array2D
|
442
|
+
|
443
|
+
Simple two dimensional array(matrix).
|
444
|
+
Array2D extends automatically like simple Array.
|
445
|
+
|
446
|
+
Creating
|
447
|
+
discrete_matrix = Array2D.new(2,0)
|
448
|
+
|
449
|
+
Examples
|
450
|
+
discrete_matrix.to_a #=> [[0,0],[0,0]]
|
451
|
+
discrete_matrix[3,3] #=> 0
|
452
|
+
|
453
|
+
|
454
|
+
|
455
|
+
==== ExpandableArray
|
456
|
+
|
457
|
+
arr = ExpandableArray.new(0,0)
|
458
|
+
arr[4] = 1 #=> [0,0,0,0,4]
|
459
|
+
|
460
|
+
|
461
|
+
==== TriMatrix
|
462
|
+
Triangular matrix is a special kind of matrix where M[x,y] = M[y,x].
|
463
|
+
More: {Triangular Matrixe}[http://en.wikipedia.org/wiki/Triangular_matrix]
|
464
|
+
|
465
|
+
Creating
|
466
|
+
tri_matrix = TriMatrix.new
|
467
|
+
tri_matrix[0,1] = true
|
468
|
+
tri_matrix[0,2] = true
|
469
|
+
|
470
|
+
Examples
|
471
|
+
tri_matrix[0,1] == tri_matrix[1,0] #=> true
|
472
|
+
|
473
|
+
|
474
|
+
|
475
|
+
=== Sets
|
476
|
+
|
477
|
+
==== OrderedSet
|
478
|
+
OrderedSet is a set whose elements are ordered. In opposite to Array duplicates
|
479
|
+
are not allowed.
|
480
|
+
|
481
|
+
Creating new Ordered Set
|
482
|
+
set = OrderedSet.new
|
483
|
+
|
484
|
+
Examples
|
485
|
+
set.push(:first) #=> 0
|
486
|
+
set.push(:second) #=> 1
|
487
|
+
set.index(:first) #=> 0
|
488
|
+
set.to_a #=> [:first, :second]
|
489
|
+
|
490
|
+
|