grosser-algorithms 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/Manifest +45 -0
  2. data/VERSION +1 -0
  3. data/ext/containers/bst/bst.c +249 -0
  4. data/ext/containers/bst/extconf.rb +4 -0
  5. data/grosser-algorithms.gemspec +4 -4
  6. data/rdoc/classes/Algorithms.html +221 -0
  7. data/rdoc/classes/Algorithms/Algorithms.html +115 -0
  8. data/rdoc/classes/Algorithms/Algorithms/Sort.html +569 -0
  9. data/rdoc/classes/Algorithms/Containers.html +162 -0
  10. data/rdoc/classes/Algorithms/Containers/Heap.html +690 -0
  11. data/rdoc/classes/Algorithms/Containers/KDTree.html +195 -0
  12. data/rdoc/classes/Algorithms/Containers/MaxHeap.html +238 -0
  13. data/rdoc/classes/Algorithms/Containers/MinHeap.html +238 -0
  14. data/rdoc/classes/Algorithms/Containers/PriorityQueue.html +456 -0
  15. data/rdoc/classes/Algorithms/Containers/Queue.html +363 -0
  16. data/rdoc/classes/Algorithms/Containers/RubyDeque.html +617 -0
  17. data/rdoc/classes/Algorithms/Containers/RubyRBTreeMap.html +662 -0
  18. data/rdoc/classes/Algorithms/Containers/RubySplayTreeMap.html +623 -0
  19. data/rdoc/classes/Algorithms/Containers/Stack.html +363 -0
  20. data/rdoc/classes/Algorithms/Containers/SuffixArray.html +246 -0
  21. data/rdoc/classes/Algorithms/Containers/Trie.html +555 -0
  22. data/rdoc/classes/Algorithms/Search.html +273 -0
  23. data/rdoc/created.rid +1 -0
  24. data/rdoc/files/History_txt.html +281 -0
  25. data/rdoc/files/README_markdown.html +248 -0
  26. data/rdoc/files/lib/algorithms/search_rb.html +108 -0
  27. data/rdoc/files/lib/algorithms/sort_rb.html +108 -0
  28. data/rdoc/files/lib/algorithms/string_rb.html +115 -0
  29. data/rdoc/files/lib/algorithms_rb.html +252 -0
  30. data/rdoc/files/lib/containers/deque_rb.html +119 -0
  31. data/rdoc/files/lib/containers/heap_rb.html +124 -0
  32. data/rdoc/files/lib/containers/kd_tree_rb.html +135 -0
  33. data/rdoc/files/lib/containers/priority_queue_rb.html +108 -0
  34. data/rdoc/files/lib/containers/queue_rb.html +108 -0
  35. data/rdoc/files/lib/containers/rb_tree_map_rb.html +109 -0
  36. data/rdoc/files/lib/containers/splay_tree_map_rb.html +109 -0
  37. data/rdoc/files/lib/containers/stack_rb.html +108 -0
  38. data/rdoc/files/lib/containers/suffix_array_rb.html +113 -0
  39. data/rdoc/files/lib/containers/trie_rb.html +117 -0
  40. data/rdoc/fr_class_index.html +43 -0
  41. data/rdoc/fr_file_index.html +42 -0
  42. data/rdoc/fr_method_index.html +147 -0
  43. data/rdoc/index.html +24 -0
  44. data/rdoc/rdoc-style.css +208 -0
  45. data/spec/bst_gc_mark_spec.rb +25 -0
  46. data/spec/bst_spec.rb +25 -0
  47. metadata +50 -3
