grosser-algorithms 0.4.0 → 0.4.1

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 (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,273 @@
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>Module: Algorithms::Search</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>Module</strong></td>
53
+ <td class="class-name-in-header">Algorithms::Search</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/lib/algorithms/search_rb.html">
59
+ lib/algorithms/search.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ </table>
66
+ </div>
67
+ <!-- banner header -->
68
+
69
+ <div id="bodyContent">
70
+
71
+
72
+
73
+ <div id="contextContent">
74
+
75
+
76
+
77
+ </div>
78
+
79
+ <div id="method-list">
80
+ <h3 class="section-bar">Methods</h3>
81
+
82
+ <div class="name-list">
83
+ <a href="#M000001">binary_search</a>&nbsp;&nbsp;
84
+ <a href="#M000002">kmp_search</a>&nbsp;&nbsp;
85
+ <a href="#M000003">kmp_search</a>&nbsp;&nbsp;
86
+ </div>
87
+ </div>
88
+
89
+ </div>
90
+
91
+
92
+ <!-- if includes -->
93
+
94
+ <div id="section">
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ <!-- if method_list -->
104
+ <div id="methods">
105
+ <h3 class="section-bar">Public Class methods</h3>
106
+
107
+ <div id="method-M000001" class="method-detail">
108
+ <a name="M000001"></a>
109
+
110
+ <div class="method-heading">
111
+ <a href="#M000001" class="method-signature">
112
+ <span class="method-name">binary_search</span><span class="method-args">(container, item)</span>
113
+ </a>
114
+ </div>
115
+
116
+ <div class="method-description">
117
+ <p>
118
+ Binary <a href="Search.html">Search</a>: This search finds an item in
119
+ log(n) time provided that the container is already sorted. The method
120
+ returns the item if it is found, or nil if it is not. If there are
121
+ duplicates, the first one found is returned, and this is not guaranteed to
122
+ be the smallest or largest item.
123
+ </p>
124
+ <p>
125
+ Complexity: O(lg N)
126
+ </p>
127
+ <pre>
128
+ Algorithms::Search.binary_search([1, 2, 3], 1) #=&gt; 1
129
+ Algorithms::Search.binary_search([1, 2, 3], 4) #=&gt; nil
130
+ </pre>
131
+ <p><a class="source-toggle" href="#"
132
+ onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
133
+ <div class="method-source-code" id="M000001-source">
134
+ <pre>
135
+ <span class="ruby-comment cmt"># File lib/algorithms/search.rb, line 15</span>
136
+ 15: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">binary_search</span>(<span class="ruby-identifier">container</span>, <span class="ruby-identifier">item</span>)
137
+ 16: <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">item</span>.<span class="ruby-identifier">nil?</span>
138
+ 17: <span class="ruby-identifier">low</span> = <span class="ruby-value">0</span>
139
+ 18: <span class="ruby-identifier">high</span> = <span class="ruby-identifier">container</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
140
+ 19: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">low</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">high</span>
141
+ 20: <span class="ruby-identifier">mid</span> = (<span class="ruby-identifier">low</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">high</span>) <span class="ruby-operator">/</span> <span class="ruby-value">2</span>
142
+ 21: <span class="ruby-identifier">val</span> = <span class="ruby-identifier">container</span>[<span class="ruby-identifier">mid</span>]
143
+ 22: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">val</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">item</span>
144
+ 23: <span class="ruby-identifier">high</span> = <span class="ruby-identifier">mid</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
145
+ 24: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">val</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">item</span>
146
+ 25: <span class="ruby-identifier">low</span> = <span class="ruby-identifier">mid</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>
147
+ 26: <span class="ruby-keyword kw">else</span>
148
+ 27: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">val</span>
149
+ 28: <span class="ruby-keyword kw">end</span>
150
+ 29: <span class="ruby-keyword kw">end</span>
151
+ 30: <span class="ruby-keyword kw">nil</span>
152
+ 31: <span class="ruby-keyword kw">end</span>
153
+ </pre>
154
+ </div>
155
+ </div>
156
+ </div>
157
+
158
+ <div id="method-M000002" class="method-detail">
159
+ <a name="M000002"></a>
160
+
161
+ <div class="method-heading">
162
+ <a href="#M000002" class="method-signature">
163
+ <span class="method-name">kmp_search</span><span class="method-args">(string, substring)</span>
164
+ </a>
165
+ </div>
166
+
167
+ <div class="method-description">
168
+ <p>
169
+ Knuth-Morris-Pratt Algorithm substring search algorithm: Efficiently finds
170
+ the starting position of a substring in a string. The algorithm calculates
171
+ the best position to resume searching from if a failure occurs.
172
+ </p>
173
+ <p>
174
+ The method returns the index of the starting position in the string where
175
+ the substring is found. If there is no match, nil is returned.
176
+ </p>
177
+ <p>
178
+ Complexity: O(n + k), where n is the length of the string and k is the
179
+ length of the substring.
180
+ </p>
181
+ <pre>
182
+ Algorithms::Search.kmp_search(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;ABCDABD&quot;) #=&gt; 15
183
+ Algorithms::Search.kmp_search(&quot;ABC ABCDAB ABCDABCDABDE&quot;, &quot;ABCDEF&quot;) #=&gt; nil
184
+ </pre>
185
+ <p><a class="source-toggle" href="#"
186
+ onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
187
+ <div class="method-source-code" id="M000002-source">
188
+ <pre>
189
+ <span class="ruby-comment cmt"># File lib/algorithms/search.rb, line 44</span>
190
+ 44: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">kmp_search</span>(<span class="ruby-identifier">string</span>, <span class="ruby-identifier">substring</span>)
191
+ 45: <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">nil?</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">substring</span>.<span class="ruby-identifier">nil?</span>
192
+ 46:
193
+ 47: <span class="ruby-comment cmt"># create failure function table</span>
194
+ 48: <span class="ruby-identifier">pos</span> = <span class="ruby-value">2</span>
195
+ 49: <span class="ruby-identifier">cnd</span> = <span class="ruby-value">0</span>
196
+ 50: <span class="ruby-identifier">failure_table</span> = [<span class="ruby-value">-1</span>, <span class="ruby-value">0</span>]
197
+ 51: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">pos</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">substring</span>.<span class="ruby-identifier">length</span>
198
+ 52: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">substring</span>[<span class="ruby-identifier">pos</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">substring</span>[<span class="ruby-identifier">cnd</span>]
199
+ 53: <span class="ruby-identifier">failure_table</span>[<span class="ruby-identifier">pos</span>] = <span class="ruby-identifier">cnd</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>
200
+ 54: <span class="ruby-identifier">pos</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
201
+ 55: <span class="ruby-identifier">cnd</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
202
+ 56: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">cnd</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
203
+ 57: <span class="ruby-identifier">cnd</span> = <span class="ruby-identifier">failure_table</span>[<span class="ruby-identifier">cnd</span>]
204
+ 58: <span class="ruby-keyword kw">else</span>
205
+ 59: <span class="ruby-identifier">failure_table</span>[<span class="ruby-identifier">pos</span>] = <span class="ruby-value">0</span>
206
+ 60: <span class="ruby-identifier">pos</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
207
+ 61: <span class="ruby-keyword kw">end</span>
208
+ 62: <span class="ruby-keyword kw">end</span>
209
+ 63:
210
+ 64: <span class="ruby-identifier">m</span> = <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
211
+ 65: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">m</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span>
212
+ 66: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">substring</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">string</span>[<span class="ruby-identifier">m</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">i</span>]
213
+ 67: <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
214
+ 68: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">m</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">substring</span>.<span class="ruby-identifier">length</span>
215
+ 69: <span class="ruby-keyword kw">else</span>
216
+ 70: <span class="ruby-identifier">m</span> = <span class="ruby-identifier">m</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">failure_table</span>[<span class="ruby-identifier">i</span>]
217
+ 71: <span class="ruby-identifier">i</span> = <span class="ruby-identifier">failure_table</span>[<span class="ruby-identifier">i</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
218
+ 72: <span class="ruby-keyword kw">end</span>
219
+ 73: <span class="ruby-keyword kw">end</span>
220
+ 74: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
221
+ 75: <span class="ruby-keyword kw">end</span>
222
+ </pre>
223
+ </div>
224
+ </div>
225
+ </div>
226
+
227
+ <h3 class="section-bar">Public Instance methods</h3>
228
+
229
+ <div id="method-M000003" class="method-detail">
230
+ <a name="M000003"></a>
231
+
232
+ <div class="method-heading">
233
+ <a href="#M000003" class="method-signature">
234
+ <span class="method-name">kmp_search</span><span class="method-args">(substring)</span>
235
+ </a>
236
+ </div>
237
+
238
+ <div class="method-description">
239
+ <p>
240
+ Allows <a href="Search.html#M000002">kmp_search</a> to be called as an
241
+ instance method in classes that include the <a
242
+ href="Search.html">Search</a> module.
243
+ </p>
244
+ <pre>
245
+ class String; include Algorithms::Search; end
246
+ &quot;ABC ABCDAB ABCDABCDABDE&quot;.kmp_search(&quot;ABCDABD&quot;) #=&gt; 15
247
+ </pre>
248
+ <p><a class="source-toggle" href="#"
249
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
250
+ <div class="method-source-code" id="M000003-source">
251
+ <pre>
252
+ <span class="ruby-comment cmt"># File lib/algorithms/search.rb, line 81</span>
253
+ 81: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">kmp_search</span>(<span class="ruby-identifier">substring</span>)
254
+ 82: <span class="ruby-constant">Algorithms</span><span class="ruby-operator">::</span><span class="ruby-constant">Search</span>.<span class="ruby-identifier">kmp_search</span>(<span class="ruby-keyword kw">self</span>, <span class="ruby-identifier">substring</span>)
255
+ 83: <span class="ruby-keyword kw">end</span>
256
+ </pre>
257
+ </div>
258
+ </div>
259
+ </div>
260
+
261
+
262
+ </div>
263
+
264
+
265
+ </div>
266
+
267
+
268
+ <div id="validator-badges">
269
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
270
+ </div>
271
+
272
+ </body>
273
+ </html>
@@ -0,0 +1 @@
1
+ Tue, 10 Aug 2010 14:29:25 +0200
@@ -0,0 +1,281 @@
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>File: History.txt</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="fileHeader">
50
+ <h1>History.txt</h1>
51
+ <table class="header-table">
52
+ <tr class="top-aligned-row">
53
+ <td><strong>Path:</strong></td>
54
+ <td>History.txt
55
+ </td>
56
+ </tr>
57
+ <tr class="top-aligned-row">
58
+ <td><strong>Last Update:</strong></td>
59
+ <td>Tue Aug 10 13:58:23 +0200 2010</td>
60
+ </tr>
61
+ </table>
62
+ </div>
63
+ <!-- banner header -->
64
+
65
+ <div id="bodyContent">
66
+
67
+
68
+
69
+ <div id="contextContent">
70
+
71
+ <div id="description">
72
+ <h3>Jan 3, 2009</h3>
73
+ <pre>
74
+ * Levenshtein distance in C
75
+ </pre>
76
+ <h3>April 3, 2009</h3>
77
+ <pre>
78
+ * Finished C refactorization of SplayTree
79
+ </pre>
80
+ <h3>March 28, 2009</h3>
81
+ <pre>
82
+ * Implemented SplayTree in C
83
+ * Made recursively_free_nodes methods static to fix a SEGFAULT
84
+ * Improved CBst
85
+ * Moved to Markdown for README
86
+ * 0.2.0 release
87
+ </pre>
88
+ <h3>January 19, 2009</h3>
89
+ <pre>
90
+ * kd-tree for points in multi-dimensional space
91
+ </pre>
92
+ <h3>November 25, 2008</h3>
93
+ <pre>
94
+ * Checked in gnufied's C BST
95
+ </pre>
96
+ <h3>November 13, 2008</h3>
97
+ <pre>
98
+ * Removed #each for Hash and Priority Queue (Feature)
99
+ </pre>
100
+ <h3>September 15, 2008</h3>
101
+ <pre>
102
+ * Added comb sort
103
+ * Benchmark work on sorting algorithms
104
+ </pre>
105
+ <h3>September 1, 2008</h3>
106
+ <pre>
107
+ * Switched to Hanna rdoc template
108
+ * RBTree#isred now private
109
+ </pre>
110
+ <h3>August 20, 2008</h3>
111
+ <pre>
112
+ * Implemented Knuth-Morris-Pratt substring algorithm
113
+ </pre>
114
+ <h3>August 15, 2008</h3>
115
+ <pre>
116
+ * Updated README to reflect progress
117
+ </pre>
118
+ <h3>August 10, 2008</h3>
119
+ <pre>
120
+ * Implemented mergesort, insertion_sort, shell_sort, quicksort
121
+ </pre>
122
+ <h3>August 8, 2008</h3>
123
+ <pre>
124
+ * Implemented bubble_sort, selection_sort, heapsort
125
+ </pre>
126
+ <h3>August 5, 2008</h3>
127
+ <pre>
128
+ * Started Algorithms portion
129
+ * Implemented Search#binary_search
130
+ </pre>
131
+ <h3>July 20, 2008</h3>
132
+ <pre>
133
+ * Iterate over trees iteratively instead of recursively
134
+ * Implemented Deque in C
135
+ </pre>
136
+ <h3>July 15, 2008</h3>
137
+ <pre>
138
+ * Refactored namespaces, thank you Austin Ziegler!
139
+ </pre>
140
+ <h3>July 14, 2008</h3>
141
+ <pre>
142
+ * Use alias_method instead of alias
143
+ * Found and fixed RBTree#delete bug (finally!)
144
+ * Refactored Trie, SuffixArray, SplayTreeMap
145
+ </pre>
146
+ <h3>July 13, 2008</h3>
147
+ <pre>
148
+ * Refactored Deque
149
+ * Implemented Deque#reverse_each (like Array's)
150
+ </pre>
151
+ <h3>July 12, 2008</h3>
152
+ <pre>
153
+ * Reformatted some specs to be more idiomatic (Thank you Federico Builes)
154
+ </pre>
155
+ <h3>July 10, 2008</h3>
156
+ <pre>
157
+ * Added algorithm complexity information for all Containers
158
+ * Implemented Trie for string representation
159
+ * Implmented SuffixArray for fast substring search
160
+ * Fixed memory leak in CRBTree
161
+ * Updated Manifest and algorithms.rb to match progress
162
+ </pre>
163
+ <h3>July 9, 2008</h3>
164
+ <pre>
165
+ * Implemented Deque
166
+ * Stack and Queue now use Deque
167
+ * Fixed issues with CRBTree's #empty? and delete methods
168
+ </pre>
169
+ <h3>July 8, 2008</h3>
170
+ <pre>
171
+ * Can now iterate over a heap
172
+ * Renamed #contains_key -&gt; has_key? since it's more idiomatic
173
+ * Implented #change_key and #delete for Heap
174
+ * Priority Queue is now implemented with the new Fibonacci Heap
175
+ * Removed old Priority Queue code as a result
176
+ * Heap: fixed #delete bug not checking if item exists, #has_key? bug
177
+ for not returning boolean
178
+ * Heap: value field is now optional and defaults to the key if not specified
179
+ * More refactoring of RBTreeMap (both Ruby and C)
180
+ </pre>
181
+ <h3>July 7, 2008</h3>
182
+ <pre>
183
+ * Heap is now implemented with a Fibonacci Heap, not a binomial heap
184
+ </pre>
185
+ <h3>July 4, 2008</h3>
186
+ <pre>
187
+ * Implemented SplayTreeMap
188
+ * Heap now uses kind_of? to check for other heaps when doing #merge
189
+ * Renamed some Heap methods for consistency with the rest of the library
190
+ * RBTreeMap#contains? -&gt; contains_key?
191
+ * Refactored RBTreeMap to be more object-oriented
192
+ * More documentation for RBTreeMap
193
+ </pre>
194
+ <h3>July 3, 2008</h3>
195
+ <pre>
196
+ * Added documentation for Stack and Queue
197
+ </pre>
198
+ <h3>June 24, 2008</h3>
199
+ <pre>
200
+ * Imported Brian Amberg's priority queue implementation
201
+ * Now uses Echoe to build gem
202
+ * Gem builds for the first time
203
+ </pre>
204
+ <h3>June 18, 2008</h3>
205
+ <pre>
206
+ * Can now enumerate over RBTreeMap
207
+ </pre>
208
+ <h3>June 17, 2008</h3>
209
+ <pre>
210
+ * RBTreemap#delete now returns deleted value
211
+ * Added delete method to C implementation
212
+ </pre>
213
+ <h3>June 16, 2008</h3>
214
+ <pre>
215
+ * Implemented delete methods for RBTreeMap
216
+ </pre>
217
+ <h3>June 14, 2008</h3>
218
+ <pre>
219
+ * Renamed the data structures module to &quot;Containers&quot;
220
+ * Removed dependence on stdbool.h
221
+ * Renamed RBTree to RBTreeMap
222
+ </pre>
223
+ <h3>June 13, 2008</h3>
224
+ <pre>
225
+ * Implemented Sedgewick's Left Leaning Red Black Tree in C!
226
+ </pre>
227
+ <h3>June 12, 2008</h3>
228
+ <pre>
229
+ * Implemented Sedgewick's Left Leaning Red Black Tree
230
+ </pre>
231
+ <h3>June 10, 2008</h3>
232
+ <pre>
233
+ * Implemented merge! for other heaps and heap initialization from an array
234
+ * Implemented Queue
235
+ </pre>
236
+ <h3>June 9, 2008</h3>
237
+ <pre>
238
+ * Finished binomial heap implementation
239
+ </pre>
240
+ <h3>June 8, 2008</h3>
241
+ <pre>
242
+ * Added Stack
243
+ * Working on heap
244
+ </pre>
245
+ <h3>April 20</h3>
246
+ <pre>
247
+ * Accepted to Google Summer of Code!
248
+ </pre>
249
+
250
+ </div>
251
+
252
+
253
+ </div>
254
+
255
+
256
+ </div>
257
+
258
+
259
+ <!-- if includes -->
260
+
261
+ <div id="section">
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+ <!-- if method_list -->
271
+
272
+
273
+ </div>
274
+
275
+
276
+ <div id="validator-badges">
277
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
278
+ </div>
279
+
280
+ </body>
281
+ </html>