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