critbit 0.5.0-java → 0.5.1-java

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.
@@ -0,0 +1,250 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.8.7.6
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!file.README.html";
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+ <span class="title">File: README</span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a class="full_list_link" id="class_list_link"
44
+ href="class_list.html">
45
+ Class List
46
+ </a>
47
+
48
+ <a class="full_list_link" id="method_list_link"
49
+ href="method_list.html">
50
+ Method List
51
+ </a>
52
+
53
+ <a class="full_list_link" id="file_list_link"
54
+ href="file_list.html">
55
+ File List
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <iframe id="search_frame"></iframe>
63
+
64
+ <div id="content"><div id='filecontents'>
65
+ <h1 id="label-Announcement">Announcement</h1>
66
+
67
+ <p>Critbit version 0.5 has been realeased. A crit bit tree, also known as a
68
+ Binary Patricia Trie is a trie (<a
69
+ href="https://en.wikipedia.org/wiki/Trie">en.wikipedia.org/wiki/Trie</a>),
70
+ also called digital tree and sometimes radix tree or prefix tree (as they
71
+ can be searched by prefixes), is an ordered tree data structure that is
72
+ used to store a dynamic set or associative array where the keys are usually
73
+ strings. Unlike a binary search tree, no node in the tree stores the key
74
+ associated with that node; instead, its position in the tree defines the
75
+ key with which it is associated. All the descendants of a node have a
76
+ common prefix of the string associated with that node, and the root is
77
+ associated with the empty string. Values are normally not associated with
78
+ every node, only with leaves and some inner nodes that correspond to keys
79
+ of interest. For the space-optimized presentation of prefix tree, see
80
+ compact prefix tree.</p>
81
+
82
+ <p>[The following is from: <a
83
+ href="http://cr.yp.to/critbit.html">cr.yp.to/critbit.html</a>]</p>
84
+
85
+ <p>A crit-bit tree supports the following operations (and more!) at high
86
+ speed:</p>
87
+ <ul><li>
88
+ <p>See whether a string x is in the tree.</p>
89
+ </li><li>
90
+ <p>Add x to the tree.</p>
91
+ </li><li>
92
+ <p>Remove x from the tree.</p>
93
+ </li><li>
94
+ <p>Find the lexicographically smallest string in the tree larger than x, if
95
+ there is one.</p>
96
+ </li><li>
97
+ <p>Find all suffixes of x in the tree, i.e., all strings in the tree that have
98
+ x as a prefix. Of course, this can take a long time if there are many such
99
+ strings, but each string is found quickly.</p>
100
+ </li></ul>
101
+
102
+ <p>A crit-bit tree can be used as a high-speed associative array. For example,
103
+ an array mapping 54 to 1, 19 to 2, 99 to 3, 85 to 4, and 88 to 5 can be
104
+ stored as a crit-bit tree containing 54=1, 19=2, 99=3, 85=4, and 88=5. The
105
+ smallest string in the crit-bit tree larger than 85= is 85=4.</p>
106
+
107
+ <p>The standard strategy for many years has been to store searchable data sets
108
+ as hash tables, in applications that need exact searches but not
109
+ lexicographic searches; or as heaps, in applications that need to search
110
+ for the minimum; or as AVL trees, red-black trees, etc. in applications
111
+ that do not fit the restrictions of hash tables and heaps.</p>
112
+
113
+ <p>In Python, for example, the built-in “dict” data type is a hash table. Hash
114
+ tables don&#39;t provide fast access to the smallest entry, so there&#39;s
115
+ also a standard “heapq” library providing heaps. Heaps don&#39;t provide
116
+ fast lookups of other entries, so there are various add-on libraries
117
+ providing AVL trees and so on. A programmer who&#39;s happy creating a
118
+ “dict” will simply do so, but then another programmer who wants fancier
119
+ operations on the resulting database has to do an expensive conversion of
120
+ the “dict” to a fancier data structure.</p>
121
+
122
+ <p>I (D. J. Bernstein) have become convinced that this strategy should change.
123
+ The revised strategy is much simpler: there should be one fundamental
124
+ set-storage type, namely a crit-bit tree. Here&#39;s how a crit-bit tree
125
+ stacks up against the competition:</p>
126
+
127
+ <p>A hash table supports insertion, deletion, and exact searches. A crit-bit
128
+ tree supports insertion, deletion, exact searches, and ordered operations
129
+ such as finding the minimum. Another advantage is that a crit-bit tree
130
+ guarantees good performance: it doesn&#39;t have any tricky slowdowns for
131
+ unusual (or malicious) data.</p>
132
+
133
+ <p>A heap supports insertion, deletion, and finding the minimum. A crit-bit
134
+ tree supports insertion, deletion, finding the minimum, and exact searches,
135
+ and general suffix searches.</p>
136
+
137
+ <p>General-purpose comparison-based structures such as AVL trees and B-trees
138
+ support exactly the same operations as a crit-bit tree. However, crit-bit
139
+ trees are faster and simpler, especially for variable-length strings.
140
+ B-trees advertise a memory layout that&#39;s friendly to your disk, but
141
+ with less effort one can use a similar “clustering” organization for nodes
142
+ in a crit-bit tree.</p>
143
+
144
+ <p>If you&#39;re designing a programming language, imagine how much happier
145
+ your programmers will be if your basic built-in data type allows not just
146
+ looking up x, but also enumerating the strings after x in sorted order. You
147
+ can&#39;t do this with hash tables. You could do it with an AVL tree, but
148
+ your operations will be simpler and faster if you use a crit-bit tree.</p>
149
+
150
+ <h1 id="label-Critbit+Interface">Critbit Interface</h1>
151
+
152
+ <p>This version of Critbit implements a very similar interface as the Hash
153
+ interface with minor modifications when it makes sense to do so. Besides
154
+ implementing the Hash interface it also provides features for searching for
155
+ keys that have a common prefix that are not possible with hashes.</p>
156
+
157
+ <p>Here is an example of using Critbit:</p>
158
+
159
+ <pre class="code ruby"><code class="ruby"> <span class='id identifier rubyid_crit'>crit</span> <span class='op'>=</span> <span class='const'>Critbit</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
160
+
161
+ <span class='comment'># crit is space efficient and stores prefixes only once and can be used to
162
+ </span> <span class='comment'># find only strings that match a certain prefix
163
+ </span> <span class='id identifier rubyid_items'>items</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>u</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>un</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unh</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>uni</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unj</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unim</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unin</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unio</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
164
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>uninc</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unind</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unine</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindd</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>uninde</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindf</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
165
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindew</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindex</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindey</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>a</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>z</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span>
166
+
167
+ <span class='comment'># add items to the container
168
+ </span> <span class='id identifier rubyid_items'>items</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_item'>item</span><span class='op'>|</span>
169
+ <span class='id identifier rubyid_crit'>crit</span><span class='lbracket'>[</span><span class='id identifier rubyid_item'>item</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_item'>item</span>
170
+ <span class='kw'>end</span>
171
+
172
+ <span class='comment'># Does each for all elements in the critbit
173
+ </span> <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='tstring_end'>&quot;</span></span>
174
+ <span class='id identifier rubyid_crit'>crit</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
175
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>, </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_value'>value</span><span class='embexpr_end'>}</span><span class='tstring_content'>] </span><span class='tstring_end'>&quot;</span></span>
176
+ <span class='kw'>end</span>
177
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>]</span><span class='tstring_end'>&quot;</span></span>
178
+ </code></pre>
179
+
180
+ <p>Prints:</p>
181
+
182
+ <pre class="code ruby"><code class="ruby"> [[a, a] [u, u] [un, un] [unh, unh] [uni, uni] [unim, unim] [unin, unin] [uninc, uninc]
183
+ [unind, unind] [unindd, unindd] [uninde, uninde] [unindew, unindew] [unindex, unindex]
184
+ [unindey, unindey] [unindf, unindf] [unine, unine] [unio, unio] [unj, unj] [z, z] ].</code></pre>
185
+
186
+ <p>Observe that all elements are printed in sorted order, this is because
187
+ critbit is naturally sorted. This is one of the benefits of critbit over
188
+ hashes.</p>
189
+
190
+ <p>Critbits also allow for doing prefix traversal. In the next code example
191
+ the critbit is traversed by only selecting strings that have “unin” as
192
+ prefix, by passing the prefix as argument to &#39;each&#39;:</p>
193
+
194
+ <pre class="code ruby"><code class="ruby"> # Does each for all elements in the critbit
195
+ print &quot;[&quot;
196
+ crit.each(&quot;unin&quot;) do |key, value|
197
+ print &quot;[#{key}, #{value}] &quot;
198
+ end
199
+ print &quot;]&quot;
200
+
201
+ [[unin, unin] [uninc, uninc] [unind, unind] [unindd, unindd] [uninde, uninde]
202
+ [unindew, unindew] [unindex, unindex] [unindey, unindey] [unindf, unindf]
203
+ [unine, unine] ].
204
+ </code></pre>
205
+
206
+ <p>A critbit prefix can also be set by using method &#39;prefix=&#39;:</p>
207
+
208
+ <pre class="code ruby"><code class="ruby"> <span class='id identifier rubyid_crit'>crit</span><span class='period'>.</span><span class='id identifier rubyid_prefix'>prefix</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unin</span><span class='tstring_end'>&quot;</span></span>
209
+
210
+ <span class='comment'># Does each for all elements in the critbit
211
+ </span> <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='tstring_end'>&quot;</span></span>
212
+ <span class='id identifier rubyid_crit'>crit</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
213
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>, </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_value'>value</span><span class='embexpr_end'>}</span><span class='tstring_content'>] </span><span class='tstring_end'>&quot;</span></span>
214
+ <span class='kw'>end</span>
215
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>]</span><span class='tstring_end'>&quot;</span></span>
216
+ </code></pre>
217
+
218
+ <h1 id="label-Critbit+installation+and+download%3A">Critbit installation and download:</h1>
219
+ <ul><li>
220
+ <p>Install Jruby</p>
221
+ </li><li>
222
+ <p>jruby –S gem install critbit</p>
223
+ </li></ul>
224
+
225
+ <h1 id="label-Critbit+Homepages%3A">Critbit Homepages:</h1>
226
+ <ul><li>
227
+ <p><a href="http://rubygems.org/gems/critbit">rubygems.org/gems/critbit</a></p>
228
+ </li><li>
229
+ <p><a
230
+ href="https://github.com/rbotafogo/critbit/wiki">github.com/rbotafogo/critbit/wiki</a></p>
231
+ </li></ul>
232
+
233
+ <h1 id="label-Contributors%3A">Contributors:</h1>
234
+
235
+ <p>Contributors are welcome.</p>
236
+
237
+ <h1 id="label-Critbit+History%3A">Critbit History:</h1>
238
+ <ul><li>
239
+ <p>05/04/2013: Version 0.5.0 – Initial release.</p>
240
+ </li></ul>
241
+ </div></div>
242
+
243
+ <div id="footer">
244
+ Generated on Wed Jul 22 14:04:04 2015 by
245
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
246
+ 0.8.7.6 (ruby-2.2.2).
247
+ </div>
248
+
249
+ </body>
250
+ </html>
@@ -0,0 +1,60 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <title>File List</title>
19
+ <base id="base_target" target="_parent" />
20
+ </head>
21
+ <body>
22
+ <script type="text/javascript" charset="utf-8">
23
+ var hasFrames = false;
24
+ try {
25
+ hasFrames = window.top.frames.main ? true : false;
26
+ } catch (e) { }
27
+ if (hasFrames) {
28
+ document.getElementById('base_target').target = 'main';
29
+ document.body.className = 'frames';
30
+ }
31
+ </script>
32
+ <div id="content">
33
+ <h1 id="full_list_header">File List</h1>
34
+ <div id="nav">
35
+
36
+ <span><a target="_self" href="class_list.html">
37
+ Classes
38
+ </a></span>
39
+
40
+ <span><a target="_self" href="method_list.html">
41
+ Methods
42
+ </a></span>
43
+
44
+ <span><a target="_self" href="file_list.html">
45
+ Files
46
+ </a></span>
47
+
48
+ </div>
49
+ <div id="search">Search: <input type="text" /></div>
50
+
51
+ <ul id="full_list" class="file">
52
+
53
+
54
+ <li class="r1"><span class="object_link"><a href="index.html" title="README">README</a></a></li>
55
+
56
+
57
+ </ul>
58
+ </div>
59
+ </body>
60
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title>Documentation by YARD 0.8.7.6</title>
8
+ </head>
9
+ <script type="text/javascript" charset="utf-8">
10
+ window.onload = function() {
11
+ var match = unescape(window.location.hash).match(/^#!(.+)/);
12
+ var name = match ? match[1] : 'index.html';
13
+ name = name.replace(/^(\w+):\/\//, '').replace(/^\/\//, '');
14
+ document.writeln('<frameset cols="20%,*">' +
15
+ '<frame name="list" src="class_list.html" />' +
16
+ '<frame name="main" src="' + escape(name) + '" />' +
17
+ '</frameset>');
18
+ }
19
+ </script>
20
+ <noscript>
21
+ <frameset cols="20%,*">
22
+ <frame name="list" src="class_list.html" />
23
+ <frame name="main" src="index.html" />
24
+ </frameset>
25
+ </noscript>
26
+ </html>
@@ -0,0 +1,250 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.8.7.6
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!file.README.html";
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+ <span class="title">File: README</span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a class="full_list_link" id="class_list_link"
44
+ href="class_list.html">
45
+ Class List
46
+ </a>
47
+
48
+ <a class="full_list_link" id="method_list_link"
49
+ href="method_list.html">
50
+ Method List
51
+ </a>
52
+
53
+ <a class="full_list_link" id="file_list_link"
54
+ href="file_list.html">
55
+ File List
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <iframe id="search_frame"></iframe>
63
+
64
+ <div id="content"><div id='filecontents'>
65
+ <h1 id="label-Announcement">Announcement</h1>
66
+
67
+ <p>Critbit version 0.5 has been realeased. A crit bit tree, also known as a
68
+ Binary Patricia Trie is a trie (<a
69
+ href="https://en.wikipedia.org/wiki/Trie">en.wikipedia.org/wiki/Trie</a>),
70
+ also called digital tree and sometimes radix tree or prefix tree (as they
71
+ can be searched by prefixes), is an ordered tree data structure that is
72
+ used to store a dynamic set or associative array where the keys are usually
73
+ strings. Unlike a binary search tree, no node in the tree stores the key
74
+ associated with that node; instead, its position in the tree defines the
75
+ key with which it is associated. All the descendants of a node have a
76
+ common prefix of the string associated with that node, and the root is
77
+ associated with the empty string. Values are normally not associated with
78
+ every node, only with leaves and some inner nodes that correspond to keys
79
+ of interest. For the space-optimized presentation of prefix tree, see
80
+ compact prefix tree.</p>
81
+
82
+ <p>[The following is from: <a
83
+ href="http://cr.yp.to/critbit.html">cr.yp.to/critbit.html</a>]</p>
84
+
85
+ <p>A crit-bit tree supports the following operations (and more!) at high
86
+ speed:</p>
87
+ <ul><li>
88
+ <p>See whether a string x is in the tree.</p>
89
+ </li><li>
90
+ <p>Add x to the tree.</p>
91
+ </li><li>
92
+ <p>Remove x from the tree.</p>
93
+ </li><li>
94
+ <p>Find the lexicographically smallest string in the tree larger than x, if
95
+ there is one.</p>
96
+ </li><li>
97
+ <p>Find all suffixes of x in the tree, i.e., all strings in the tree that have
98
+ x as a prefix. Of course, this can take a long time if there are many such
99
+ strings, but each string is found quickly.</p>
100
+ </li></ul>
101
+
102
+ <p>A crit-bit tree can be used as a high-speed associative array. For example,
103
+ an array mapping 54 to 1, 19 to 2, 99 to 3, 85 to 4, and 88 to 5 can be
104
+ stored as a crit-bit tree containing 54=1, 19=2, 99=3, 85=4, and 88=5. The
105
+ smallest string in the crit-bit tree larger than 85= is 85=4.</p>
106
+
107
+ <p>The standard strategy for many years has been to store searchable data sets
108
+ as hash tables, in applications that need exact searches but not
109
+ lexicographic searches; or as heaps, in applications that need to search
110
+ for the minimum; or as AVL trees, red-black trees, etc. in applications
111
+ that do not fit the restrictions of hash tables and heaps.</p>
112
+
113
+ <p>In Python, for example, the built-in “dict” data type is a hash table. Hash
114
+ tables don&#39;t provide fast access to the smallest entry, so there&#39;s
115
+ also a standard “heapq” library providing heaps. Heaps don&#39;t provide
116
+ fast lookups of other entries, so there are various add-on libraries
117
+ providing AVL trees and so on. A programmer who&#39;s happy creating a
118
+ “dict” will simply do so, but then another programmer who wants fancier
119
+ operations on the resulting database has to do an expensive conversion of
120
+ the “dict” to a fancier data structure.</p>
121
+
122
+ <p>I (D. J. Bernstein) have become convinced that this strategy should change.
123
+ The revised strategy is much simpler: there should be one fundamental
124
+ set-storage type, namely a crit-bit tree. Here&#39;s how a crit-bit tree
125
+ stacks up against the competition:</p>
126
+
127
+ <p>A hash table supports insertion, deletion, and exact searches. A crit-bit
128
+ tree supports insertion, deletion, exact searches, and ordered operations
129
+ such as finding the minimum. Another advantage is that a crit-bit tree
130
+ guarantees good performance: it doesn&#39;t have any tricky slowdowns for
131
+ unusual (or malicious) data.</p>
132
+
133
+ <p>A heap supports insertion, deletion, and finding the minimum. A crit-bit
134
+ tree supports insertion, deletion, finding the minimum, and exact searches,
135
+ and general suffix searches.</p>
136
+
137
+ <p>General-purpose comparison-based structures such as AVL trees and B-trees
138
+ support exactly the same operations as a crit-bit tree. However, crit-bit
139
+ trees are faster and simpler, especially for variable-length strings.
140
+ B-trees advertise a memory layout that&#39;s friendly to your disk, but
141
+ with less effort one can use a similar “clustering” organization for nodes
142
+ in a crit-bit tree.</p>
143
+
144
+ <p>If you&#39;re designing a programming language, imagine how much happier
145
+ your programmers will be if your basic built-in data type allows not just
146
+ looking up x, but also enumerating the strings after x in sorted order. You
147
+ can&#39;t do this with hash tables. You could do it with an AVL tree, but
148
+ your operations will be simpler and faster if you use a crit-bit tree.</p>
149
+
150
+ <h1 id="label-Critbit+Interface">Critbit Interface</h1>
151
+
152
+ <p>This version of Critbit implements a very similar interface as the Hash
153
+ interface with minor modifications when it makes sense to do so. Besides
154
+ implementing the Hash interface it also provides features for searching for
155
+ keys that have a common prefix that are not possible with hashes.</p>
156
+
157
+ <p>Here is an example of using Critbit:</p>
158
+
159
+ <pre class="code ruby"><code class="ruby"> <span class='id identifier rubyid_crit'>crit</span> <span class='op'>=</span> <span class='const'>Critbit</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
160
+
161
+ <span class='comment'># crit is space efficient and stores prefixes only once and can be used to
162
+ </span> <span class='comment'># find only strings that match a certain prefix
163
+ </span> <span class='id identifier rubyid_items'>items</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>u</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>un</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unh</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>uni</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unj</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unim</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unin</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unio</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
164
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>uninc</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unind</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unine</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindd</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>uninde</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindf</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
165
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindew</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindex</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unindey</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>a</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>z</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span>
166
+
167
+ <span class='comment'># add items to the container
168
+ </span> <span class='id identifier rubyid_items'>items</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_item'>item</span><span class='op'>|</span>
169
+ <span class='id identifier rubyid_crit'>crit</span><span class='lbracket'>[</span><span class='id identifier rubyid_item'>item</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_item'>item</span>
170
+ <span class='kw'>end</span>
171
+
172
+ <span class='comment'># Does each for all elements in the critbit
173
+ </span> <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='tstring_end'>&quot;</span></span>
174
+ <span class='id identifier rubyid_crit'>crit</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
175
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>, </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_value'>value</span><span class='embexpr_end'>}</span><span class='tstring_content'>] </span><span class='tstring_end'>&quot;</span></span>
176
+ <span class='kw'>end</span>
177
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>]</span><span class='tstring_end'>&quot;</span></span>
178
+ </code></pre>
179
+
180
+ <p>Prints:</p>
181
+
182
+ <pre class="code ruby"><code class="ruby"> [[a, a] [u, u] [un, un] [unh, unh] [uni, uni] [unim, unim] [unin, unin] [uninc, uninc]
183
+ [unind, unind] [unindd, unindd] [uninde, uninde] [unindew, unindew] [unindex, unindex]
184
+ [unindey, unindey] [unindf, unindf] [unine, unine] [unio, unio] [unj, unj] [z, z] ].</code></pre>
185
+
186
+ <p>Observe that all elements are printed in sorted order, this is because
187
+ critbit is naturally sorted. This is one of the benefits of critbit over
188
+ hashes.</p>
189
+
190
+ <p>Critbits also allow for doing prefix traversal. In the next code example
191
+ the critbit is traversed by only selecting strings that have “unin” as
192
+ prefix, by passing the prefix as argument to &#39;each&#39;:</p>
193
+
194
+ <pre class="code ruby"><code class="ruby"> # Does each for all elements in the critbit
195
+ print &quot;[&quot;
196
+ crit.each(&quot;unin&quot;) do |key, value|
197
+ print &quot;[#{key}, #{value}] &quot;
198
+ end
199
+ print &quot;]&quot;
200
+
201
+ [[unin, unin] [uninc, uninc] [unind, unind] [unindd, unindd] [uninde, uninde]
202
+ [unindew, unindew] [unindex, unindex] [unindey, unindey] [unindf, unindf]
203
+ [unine, unine] ].
204
+ </code></pre>
205
+
206
+ <p>A critbit prefix can also be set by using method &#39;prefix=&#39;:</p>
207
+
208
+ <pre class="code ruby"><code class="ruby"> <span class='id identifier rubyid_crit'>crit</span><span class='period'>.</span><span class='id identifier rubyid_prefix'>prefix</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unin</span><span class='tstring_end'>&quot;</span></span>
209
+
210
+ <span class='comment'># Does each for all elements in the critbit
211
+ </span> <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='tstring_end'>&quot;</span></span>
212
+ <span class='id identifier rubyid_crit'>crit</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
213
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>, </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_value'>value</span><span class='embexpr_end'>}</span><span class='tstring_content'>] </span><span class='tstring_end'>&quot;</span></span>
214
+ <span class='kw'>end</span>
215
+ <span class='id identifier rubyid_print'>print</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>]</span><span class='tstring_end'>&quot;</span></span>
216
+ </code></pre>
217
+
218
+ <h1 id="label-Critbit+installation+and+download%3A">Critbit installation and download:</h1>
219
+ <ul><li>
220
+ <p>Install Jruby</p>
221
+ </li><li>
222
+ <p>jruby –S gem install critbit</p>
223
+ </li></ul>
224
+
225
+ <h1 id="label-Critbit+Homepages%3A">Critbit Homepages:</h1>
226
+ <ul><li>
227
+ <p><a href="http://rubygems.org/gems/critbit">rubygems.org/gems/critbit</a></p>
228
+ </li><li>
229
+ <p><a
230
+ href="https://github.com/rbotafogo/critbit/wiki">github.com/rbotafogo/critbit/wiki</a></p>
231
+ </li></ul>
232
+
233
+ <h1 id="label-Contributors%3A">Contributors:</h1>
234
+
235
+ <p>Contributors are welcome.</p>
236
+
237
+ <h1 id="label-Critbit+History%3A">Critbit History:</h1>
238
+ <ul><li>
239
+ <p>05/04/2013: Version 0.5.0 – Initial release.</p>
240
+ </li></ul>
241
+ </div></div>
242
+
243
+ <div id="footer">
244
+ Generated on Wed Jul 22 14:04:01 2015 by
245
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
246
+ 0.8.7.6 (ruby-2.2.2).
247
+ </div>
248
+
249
+ </body>
250
+ </html>