@@ -0,0 +1,555 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: Algorithms::Containers::Trie</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">Algorithms::Containers::Trie</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../../files/lib/containers/trie_rb.html">
59
+ lib/containers/trie.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ Object
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+
82
+
83
+ </div>
84
+
85
+ <div id="method-list">
86
+ <h3 class="section-bar">Methods</h3>
87
+
88
+ <div class="name-list">
89
+ <a href="#M000033">[]</a>&nbsp;&nbsp;
90
+ <a href="#M000029">[]=</a>&nbsp;&nbsp;
91
+ <a href="#M000032">get</a>&nbsp;&nbsp;
92
+ <a href="#M000039">get_recursive</a>&nbsp;&nbsp;
93
+ <a href="#M000030">has_key?</a>&nbsp;&nbsp;
94
+ <a href="#M000031">include?</a>&nbsp;&nbsp;
95
+ <a href="#M000034">longest_prefix</a>&nbsp;&nbsp;
96
+ <a href="#M000027">new</a>&nbsp;&nbsp;
97
+ <a href="#M000037">prefix_recursive</a>&nbsp;&nbsp;
98
+ <a href="#M000028">push</a>&nbsp;&nbsp;
99
+ <a href="#M000038">push_recursive</a>&nbsp;&nbsp;
100
+ <a href="#M000035">wildcard</a>&nbsp;&nbsp;
101
+ <a href="#M000036">wildcard_recursive</a>&nbsp;&nbsp;
102
+ </div>
103
+ </div>
104
+
105
+ </div>
106
+
107
+
108
+ <!-- if includes -->
109
+
110
+ <div id="section">
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+ <!-- if method_list -->
120
+ <div id="methods">
121
+ <h3 class="section-bar">Public Class methods</h3>
122
+
123
+ <div id="method-M000027" class="method-detail">
124
+ <a name="M000027"></a>
125
+
126
+ <div class="method-heading">
127
+ <a href="#M000027" class="method-signature">
128
+ <span class="method-name">new</span><span class="method-args">()</span>
129
+ </a>
130
+ </div>
131
+
132
+ <div class="method-description">
133
+ <p>
134
+ Create a <a href="Trie.html#M000027">new</a>, empty <a
135
+ href="Trie.html">Trie</a>.
136
+ </p>
137
+ <pre>
138
+ t =
139
+ </pre>
140
+ <p>
141
+ <a href="Trie.html#M000027">Trie.new</a>
142
+ </p>
143
+ <pre>
144
+ t[&quot;hello&quot;] = &quot;world&quot;
145
+ t[&quot;hello] #=&gt; &quot;world&quot;
146
+ </pre>
147
+ <p><a class="source-toggle" href="#"
148
+ onclick="toggleCode('M000027-source');return false;">[Source]</a></p>
149
+ <div class="method-source-code" id="M000027-source">
150
+ <pre>
151
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 20</span>
152
+ 20: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>
153
+ 21: <span class="ruby-ivar">@root</span> = <span class="ruby-keyword kw">nil</span>
154
+ 22: <span class="ruby-keyword kw">end</span>
155
+ </pre>
156
+ </div>
157
+ </div>
158
+ </div>
159
+
160
+ <h3 class="section-bar">Public Instance methods</h3>
161
+
162
+ <div id="method-M000033" class="method-detail">
163
+ <a name="M000033"></a>
164
+
165
+ <div class="method-heading">
166
+ <span class="method-name">[]</span><span class="method-args">(key)</span>
167
+ </div>
168
+
169
+ <div class="method-description">
170
+ <p>
171
+ Alias for <a href="Trie.html#M000032">get</a>
172
+ </p>
173
+ </div>
174
+ </div>
175
+
176
+ <div id="method-M000029" class="method-detail">
177
+ <a name="M000029"></a>
178
+
179
+ <div class="method-heading">
180
+ <span class="method-name">[]=</span><span class="method-args">(key, value)</span>
181
+ </div>
182
+
183
+ <div class="method-description">
184
+ <p>
185
+ Alias for <a href="Trie.html#M000028">push</a>
186
+ </p>
187
+ </div>
188
+ </div>
189
+
190
+ <div id="method-M000032" class="method-detail">
191
+ <a name="M000032"></a>
192
+
193
+ <div class="method-heading">
194
+ <a href="#M000032" class="method-signature">
195
+ <span class="method-name">get</span><span class="method-args">(key)</span>
196
+ </a>
197
+ </div>
198
+
199
+ <div class="method-description">
200
+ <p>
201
+ Returns the value of the desired key, or nil if the key doesn&#8216;t
202
+ exist.
203
+ </p>
204
+ <p>
205
+ Complexity: O(m) worst case
206
+ </p>
207
+ <pre>
208
+ t = Algorithms::Containers::Trie.new
209
+ t.get(&quot;hello&quot;) = &quot;world&quot;
210
+ t.get(&quot;non-existant&quot;) #=&gt; nil
211
+ </pre>
212
+ <p><a class="source-toggle" href="#"
213
+ onclick="toggleCode('M000032-source');return false;">[Source]</a></p>
214
+ <div class="method-source-code" id="M000032-source">
215
+ <pre>
216
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 61</span>
217
+ 61: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">get</span>(<span class="ruby-identifier">key</span>)
218
+ 62: <span class="ruby-identifier">key</span> = <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>
219
+ 63: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">empty?</span>
220
+ 64: <span class="ruby-identifier">node</span> = <span class="ruby-identifier">get_recursive</span>(<span class="ruby-ivar">@root</span>, <span class="ruby-identifier">key</span>, <span class="ruby-value">0</span>)
221
+ 65: <span class="ruby-identifier">node</span> <span class="ruby-value">? </span><span class="ruby-identifier">node</span>.<span class="ruby-identifier">last</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
222
+ 66: <span class="ruby-keyword kw">end</span>
223
+ </pre>
224
+ </div>
225
+ </div>
226
+ </div>
227
+
228
+ <div id="method-M000039" class="method-detail">
229
+ <a name="M000039"></a>
230
+
231
+ <div class="method-heading">
232
+ <a href="#M000039" class="method-signature">
233
+ <span class="method-name">get_recursive</span><span class="method-args">(node, string, index)</span>
234
+ </a>
235
+ </div>
236
+
237
+ <div class="method-description">
238
+ <p>
239
+ Returns [char, value] if found
240
+ </p>
241
+ <p><a class="source-toggle" href="#"
242
+ onclick="toggleCode('M000039-source');return false;">[Source]</a></p>
243
+ <div class="method-source-code" id="M000039-source">
244
+ <pre>
245
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 173</span>
246
+ 173: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">get_recursive</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>)
247
+ 174: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">nil?</span>
248
+ 175: <span class="ruby-identifier">char</span> = <span class="ruby-identifier">string</span>[<span class="ruby-identifier">index</span>]
249
+ 176: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">char</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
250
+ 177: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">get_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">left</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>)
251
+ 178: <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">char</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
252
+ 179: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">get_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">right</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>)
253
+ 180: <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">index</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>) <span class="ruby-comment cmt"># We're not at the end of the input string; add next char</span>
254
+ 181: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">get_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">mid</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>)
255
+ 182: <span class="ruby-keyword kw">else</span>
256
+ 183: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">last?</span> <span class="ruby-value">? </span>[<span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>, <span class="ruby-identifier">node</span>.<span class="ruby-identifier">value</span>] <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
257
+ 184: <span class="ruby-keyword kw">end</span>
258
+ 185: <span class="ruby-keyword kw">end</span>
259
+ </pre>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ <div id="method-M000030" class="method-detail">
265
+ <a name="M000030"></a>
266
+
267
+ <div class="method-heading">
268
+ <a href="#M000030" class="method-signature">
269
+ <span class="method-name">has_key?</span><span class="method-args">(key)</span>
270
+ </a>
271
+ </div>
272
+
273
+ <div class="method-description">
274
+ <p>
275
+ Returns true if the key is contained in the <a href="Trie.html">Trie</a>.
276
+ </p>
277
+ <p>
278
+ Complexity: O(m) worst case
279
+ </p>
280
+ <p><a class="source-toggle" href="#"
281
+ onclick="toggleCode('M000030-source');return false;">[Source]</a></p>
282
+ <div class="method-source-code" id="M000030-source">
283
+ <pre>
284
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 47</span>
285
+ 47: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">key</span>)
286
+ 48: <span class="ruby-identifier">key</span> = <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>
287
+ 49: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">empty?</span>
288
+ 50: <span class="ruby-operator">!</span>(<span class="ruby-identifier">get_recursive</span>(<span class="ruby-ivar">@root</span>, <span class="ruby-identifier">key</span>, <span class="ruby-value">0</span>).<span class="ruby-identifier">nil?</span>)
289
+ 51: <span class="ruby-keyword kw">end</span>
290
+ </pre>
291
+ </div>
292
+ </div>
293
+ </div>
294
+
295
+ <div id="method-M000031" class="method-detail">
296
+ <a name="M000031"></a>
297
+
298
+ <div class="method-heading">
299
+ <span class="method-name">include?</span><span class="method-args">(key)</span>
300
+ </div>
301
+
302
+ <div class="method-description">
303
+ <p>
304
+ Alias for has_key?
305
+ </p>
306
+ </div>
307
+ </div>
308
+
309
+ <div id="method-M000034" class="method-detail">
310
+ <a name="M000034"></a>
311
+
312
+ <div class="method-heading">
313
+ <a href="#M000034" class="method-signature">
314
+ <span class="method-name">longest_prefix</span><span class="method-args">(string)</span>
315
+ </a>
316
+ </div>
317
+
318
+ <div class="method-description">
319
+ <p>
320
+ Returns the longest key that has a prefix in common with the parameter
321
+ string. If no match is found, the blank string &quot;&quot; is returned.
322
+ </p>
323
+ <p>
324
+ Complexity: O(m) worst case
325
+ </p>
326
+ <pre>
327
+ t = Algorithms::Containers::Trie.new
328
+ t.push(&quot;Hello&quot;, &quot;World&quot;)
329
+ t.push(&quot;Hello, brother&quot;, &quot;World&quot;)
330
+ t.push(&quot;Hello, bob&quot;, &quot;World&quot;)
331
+ t.longest_prefix(&quot;Hello, brandon&quot;) #=&gt; &quot;Hello&quot;
332
+ t.longest_prefix(&quot;Hel&quot;) #=&gt; &quot;&quot;
333
+ t.longest_prefix(&quot;Hello&quot;) #=&gt; &quot;Hello&quot;
334
+ </pre>
335
+ <p><a class="source-toggle" href="#"
336
+ onclick="toggleCode('M000034-source');return false;">[Source]</a></p>
337
+ <div class="method-source-code" id="M000034-source">
338
+ <pre>
339
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 81</span>
340
+ 81: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">longest_prefix</span>(<span class="ruby-identifier">string</span>)
341
+ 82: <span class="ruby-identifier">string</span> = <span class="ruby-identifier">string</span>.<span class="ruby-identifier">to_s</span>
342
+ 83: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">empty?</span>
343
+ 84: <span class="ruby-identifier">len</span> = <span class="ruby-identifier">prefix_recursive</span>(<span class="ruby-ivar">@root</span>, <span class="ruby-identifier">string</span>, <span class="ruby-value">0</span>)
344
+ 85: <span class="ruby-identifier">string</span>[<span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">len</span>]
345
+ 86: <span class="ruby-keyword kw">end</span>
346
+ </pre>
347
+ </div>
348
+ </div>
349
+ </div>
350
+
351
+ <div id="method-M000037" class="method-detail">
352
+ <a name="M000037"></a>
353
+
354
+ <div class="method-heading">
355
+ <a href="#M000037" class="method-signature">
356
+ <span class="method-name">prefix_recursive</span><span class="method-args">(node, string, index)</span>
357
+ </a>
358
+ </div>
359
+
360
+ <div class="method-description">
361
+ <p><a class="source-toggle" href="#"
362
+ onclick="toggleCode('M000037-source');return false;">[Source]</a></p>
363
+ <div class="method-source-code" id="M000037-source">
364
+ <pre>
365
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 140</span>
366
+ 140: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">prefix_recursive</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>)
367
+ 141: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">index</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span>
368
+ 142: <span class="ruby-identifier">len</span> = <span class="ruby-value">0</span>
369
+ 143: <span class="ruby-identifier">rec_len</span> = <span class="ruby-value">0</span>
370
+ 144: <span class="ruby-identifier">char</span> = <span class="ruby-identifier">string</span>[<span class="ruby-identifier">index</span>]
371
+ 145: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">char</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
372
+ 146: <span class="ruby-identifier">rec_len</span> = <span class="ruby-identifier">prefix_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">left</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>)
373
+ 147: <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">char</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
374
+ 148: <span class="ruby-identifier">rec_len</span> = <span class="ruby-identifier">prefix_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">right</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>)
375
+ 149: <span class="ruby-keyword kw">else</span>
376
+ 150: <span class="ruby-identifier">len</span> = <span class="ruby-identifier">index</span><span class="ruby-operator">+</span><span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">last?</span>
377
+ 151: <span class="ruby-identifier">rec_len</span> = <span class="ruby-identifier">prefix_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">mid</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>)
378
+ 152: <span class="ruby-keyword kw">end</span>
379
+ 153: <span class="ruby-identifier">len</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">rec_len</span> <span class="ruby-value">? </span><span class="ruby-identifier">len</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">rec_len</span>
380
+ 154: <span class="ruby-keyword kw">end</span>
381
+ </pre>
382
+ </div>
383
+ </div>
384
+ </div>
385
+
386
+ <div id="method-M000028" class="method-detail">
387
+ <a name="M000028"></a>
388
+
389
+ <div class="method-heading">
390
+ <a href="#M000028" class="method-signature">
391
+ <span class="method-name">push</span><span class="method-args">(key, value)</span>
392
+ </a>
393
+ </div>
394
+
395
+ <div class="method-description">
396
+ <p>
397
+ Adds a key, value pair to the <a href="Trie.html">Trie</a>, and returns the
398
+ value if successful. The to_s method is called on the parameter to turn it
399
+ into a string.
400
+ </p>
401
+ <p>
402
+ Complexity: O(m)
403
+ </p>
404
+ <pre>
405
+ t = Algorithms::Containers::Trie.new
406
+ t[&quot;hello&quot;] = &quot;world&quot;
407
+ t.push(&quot;hello&quot;, &quot;world&quot;) # does the same thing
408
+ t[&quot;hello&quot;] #=&gt; &quot;world&quot;
409
+ t[1] = 1
410
+ t[1] #=&gt; 1
411
+ </pre>
412
+ <p><a class="source-toggle" href="#"
413
+ onclick="toggleCode('M000028-source');return false;">[Source]</a></p>
414
+ <div class="method-source-code" id="M000028-source">
415
+ <pre>
416
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 35</span>
417
+ 35: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">push</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>)
418
+ 36: <span class="ruby-identifier">key</span> = <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>
419
+ 37: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">empty?</span>
420
+ 38: <span class="ruby-ivar">@root</span> = <span class="ruby-identifier">push_recursive</span>(<span class="ruby-ivar">@root</span>, <span class="ruby-identifier">key</span>, <span class="ruby-value">0</span>, <span class="ruby-identifier">value</span>)
421
+ 39: <span class="ruby-identifier">value</span>
422
+ 40: <span class="ruby-keyword kw">end</span>
423
+ </pre>
424
+ </div>
425
+ </div>
426
+ </div>
427
+
428
+ <div id="method-M000038" class="method-detail">
429
+ <a name="M000038"></a>
430
+
431
+ <div class="method-heading">
432
+ <a href="#M000038" class="method-signature">
433
+ <span class="method-name">push_recursive</span><span class="method-args">(node, string, index, value)</span>
434
+ </a>
435
+ </div>
436
+
437
+ <div class="method-description">
438
+ <p><a class="source-toggle" href="#"
439
+ onclick="toggleCode('M000038-source');return false;">[Source]</a></p>
440
+ <div class="method-source-code" id="M000038-source">
441
+ <pre>
442
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 156</span>
443
+ 156: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">push_recursive</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>, <span class="ruby-identifier">value</span>)
444
+ 157: <span class="ruby-identifier">char</span> = <span class="ruby-identifier">string</span>[<span class="ruby-identifier">index</span>]
445
+ 158: <span class="ruby-identifier">node</span> = <span class="ruby-constant">Node</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">char</span>, <span class="ruby-identifier">value</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">nil?</span>
446
+ 159: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">char</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
447
+ 160: <span class="ruby-identifier">node</span>.<span class="ruby-identifier">left</span> = <span class="ruby-identifier">push_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">left</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>, <span class="ruby-identifier">value</span>)
448
+ 161: <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">char</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
449
+ 162: <span class="ruby-identifier">node</span>.<span class="ruby-identifier">right</span> = <span class="ruby-identifier">push_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">right</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>, <span class="ruby-identifier">value</span>)
450
+ 163: <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">index</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>) <span class="ruby-comment cmt"># We're not at the end of the input string; add next char</span>
451
+ 164: <span class="ruby-identifier">node</span>.<span class="ruby-identifier">mid</span> = <span class="ruby-identifier">push_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">mid</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>, <span class="ruby-identifier">value</span>)
452
+ 165: <span class="ruby-keyword kw">else</span>
453
+ 166: <span class="ruby-identifier">node</span>.<span class="ruby-identifier">end</span> = <span class="ruby-keyword kw">true</span>
454
+ 167: <span class="ruby-identifier">node</span>.<span class="ruby-identifier">value</span> = <span class="ruby-identifier">value</span>
455
+ 168: <span class="ruby-keyword kw">end</span>
456
+ 169: <span class="ruby-identifier">node</span>
457
+ 170: <span class="ruby-keyword kw">end</span>
458
+ </pre>
459
+ </div>
460
+ </div>
461
+ </div>
462
+
463
+ <div id="method-M000035" class="method-detail">
464
+ <a name="M000035"></a>
465
+
466
+ <div class="method-heading">
467
+ <a href="#M000035" class="method-signature">
468
+ <span class="method-name">wildcard</span><span class="method-args">(string)</span>
469
+ </a>
470
+ </div>
471
+
472
+ <div class="method-description">
473
+ <p>
474
+ Returns a sorted array containing strings that match the parameter string.
475
+ The <a href="Trie.html#M000035">wildcard</a> characters that match any
476
+ character are &#8217;*&#8217; and &#8217;.&#8217; If no match is found, an
477
+ empty array is returned.
478
+ </p>
479
+ <p>
480
+ Complexity: O(n) worst case
481
+ </p>
482
+ <pre>
483
+ t = Algorithms::Containers::Trie.new
484
+ t.push(&quot;Hello&quot;, &quot;World&quot;)
485
+ t.push(&quot;Hilly&quot;, &quot;World&quot;)
486
+ t.push(&quot;Hello, bob&quot;, &quot;World&quot;)
487
+ t.wildcard(&quot;H*ll.&quot;) #=&gt; [&quot;Hello&quot;, &quot;Hilly&quot;]
488
+ t.wildcard(&quot;Hel&quot;) #=&gt; []
489
+ </pre>
490
+ <p><a class="source-toggle" href="#"
491
+ onclick="toggleCode('M000035-source');return false;">[Source]</a></p>
492
+ <div class="method-source-code" id="M000035-source">
493
+ <pre>
494
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 100</span>
495
+ 100: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">wildcard</span>(<span class="ruby-identifier">string</span>)
496
+ 101: <span class="ruby-identifier">string</span> = <span class="ruby-identifier">string</span>.<span class="ruby-identifier">to_s</span>
497
+ 102: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">empty?</span>
498
+ 103: <span class="ruby-identifier">ary</span> = []
499
+ 104: <span class="ruby-identifier">ary</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">wildcard_recursive</span>(<span class="ruby-ivar">@root</span>, <span class="ruby-identifier">string</span>, <span class="ruby-value">0</span>, <span class="ruby-value str">&quot;&quot;</span>)
500
+ 105: <span class="ruby-identifier">ary</span>.<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">compact</span>.<span class="ruby-identifier">sort</span>
501
+ 106: <span class="ruby-keyword kw">end</span>
502
+ </pre>
503
+ </div>
504
+ </div>
505
+ </div>
506
+
507
+ <div id="method-M000036" class="method-detail">
508
+ <a name="M000036"></a>
509
+
510
+ <div class="method-heading">
511
+ <a href="#M000036" class="method-signature">
512
+ <span class="method-name">wildcard_recursive</span><span class="method-args">(node, string, index, prefix)</span>
513
+ </a>
514
+ </div>
515
+
516
+ <div class="method-description">
517
+ <p><a class="source-toggle" href="#"
518
+ onclick="toggleCode('M000036-source');return false;">[Source]</a></p>
519
+ <div class="method-source-code" id="M000036-source">
520
+ <pre>
521
+ <span class="ruby-comment cmt"># File lib/containers/trie.rb, line 123</span>
522
+ 123: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">wildcard_recursive</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>, <span class="ruby-identifier">prefix</span>)
523
+ 124: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">index</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span>
524
+ 125: <span class="ruby-identifier">arr</span> = []
525
+ 126: <span class="ruby-identifier">char</span> = <span class="ruby-identifier">string</span>[<span class="ruby-identifier">index</span>]
526
+ 127: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;*&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;.&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">char</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
527
+ 128: <span class="ruby-identifier">arr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">wildcard_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">left</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>, <span class="ruby-identifier">prefix</span>)
528
+ 129: <span class="ruby-keyword kw">end</span>
529
+ 130: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;*&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;.&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">char</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
530
+ 131: <span class="ruby-identifier">arr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">wildcard_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">right</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span>, <span class="ruby-identifier">prefix</span>)
531
+ 132: <span class="ruby-keyword kw">end</span>
532
+ 133: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;*&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;.&quot;</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">char</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>)
533
+ 134: <span class="ruby-identifier">arr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{prefix}#{node.char.chr}&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">last?</span>
534
+ 135: <span class="ruby-identifier">arr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">wildcard_recursive</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">mid</span>, <span class="ruby-identifier">string</span>, <span class="ruby-identifier">index</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>, <span class="ruby-identifier">prefix</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">char</span>.<span class="ruby-identifier">chr</span>)
535
+ 136: <span class="ruby-keyword kw">end</span>
536
+ 137: <span class="ruby-identifier">arr</span>
537
+ 138: <span class="ruby-keyword kw">end</span>
538
+ </pre>
539
+ </div>
540
+ </div>
541
+ </div>
542
+
543
+
544
+ </div>
545
+
546
+
547
+ </div>
548
+
549
+
550
+ <div id="validator-badges">
551
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
552
+ </div>
553
+
554
+ </body>
555
+ </html>