OSDN Git Service

2011-09-27 Benjamin Kosnik <bkoz@redhat.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / doc / html / manual / policy_based_data_structures_test.html
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Testing</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1"/><meta name="keywords" content="&#10;&#9;ISO C++&#10;      , &#10;&#9;policy&#10;      , &#10;&#9;container&#10;      , &#10;&#9;data&#10;      , &#10;&#9;structure&#10;      , &#10;&#9;associated&#10;      , &#10;&#9;tree&#10;      , &#10;&#9;trie&#10;      , &#10;&#9;hash&#10;      , &#10;&#9;metaprogramming&#10;      "/><meta name="keywords" content="&#10;      ISO C++&#10;    , &#10;      library&#10;    "/><meta name="keywords" content="&#10;      ISO C++&#10;    , &#10;      runtime&#10;    , &#10;      library&#10;    "/><link rel="home" href="../index.html" title="The GNU C++ Library"/><link rel="up" href="policy_data_structures.html" title="Chapter 22. Policy-Based Data Structures"/><link rel="prev" href="policy_data_structures_design.html" title="Design"/><link rel="next" href="policy_data_structures_biblio.html" title="Acknowledgments"/></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Testing</th></tr><tr><td align="left"><a accesskey="p" href="policy_data_structures_design.html">Prev</a> </td><th width="60%" align="center">Chapter 22. Policy-Based Data Structures</th><td align="right"> <a accesskey="n" href="policy_data_structures_biblio.html">Next</a></td></tr></table><hr/></div><div class="section" title="Testing"><div class="titlepage"><div><div><h2 class="title"><a id="pbds.test"/>Testing</h2></div></div></div><div class="section" title="Regression"><div class="titlepage"><div><div><h3 class="title"><a id="pbds.test.regression"/>Regression</h3></div></div></div><p>The library contains a single comprehensive regression test.
4     For a given container type in this library, the test creates
5     an object of the container type and an object of the
6     corresponding standard type (e.g., <code class="classname">std::set</code>). It
7     then performs a random sequence of methods with random
8     arguments (e.g., inserts, erases, and so forth) on both
9     objects. At each operation, the test checks the return value of
10     the method, and optionally both compares this library's
11     object with the standard's object as well as performing other
12     consistency checks on this library's object (e.g.,
13     order preservation, when applicable, or node invariants, when
14     applicable).</p><p>Additionally, the test integrally checks exception safety
15     and resource leaks. This is done as follows. A special
16     allocator type, written for the purpose of the test, both
17     randomly throws an exceptions when allocations are performed,
18     and tracks allocations and de-allocations. The exceptions thrown
19     at allocations simulate memory-allocation failures; the
20     tracking mechanism checks for memory-related bugs (e.g.,
21     resource leaks and multiple de-allocations). Both
22     this library's containers and the containers' value-types are
23     configured to use this allocator.</p><p>For granularity, the test is split into the
24     several sources, each checking only some containers.</p><p>For more details, consult the files in
25     <code class="filename">testsuite/ext/pb_ds/regression</code>.</p></div><div class="section" title="Performance"><div class="titlepage"><div><div><h3 class="title"><a id="pbds.test.performance"/>Performance</h3></div></div></div><div class="section" title="Hash-Based"><div class="titlepage"><div><div><h4 class="title"><a id="performance.hash"/>Hash-Based</h4></div></div></div><p/><div class="section" title="Text find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.text_find"/>
26           Text <code class="function">find</code>
27         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.text_find.info"/>
28             Description
29           </h6></div></div></div><p>
30             This test inserts a number of values with keys from an
31             arbitrary text (<a class="xref" href="policy_data_structures.html#biblio.wickland96thirty" title="Thirty Years Among the Dead">[biblio.wickland96thirty]</a>) into a container,
32             then performs a series of finds using
33             <code class="function">find</code> . It measures the average
34             time for <code class="function">find</code> as a function of
35           the number of values inserted.</p><p>
36             It uses the test file:
37             <code class="filename">
38               performance/ext/pb_ds/text_find_timing_test.cc
39             </code>
40           </p><p>
41             And uses the data file:
42             <code class="filename">
43               filethirty_years_among_the_dead_preproc.txt
44             </code>
45           </p><p>The test checks the effect of different range-hashing
46           functions, trigger policies, and cache-hashing policies.
47           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.text_find.results"/>
48             Results
49           </h6></div></div></div><p>The graphic below show the results for the native
50           and collision-chaining hash types the the function
51           applied being a text find timing test using
52           <code class="function">find</code>.
53           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_hash_text_find.png" style="text-align: middle"/></div></div><p>
54             The abbreviated names in the legend of the graphic above are
55             instantiated with the types in the following table.
56           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
57                     n_hash_map_ncah
58                   </td></tr><tr><td style="text-align: left">
59                     <code class="classname">std::tr1::unordered_map</code>
60                   </td><td style="text-align: left">
61                     <code class="classname">cache_hash_code</code>
62                   </td><td style="text-align: left">
63                     <code class="constant">false</code>
64                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
65                     cc_hash_mod_prime_1div1_nsth_map
66                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
67                     <code class="classname">cc_hash_table</code>
68                   </td><td style="text-align: left">
69                     <code class="classname">Comb_Hash_Fn</code>
70                   </td><td style="text-align: left">
71                     <code class="classname">direct_mod_range_hashing</code>
72                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
73                     <code class="classname">Resize_Policy</code>
74                   </td><td rowspan="2" style="text-align: left" valign="top">
75                     <code class="classname">hash_standard_resize_policy</code>
76                   </td><td style="text-align: left">
77                     <code class="classname">Size_Policy</code>
78                   </td><td style="text-align: left">
79                     <code class="classname">hash_prime_size_policy</code>
80                   </td></tr><tr><td style="text-align: left" valign="top">
81                     <code class="classname">Trigger_Policy</code>
82                   </td><td style="text-align: left">
83                     <code class="classname">hash_load_check_resize_trigger</code> with
84                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
85                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
86                     cc_hash_mask_exp_1div2_sth_map
87                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
88                     <code class="classname">
89                       cc_hash_table
90                     </code>
91                   </td><td style="text-align: left">
92                     <code class="classname">Comb_Hash_Fn</code>
93                   </td><td style="text-align: left">
94                     <code class="classname">direct_mask_range_hashing</code>
95                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
96                     <code class="classname">Resize_Policy</code>
97                   </td><td rowspan="2" style="text-align: left" valign="top">
98                     <code class="classname">hash_standard_resize_policy</code>
99                   </td><td style="text-align: left">
100                     <code class="classname">Size_Policy</code>
101                   </td><td style="text-align: left">
102                     <code class="classname">hash_exponential_size_policy</code>
103                   </td></tr><tr><td style="text-align: left" valign="top">
104                     <code class="classname">Trigger_Policy</code>
105                   </td><td style="text-align: left">
106                     <code class="classname">hash_load_check_resize_trigger</code> with
107                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
108                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
109                     cc_hash_mask_exp_1div1_nsth_map
110                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
111                     <code class="classname">cc_hash_table</code>
112                   </td><td style="text-align: left">
113                     <code class="classname">Comb_Hash_Fn</code>
114                   </td><td style="text-align: left">
115                     <code class="classname">direct_mask_range_hashing</code>
116                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
117                     <code class="classname">Resize_Policy</code>
118                   </td><td rowspan="2" style="text-align: left" valign="top">
119                     <code class="classname">hash_standard_resize_policy</code>
120                   </td><td style="text-align: left">
121                     <code class="classname">Size_Policy</code>
122                   </td><td style="text-align: left">
123                     <code class="classname">hash_exponential_size_policy</code>
124                   </td></tr><tr><td style="text-align: left" valign="top">
125                     <code class="classname">Trigger_Policy</code>
126                   </td><td style="text-align: left">
127                     <code class="classname">hash_load_check_resize_trigger</code> with
128                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
129                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
130                     cc_hash_mask_exp_1div2_nsth_map
131                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
132                     <code class="classname">cc_hash_table</code>
133                   </td><td style="text-align: left">
134                     <code class="classname">Comb_Hash_Fn</code>
135                   </td><td style="text-align: left">
136                     <code class="classname">direct_mask_range_hashing</code>
137                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
138                     <code class="classname">Resize_Policy</code>
139                   </td><td rowspan="2" style="text-align: left" valign="top">
140                     <code class="classname">hash_standard_resize_policy</code>
141                   </td><td style="text-align: left">
142                     <code class="classname">Size_Policy</code>
143                   </td><td style="text-align: left">
144                     <code class="classname">hash_exponential_size_policy</code>
145                   </td></tr><tr><td style="text-align: left" valign="top">
146                     <code class="classname">Trigger_Policy</code>
147                   </td><td style="text-align: left">
148                     <code class="classname">hash_load_check_resize_trigger</code> with
149                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
150                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.text_find.observations"/>
151             Observations
152           </h6></div></div></div><p>In this setting, the range-hashing scheme affects performance
153           more than other policies. As the results show, containers using
154           mod-based range-hashing (including the native hash-based container,
155           which is currently hard-wired to this scheme) have lower performance
156           than those using mask-based range-hashing. A modulo-based
157           range-hashing scheme's main benefit is that it takes into account
158           all hash-value bits. Standard string hash-functions are designed to
159           create hash values that are nearly-uniform as is (<a class="xref" href="policy_data_structures.html#biblio.knuth98sorting" title="The Art of Computer Programming - Sorting and Searching">[biblio.knuth98sorting]</a>).</p><p>Trigger policies, i.e. the load-checks constants, affect
160           performance to a lesser extent.</p><p>Perhaps surprisingly, storing the hash value alongside each
161           entry affects performance only marginally, at least in this
162           library's implementation. (Unfortunately, it was not possible to run
163           the tests with <code class="classname">std::tr1::unordered_map</code> 's
164           <code class="classname">cache_hash_code = true</code> , as it appeared to
165           malfuntion.)</p></div></div><div class="section" title="Integer find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.int_find"/>
166           Integer <code class="function">find</code>
167         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_find.info"/>
168             Description
169           </h6></div></div></div><p>This test inserts a number of values with uniform
170           integer keys into a container, then performs a series of finds
171           using <code class="function">find</code>. It measures the average time
172           for <code class="function">find</code> as a function of the number of values
173           inserted.</p><p>
174             It uses the test file:
175             <code class="filename">
176               performance/ext/pb_ds/random_int_find_timing.cc
177             </code>
178           </p><p>The test checks the effect of different underlying
179           hash-tables,
180           range-hashing functions, and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_find.results"/>
181             Results
182           </h6></div></div></div><p>
183             There are two sets of results for this type, one for
184             collision-chaining hashes, and one for general-probe hashes.
185           </p><p>The first graphic below shows the results for the native and
186           collision-chaining hash types. The function applied being a random
187           integer timing test using <code class="function">find</code>.
188           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_cc_hash_int_find.png" style="text-align: middle"/></div></div><p>
189             The abbreviated names in the legend of the graphic above are
190             instantiated with the types in the following table.
191           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
192                     n_hash_map_ncah
193                   </td></tr><tr><td style="text-align: left">
194                     <code class="classname">std::tr1::unordered_map</code>
195                   </td><td style="text-align: left">
196                     <code class="classname">cache_hash_code</code>
197                   </td><td style="text-align: left">
198                     <code class="constant">false</code>
199                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
200                     cc_hash_mod_prime_1div1_nsth_map
201                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
202                     <code class="classname">cc_hash_table</code>
203                   </td><td style="text-align: left">
204                     <code class="classname">Comb_Hash_Fn</code>
205                   </td><td style="text-align: left">
206                     <code class="classname">direct_mod_range_hashing</code>
207                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
208                     <code class="classname">Resize_Policy</code>
209                   </td><td rowspan="2" style="text-align: left" valign="top">
210                     <code class="classname">hash_standard_resize_policy</code>
211                   </td><td style="text-align: left">
212                     <code class="classname">Size_Policy</code>
213                   </td><td style="text-align: left">
214                     <code class="classname">hash_prime_size_policy</code>
215                   </td></tr><tr><td style="text-align: left" valign="top">
216                     <code class="classname">Trigger_Policy</code>
217                   </td><td style="text-align: left">
218                     <code class="classname">hash_load_check_resize_trigger</code> with
219                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
220                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
221                     cc_hash_mod_prime_1div2_nsth_map
222                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
223                     <code class="classname">
224                       cc_hash_table
225                     </code>
226                   </td><td style="text-align: left">
227                     <code class="classname">Comb_Hash_Fn</code>
228                   </td><td style="text-align: left">
229                     <code class="classname">direct_mod_range_hashing</code>
230                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
231                     <code class="classname">Resize_Policy</code>
232                   </td><td rowspan="2" style="text-align: left" valign="top">
233                     <code class="classname">hash_standard_resize_policy</code>
234                   </td><td style="text-align: left">
235                     <code class="classname">Size_Policy</code>
236                   </td><td style="text-align: left">
237                     <code class="classname">hash_prime_size_policy</code>
238                   </td></tr><tr><td style="text-align: left" valign="top">
239                     <code class="classname">Trigger_Policy</code>
240                   </td><td style="text-align: left">
241                     <code class="classname">hash_load_check_resize_trigger</code> with
242                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
243                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
244                     cc_hash_mask_exp_1div1_nsth_map
245                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
246                     <code class="classname">cc_hash_table</code>
247                   </td><td style="text-align: left">
248                     <code class="classname">Comb_Hash_Fn</code>
249                   </td><td style="text-align: left">
250                     <code class="classname">direct_mask_range_hashing</code>
251                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
252                     <code class="classname">Resize_Policy</code>
253                   </td><td rowspan="2" style="text-align: left" valign="top">
254                     <code class="classname">hash_standard_resize_policy</code>
255                   </td><td style="text-align: left">
256                     <code class="classname">Size_Policy</code>
257                   </td><td style="text-align: left">
258                     <code class="classname">hash_exponential_size_policy</code>
259                   </td></tr><tr><td style="text-align: left" valign="top">
260                     <code class="classname">Trigger_Policy</code>
261                   </td><td style="text-align: left">
262                     <code class="classname">hash_load_check_resize_trigger</code> with
263                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
264                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
265                     cc_hash_mask_exp_1div2_nsth_map
266                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
267                     <code class="classname">cc_hash_table</code>
268                   </td><td style="text-align: left">
269                     <code class="classname">Comb_Hash_Fn</code>
270                   </td><td style="text-align: left">
271                     <code class="classname">direct_mask_range_hashing</code>
272                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
273                     <code class="classname">Resize_Policy</code>
274                   </td><td rowspan="2" style="text-align: left" valign="top">
275                     <code class="classname">hash_standard_resize_policy</code>
276                   </td><td style="text-align: left">
277                     <code class="classname">Size_Policy</code>
278                   </td><td style="text-align: left">
279                     <code class="classname">hash_exponential_size_policy</code>
280                   </td></tr><tr><td style="text-align: left" valign="top">
281                     <code class="classname">Trigger_Policy</code>
282                   </td><td style="text-align: left">
283                     <code class="classname">hash_load_check_resize_trigger</code> with
284                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
285                   </td></tr></tbody></table></div><p>
286           </p><p>
287           </p><p>And the second graphic shows the results for the native and
288           general-probe hash types. The function applied being a random
289           integer timing test using <code class="function">find</code>.
290           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_gp_hash_int_find.png" style="text-align: middle"/></div></div><p>
291             The abbreviated names in the legend of the graphic above are
292             instantiated with the types in the following table.
293           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
294                     n_hash_map_ncah
295                   </td></tr><tr><td style="text-align: left">
296                     <code class="classname">std::tr1::unordered_map</code>
297                   </td><td style="text-align: left">
298                     <code class="classname">cache_hash_code</code>
299                   </td><td style="text-align: left">
300                     <code class="constant">false</code>
301                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
302                     gp_hash_mod_quadp_prime_1div2_nsth_map
303                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
304                     <code class="classname">gp_hash_table</code>
305                   </td><td style="text-align: left">
306                     <code class="classname">Comb_Hash_Fn</code>
307                   </td><td style="text-align: left">
308                     <code class="classname">direct_mod_range_hashing</code>
309                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
310                     <code class="classname">Probe_Fn</code>
311                   </td><td style="text-align: left">
312                     <code class="classname">quadratic_probe_fn</code>
313                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
314                     <code class="classname">Resize_Policy</code>
315                   </td><td rowspan="2" style="text-align: left" valign="top">
316                     <code class="classname">hash_standard_resize_policy</code>
317                   </td><td style="text-align: left">
318                     <code class="classname">Size_Policy</code>
319                   </td><td style="text-align: left">
320                     <code class="classname">hash_prime_size_policy</code>
321                   </td></tr><tr><td style="text-align: left" valign="top">
322                     <code class="classname">Trigger_Policy</code>
323                   </td><td style="text-align: left">
324                     <code class="classname">hash_load_check_resize_trigger</code> with
325                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
326                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
327                     gp_hash_mask_linp_exp_1div2_nsth_map
328                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
329                     <code class="classname">
330                       gp_hash_table
331                     </code>
332                   </td><td style="text-align: left">
333                     <code class="classname">Comb_Hash_Fn</code>
334                   </td><td style="text-align: left">
335                     <code class="classname">direct_mask_range_hashing</code>
336                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
337                     <code class="classname">Probe_Fn</code>
338                   </td><td style="text-align: left">
339                     <code class="classname">linear_probe_fn</code>
340                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
341                     <code class="classname">Resize_Policy</code>
342                   </td><td rowspan="2" style="text-align: left" valign="top">
343                     <code class="classname">hash_standard_resize_policy</code>
344                   </td><td style="text-align: left">
345                     <code class="classname">Size_Policy</code>
346                   </td><td style="text-align: left">
347                     <code class="classname">hash_exponential_size_policy</code>
348                   </td></tr><tr><td style="text-align: left" valign="top">
349                     <code class="classname">Trigger_Policy</code>
350                   </td><td style="text-align: left">
351                     <code class="classname">hash_load_check_resize_trigger</code> with
352                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
353                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_find.observations"/>
354             Observations
355           </h6></div></div></div><p>In this setting, the choice of underlying hash-table affects
356           performance most, then the range-hashing scheme and, only finally,
357           other policies.</p><p>When comparing probing and chaining containers, it is
358           apparent that the probing containers are less efficient than the
359           collision-chaining containers (
360           <code class="classname">std::tr1::unordered_map</code> uses
361           collision-chaining) in this case.</p><p>Hash-Based Integer Subscript Insert Timing Test shows
362           a different case, where the situation is reversed;
363           </p><p>Within each type of hash-table, the range-hashing scheme
364           affects performance more than other policies; Hash-Based Text
365           <code class="function">find</code> Find Timing Test also shows this. In the
366           above graphics should be noted that
367           <code class="classname">std::tr1::unordered_map</code> are hard-wired
368           currently to mod-based schemes.
369           </p></div></div><div class="section" title="Integer Subscript find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.int_subscript_find"/>
370           Integer Subscript <code class="function">find</code>
371         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_find.info"/>
372             Description
373           </h6></div></div></div><p>This test inserts a number of values with uniform
374           integer keys into a container, then performs a series of finds
375           using <code class="function">operator[]</code>. It measures the average time
376           for <code class="function">operator[]</code> as a function of the number of
377           values inserted.</p><p>
378             It uses the test file:
379             <code class="filename">
380               performance/ext/pb_ds/random_int_subscript_find_timing.cc
381             </code>
382           </p><p>The test checks the effect of different underlying
383           hash-tables, range-hashing functions, and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_find.results"/>
384             Results
385           </h6></div></div></div><p>
386             There are two sets of results for this type, one for
387             collision-chaining hashes, and one for general-probe hashes.
388           </p><p>The first graphic below shows the results for the native
389           and collision-chaining hash types, using as the function
390           applied an integer subscript timing test with
391           <code class="function">find</code>.
392           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_cc_hash_int_subscript_find.png" style="text-align: middle"/></div></div><p>
393             The abbreviated names in the legend of the graphic above are
394             instantiated with the types in the following table.
395           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
396                     n_hash_map_ncah
397                   </td></tr><tr><td style="text-align: left">
398                     <code class="classname">std::tr1::unordered_map</code>
399                   </td><td style="text-align: left">
400                     <code class="classname">cache_hash_code</code>
401                   </td><td style="text-align: left">
402                     <code class="constant">false</code>
403                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
404                     cc_hash_mod_prime_1div1_nsth_map
405                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
406                     <code class="classname">cc_hash_table</code>
407                   </td><td style="text-align: left">
408                     <code class="classname">Comb_Hash_Fn</code>
409                   </td><td style="text-align: left">
410                     <code class="classname">direct_mod_range_hashing</code>
411                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
412                     <code class="classname">Resize_Policy</code>
413                   </td><td rowspan="2" style="text-align: left" valign="top">
414                     <code class="classname">hash_standard_resize_policy</code>
415                   </td><td style="text-align: left">
416                     <code class="classname">Size_Policy</code>
417                   </td><td style="text-align: left">
418                     <code class="classname">hash_prime_size_policy</code>
419                   </td></tr><tr><td style="text-align: left" valign="top">
420                     <code class="classname">Trigger_Policy</code>
421                   </td><td style="text-align: left">
422                     <code class="classname">hash_load_check_resize_trigger</code> with
423                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
424                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
425                     cc_hash_mod_prime_1div2_nsth_map
426                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
427                     <code class="classname">cc_hash_table</code>
428                   </td><td style="text-align: left">
429                     <code class="classname">Comb_Hash_Fn</code>
430                   </td><td style="text-align: left">
431                     <code class="classname">direct_mod_range_hashing</code>
432                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
433                     <code class="classname">Resize_Policy</code>
434                   </td><td rowspan="2" style="text-align: left" valign="top">
435                     <code class="classname">hash_standard_resize_policy</code>
436                   </td><td style="text-align: left">
437                     <code class="classname">Size_Policy</code>
438                   </td><td style="text-align: left">
439                     <code class="classname">hash_prime_size_policy</code>
440                   </td></tr><tr><td style="text-align: left" valign="top">
441                     <code class="classname">Trigger_Policy</code>
442                   </td><td style="text-align: left">
443                     <code class="classname">hash_load_check_resize_trigger</code> with
444                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
445                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
446                     cc_hash_mask_exp_1div1_nsth_map
447                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
448                     <code class="classname">cc_hash_table</code>
449                   </td><td style="text-align: left">
450                     <code class="classname">Comb_Hash_Fn</code>
451                   </td><td style="text-align: left">
452                     <code class="classname">direct_mask_range_hashing</code>
453                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
454                     <code class="classname">Resize_Policy</code>
455                   </td><td rowspan="2" style="text-align: left" valign="top">
456                     <code class="classname">hash_standard_resize_policy</code>
457                   </td><td style="text-align: left">
458                     <code class="classname">Size_Policy</code>
459                   </td><td style="text-align: left">
460                     <code class="classname">hash_exponential_size_policy</code>
461                   </td></tr><tr><td style="text-align: left" valign="top">
462                     <code class="classname">Trigger_Policy</code>
463                   </td><td style="text-align: left">
464                     <code class="classname">hash_load_check_resize_trigger</code> with
465                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
466                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
467                     cc_hash_mask_exp_1div2_nsth_map
468                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
469                     <code class="classname">cc_hash_table</code>
470                   </td><td style="text-align: left">
471                     <code class="classname">Comb_Hash_Fn</code>
472                   </td><td style="text-align: left">
473                     <code class="classname">direct_mask_range_hashing</code>
474                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
475                     <code class="classname">Resize_Policy</code>
476                   </td><td rowspan="2" style="text-align: left" valign="top">
477                     <code class="classname">hash_standard_resize_policy</code>
478                   </td><td style="text-align: left">
479                     <code class="classname">Size_Policy</code>
480                   </td><td style="text-align: left">
481                     <code class="classname">hash_exponential_size_policy</code>
482                   </td></tr><tr><td style="text-align: left" valign="top">
483                     <code class="classname">Trigger_Policy</code>
484                   </td><td style="text-align: left">
485                     <code class="classname">hash_load_check_resize_trigger</code> with
486                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
487                   </td></tr></tbody></table></div><p>
488           </p><p>
489           </p><p>And the second graphic shows the results for the native and
490           general-probe hash types. The function applied being a random
491           integer timing test using <code class="function">find</code>.
492           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_gp_hash_int_subscript_find.png" style="text-align: middle"/></div></div><p>
493             The abbreviated names in the legend of the graphic above are
494             instantiated with the types in the following table.
495           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
496                     n_hash_map_ncah
497                   </td></tr><tr><td style="text-align: left">
498                     <code class="classname">std::tr1::unordered_map</code>
499                   </td><td style="text-align: left">
500                     <code class="classname">cache_hash_code</code>
501                   </td><td style="text-align: left">
502                     <code class="constant">false</code>
503                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
504                     gp_hash_mod_quadp_prime_1div2_nsth_map
505                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
506                     <code class="classname">gp_hash_table</code>
507                   </td><td style="text-align: left">
508                     <code class="classname">Comb_Hash_Fn</code>
509                   </td><td style="text-align: left">
510                     <code class="classname">direct_mod_range_hashing</code>
511                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
512                     <code class="classname">Probe_Fn</code>
513                   </td><td style="text-align: left">
514                     <code class="classname">quadratic_probe_fn</code>
515                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
516                     <code class="classname">Resize_Policy</code>
517                   </td><td rowspan="2" style="text-align: left" valign="top">
518                     <code class="classname">hash_standard_resize_policy</code>
519                   </td><td style="text-align: left">
520                     <code class="classname">Size_Policy</code>
521                   </td><td style="text-align: left">
522                     <code class="classname">hash_prime_size_policy</code>
523                   </td></tr><tr><td style="text-align: left" valign="top">
524                     <code class="classname">Trigger_Policy</code>
525                   </td><td style="text-align: left">
526                     <code class="classname">hash_load_check_resize_trigger</code> with
527                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
528                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
529                     gp_hash_mask_linp_exp_1div2_nsth_map
530                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
531                     <code class="classname">
532                       gp_hash_table
533                     </code>
534                   </td><td style="text-align: left">
535                     <code class="classname">Comb_Hash_Fn</code>
536                   </td><td style="text-align: left">
537                     <code class="classname">direct_mask_range_hashing</code>
538                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
539                     <code class="classname">Probe_Fn</code>
540                   </td><td style="text-align: left">
541                     <code class="classname">linear_probe_fn</code>
542                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
543                     <code class="classname">Resize_Policy</code>
544                   </td><td rowspan="2" style="text-align: left" valign="top">
545                     <code class="classname">hash_standard_resize_policy</code>
546                   </td><td style="text-align: left">
547                     <code class="classname">Size_Policy</code>
548                   </td><td style="text-align: left">
549                     <code class="classname">hash_exponential_size_policy</code>
550                   </td></tr><tr><td style="text-align: left" valign="top">
551                     <code class="classname">Trigger_Policy</code>
552                   </td><td style="text-align: left">
553                     <code class="classname">hash_load_check_resize_trigger</code> with
554                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
555                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_find.observations"/>
556             Observations
557           </h6></div></div></div><p>This test shows similar results to Hash-Based
558           Integer <code class="classname">find</code> Find Timing test.</p></div></div><div class="section" title="Integer Subscript insert"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.int_subscript_insert"/>
559           Integer Subscript <code class="function">insert</code>
560         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_insert.info"/>
561             Description
562           </h6></div></div></div><p>This test inserts a number of values with uniform i.i.d.
563           integer keys into a container, using
564           <code class="function">operator[]</code>. It measures the average time for
565           <code class="function">operator[]</code> as a function of the number of
566           values inserted.</p><p>
567             It uses the test file:
568             <code class="filename">
569               performance/ext/pb_ds/random_int_subscript_insert_timing.cc
570             </code>
571           </p><p>The test checks the effect of different underlying
572           hash-tables.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_insert.results"/>
573             Results
574           </h6></div></div></div><p>
575             There are two sets of results for this type, one for
576             collision-chaining hashes, and one for general-probe hashes.
577           </p><p>The first graphic below shows the results for the native
578           and collision-chaining hash types, using as the function
579           applied an integer subscript timing test with
580           <code class="function">insert</code>.
581           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_cc_hash_int_subscript_insert.png" style="text-align: middle"/></div></div><p>
582             The abbreviated names in the legend of the graphic above are
583             instantiated with the types in the following table.
584           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
585                     n_hash_map_ncah
586                   </td></tr><tr><td style="text-align: left">
587                     <code class="classname">std::tr1::unordered_map</code>
588                   </td><td style="text-align: left">
589                     <code class="classname">cache_hash_code</code>
590                   </td><td style="text-align: left">
591                     <code class="constant">false</code>
592                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
593                     cc_hash_mod_prime_1div1_nsth_map
594                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
595                     <code class="classname">cc_hash_table</code>
596                   </td><td style="text-align: left">
597                     <code class="classname">Comb_Hash_Fn</code>
598                   </td><td style="text-align: left">
599                     <code class="classname">direct_mod_range_hashing</code>
600                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
601                     <code class="classname">Resize_Policy</code>
602                   </td><td rowspan="2" style="text-align: left" valign="top">
603                     <code class="classname">hash_standard_resize_policy</code>
604                   </td><td style="text-align: left">
605                     <code class="classname">Size_Policy</code>
606                   </td><td style="text-align: left">
607                     <code class="classname">hash_prime_size_policy</code>
608                   </td></tr><tr><td style="text-align: left" valign="top">
609                     <code class="classname">Trigger_Policy</code>
610                   </td><td style="text-align: left">
611                     <code class="classname">hash_load_check_resize_trigger</code> with
612                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
613                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
614                     cc_hash_mod_prime_1div2_nsth_map
615                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
616                     <code class="classname">cc_hash_table</code>
617                   </td><td style="text-align: left">
618                     <code class="classname">Comb_Hash_Fn</code>
619                   </td><td style="text-align: left">
620                     <code class="classname">direct_mod_range_hashing</code>
621                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
622                     <code class="classname">Resize_Policy</code>
623                   </td><td rowspan="2" style="text-align: left" valign="top">
624                     <code class="classname">hash_standard_resize_policy</code>
625                   </td><td style="text-align: left">
626                     <code class="classname">Size_Policy</code>
627                   </td><td style="text-align: left">
628                     <code class="classname">hash_prime_size_policy</code>
629                   </td></tr><tr><td style="text-align: left" valign="top">
630                     <code class="classname">Trigger_Policy</code>
631                   </td><td style="text-align: left">
632                     <code class="classname">hash_load_check_resize_trigger</code> with
633                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
634                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
635                     cc_hash_mask_exp_1div1_nsth_map
636                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
637                     <code class="classname">cc_hash_table</code>
638                   </td><td style="text-align: left">
639                     <code class="classname">Comb_Hash_Fn</code>
640                   </td><td style="text-align: left">
641                     <code class="classname">direct_mask_range_hashing</code>
642                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
643                     <code class="classname">Resize_Policy</code>
644                   </td><td rowspan="2" style="text-align: left" valign="top">
645                     <code class="classname">hash_standard_resize_policy</code>
646                   </td><td style="text-align: left">
647                     <code class="classname">Size_Policy</code>
648                   </td><td style="text-align: left">
649                     <code class="classname">hash_exponential_size_policy</code>
650                   </td></tr><tr><td style="text-align: left" valign="top">
651                     <code class="classname">Trigger_Policy</code>
652                   </td><td style="text-align: left">
653                     <code class="classname">hash_load_check_resize_trigger</code> with
654                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
655                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
656                     cc_hash_mask_exp_1div2_nsth_map
657                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
658                     <code class="classname">cc_hash_table</code>
659                   </td><td style="text-align: left">
660                     <code class="classname">Comb_Hash_Fn</code>
661                   </td><td style="text-align: left">
662                     <code class="classname">direct_mask_range_hashing</code>
663                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
664                     <code class="classname">Resize_Policy</code>
665                   </td><td rowspan="2" style="text-align: left" valign="top">
666                     <code class="classname">hash_standard_resize_policy</code>
667                   </td><td style="text-align: left">
668                     <code class="classname">Size_Policy</code>
669                   </td><td style="text-align: left">
670                     <code class="classname">hash_exponential_size_policy</code>
671                   </td></tr><tr><td style="text-align: left" valign="top">
672                     <code class="classname">Trigger_Policy</code>
673                   </td><td style="text-align: left">
674                     <code class="classname">hash_load_check_resize_trigger</code> with
675                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
676                   </td></tr></tbody></table></div><p>
677           </p><p>
678           </p><p>And the second graphic shows the results for the native and
679           general-probe hash types. The function applied being a random
680           integer timing test using <code class="function">find</code>.
681           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_gp_hash_int_subscript_insert.png" style="text-align: middle"/></div></div><p>
682             The abbreviated names in the legend of the graphic above are
683             instantiated with the types in the following table.
684           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
685                     n_hash_map_ncah
686                   </td></tr><tr><td style="text-align: left">
687                     <code class="classname">std::tr1::unordered_map</code>
688                   </td><td style="text-align: left">
689                     <code class="classname">cache_hash_code</code>
690                   </td><td style="text-align: left">
691                     <code class="constant">false</code>
692                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
693                     gp_hash_mod_quadp_prime_1div2_nsth_map
694                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
695                     <code class="classname">gp_hash_table</code>
696                   </td><td style="text-align: left">
697                     <code class="classname">Comb_Hash_Fn</code>
698                   </td><td style="text-align: left">
699                     <code class="classname">direct_mod_range_hashing</code>
700                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
701                     <code class="classname">Probe_Fn</code>
702                   </td><td style="text-align: left">
703                     <code class="classname">quadratic_probe_fn</code>
704                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
705                     <code class="classname">Resize_Policy</code>
706                   </td><td rowspan="2" style="text-align: left" valign="top">
707                     <code class="classname">hash_standard_resize_policy</code>
708                   </td><td style="text-align: left">
709                     <code class="classname">Size_Policy</code>
710                   </td><td style="text-align: left">
711                     <code class="classname">hash_prime_size_policy</code>
712                   </td></tr><tr><td style="text-align: left" valign="top">
713                     <code class="classname">Trigger_Policy</code>
714                   </td><td style="text-align: left">
715                     <code class="classname">hash_load_check_resize_trigger</code> with
716                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
717                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
718                     gp_hash_mask_linp_exp_1div2_nsth_map
719                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
720                     <code class="classname">
721                       gp_hash_table
722                     </code>
723                   </td><td style="text-align: left">
724                     <code class="classname">Comb_Hash_Fn</code>
725                   </td><td style="text-align: left">
726                     <code class="classname">direct_mask_range_hashing</code>
727                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
728                     <code class="classname">Probe_Fn</code>
729                   </td><td style="text-align: left">
730                     <code class="classname">linear_probe_fn</code>
731                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
732                     <code class="classname">Resize_Policy</code>
733                   </td><td rowspan="2" style="text-align: left" valign="top">
734                     <code class="classname">hash_standard_resize_policy</code>
735                   </td><td style="text-align: left">
736                     <code class="classname">Size_Policy</code>
737                   </td><td style="text-align: left">
738                     <code class="classname">hash_exponential_size_policy</code>
739                   </td></tr><tr><td style="text-align: left" valign="top">
740                     <code class="classname">Trigger_Policy</code>
741                   </td><td style="text-align: left">
742                     <code class="classname">hash_load_check_resize_trigger</code> with
743                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
744                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_insert.observations"/>
745             Observations
746           </h6></div></div></div><p>In this setting, as in Hash-Based Text
747           <code class="function">find</code> Find Timing test and Hash-Based
748           Integer <code class="function">find</code> Find Timing test , the choice
749           of underlying hash-table underlying hash-table affects performance
750           most, then the range-hashing scheme, and
751           finally any other policies.</p><p>There are some differences, however:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>In this setting, probing tables function sometimes more
752             efficiently than collision-chaining tables.
753             This is explained shortly.</p></li><li class="listitem"><p>The performance graphs have a "saw-tooth" shape. The
754             average insert time rises and falls. As values are inserted
755             into the container, the load factor grows larger. Eventually,
756             a resize occurs. The reallocations and rehashing are
757             relatively expensive. After this, the load factor is smaller
758             than before.</p></li></ol></div><p>Collision-chaining containers use indirection for greater
759           flexibility; probing containers store values contiguously, in
760           an array (see Figure Motivation::Different
761           underlying data structures A and B, respectively). It
762           follows that for simple data types, probing containers access
763           their allocator less frequently than collision-chaining
764           containers, (although they still have less efficient probing
765           sequences). This explains why some probing containers fare
766           better than collision-chaining containers in this case.</p><p>
767             Within each type of hash-table, the range-hashing scheme affects
768             performance more than other policies. This is similar to the
769             situation in Hash-Based Text
770             <code class="function">find</code> Find Timing Test and Hash-Based
771             Integer <code class="function">find</code> Find Timing Test.
772             Unsurprisingly, however, containers with lower α<sub>max</sub> perform worse in this case,
773           since more re-hashes are performed.</p></div></div><div class="section" title="Integer find with Skewed-Distribution"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.zlob_int_find"/>
774           Integer <code class="function">find</code> with Skewed-Distribution
775         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.zlob_int_find.info"/>
776             Description
777           </h6></div></div></div><p>This test inserts a number of values with a markedly
778           non-uniform integer keys into a container, then performs
779           a series of finds using <code class="function">find</code>. It measures the average
780           time for <code class="function">find</code> as a function of the number of values in
781           the containers. The keys are generated as follows. First, a
782           uniform integer is created. Then it is then shifted left 8 bits.</p><p>
783             It uses the test file:
784             <code class="filename">
785               performance/ext/pb_ds/hash_zlob_random_int_find_timing.cc
786             </code>
787           </p><p>The test checks the effect of different range-hashing
788           functions and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.zlob_int_find.results"/>
789             Results
790           </h6></div></div></div><p>The graphic below show the results for the native, collision-chaining, and general-probing hash types.
791           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_hash_zlob_int_find.png" style="text-align: middle"/></div></div><p>
792             The abbreviated names in the legend of the graphic above are
793             instantiated with the types in the following table.
794           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
795                     n_hash_map_ncah
796                   </td></tr><tr><td style="text-align: left">
797                     <code class="classname">std::tr1::unordered_map</code>
798                   </td><td style="text-align: left">
799                     <code class="classname">cache_hash_code</code>
800                   </td><td style="text-align: left">
801                     <code class="constant">false</code>
802                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
803                     cc_hash_mod_prime_1div1_nsth_map
804                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
805                     <code class="classname">cc_hash_table</code>
806                   </td><td style="text-align: left">
807                     <code class="classname">Comb_Hash_Fn</code>
808                   </td><td style="text-align: left">
809                     <code class="classname">direct_mod_range_hashing</code>
810                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
811                     <code class="classname">Resize_Policy</code>
812                   </td><td rowspan="2" style="text-align: left" valign="top">
813                     <code class="classname">hash_standard_resize_policy</code>
814                   </td><td style="text-align: left">
815                     <code class="classname">Size_Policy</code>
816                   </td><td style="text-align: left">
817                     <code class="classname">hash_prime_size_policy</code>
818                   </td></tr><tr><td style="text-align: left" valign="top">
819                     <code class="classname">Trigger_Policy</code>
820                   </td><td style="text-align: left">
821                     <code class="classname">hash_load_check_resize_trigger</code> with
822                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
823                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
824                     cc_hash_mask_exp_1div1_nsth_map
825                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
826                     <code class="classname">
827                       cc_hash_table
828                     </code>
829                   </td><td style="text-align: left">
830                     <code class="classname">Comb_Hash_Fn</code>
831                   </td><td style="text-align: left">
832                     <code class="classname">direct_mask_range_hashing</code>
833                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
834                     <code class="classname">Resize_Policy</code>
835                   </td><td rowspan="2" style="text-align: left" valign="top">
836                     <code class="classname">hash_standard_resize_policy</code>
837                   </td><td style="text-align: left">
838                     <code class="classname">Size_Policy</code>
839                   </td><td style="text-align: left">
840                     <code class="classname">hash_exponential_size_policy</code>
841                   </td></tr><tr><td style="text-align: left" valign="top">
842                     <code class="classname">Trigger_Policy</code>
843                   </td><td style="text-align: left">
844                     <code class="classname">hash_load_check_resize_trigger</code> with
845                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
846                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
847                     gp_hash_mod_quadp_prime_1div2_nsth_map
848                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
849                     <code class="classname">gp_hash_table</code>
850                   </td><td style="text-align: left">
851                     <code class="classname">Comb_Hash_Fn</code>
852                   </td><td style="text-align: left">
853                     <code class="classname">direct_mod_range_hashing</code>
854                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
855                     <code class="classname">Probe_Fn</code>
856                   </td><td style="text-align: left">
857                     <code class="classname">quadratic_probe_fn</code>
858                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
859                     <code class="classname">Resize_Policy</code>
860                   </td><td rowspan="2" style="text-align: left" valign="top">
861                     <code class="classname">hash_standard_resize_policy</code>
862                   </td><td style="text-align: left">
863                     <code class="classname">Size_Policy</code>
864                   </td><td style="text-align: left">
865                     <code class="classname">hash_prime_size_policy</code>
866                   </td></tr><tr><td style="text-align: left" valign="top">
867                     <code class="classname">Trigger_Policy</code>
868                   </td><td style="text-align: left">
869                     <code class="classname">hash_load_check_resize_trigger</code> with
870                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
871                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.zlob_int_find.observations"/>
872             Observations
873           </h6></div></div></div><p>In this setting, the distribution of keys is so skewed that
874           the underlying hash-table type affects performance marginally.
875           (This is in contrast with Hash-Based Text
876           <code class="function">find</code> Find Timing Test, Hash-Based
877           Integer <code class="function">find</code> Find Timing Test, Hash-Based
878           Integer Subscript Find Timing Test and Hash-Based
879           Integer Subscript Insert Timing Test.)</p><p>The range-hashing scheme affects performance dramatically. A
880           mask-based range-hashing scheme effectively maps all values
881           into the same bucket. Access degenerates into a search within
882           an unordered linked-list. In the graphic above, it should be noted that
883           <code class="classname">std::tr1::unordered_map</code> is hard-wired currently to mod-based and mask-based schemes,
884           respectively.</p><p>When observing the settings of this test, it is apparent
885           that the keys' distribution is far from natural. One might ask
886           if the test is not contrived to show that, in some cases,
887           mod-based range hashing does better than mask-based range
888           hashing. This is, in fact just the case. A
889           more natural case in which mod-based range hashing is better was not encountered.
890           Thus the inescapable conclusion: real-life key distributions are handled better
891           with an appropriate hash function and a mask-based
892           range-hashing function. (<code class="filename">pb_ds/example/hash_shift_mask.cc</code>
893           shows an example of handling this a-priori known skewed
894           distribution with a mask-based range-hashing function). If hash
895           performance is bad, a χ<sup>2</sup> test can be used
896           to check how to transform it into a more uniform
897           distribution.</p><p>For this reason, this library's default range-hashing
898           function is mask-based.</p></div></div><div class="section" title="Erase Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.erase_mem"/>
899           Erase Memory Use
900         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.erase_mem.info"/>
901             Description
902           </h6></div></div></div><p>This test inserts a number of uniform integer keys
903           into a container, then erases all keys except one. It measures
904           the final size of the container.</p><p>
905             It uses the test file:
906             <code class="filename">
907               performance/ext/pb_ds/hash_random_int_erase_mem_usage.cc
908             </code>
909           </p><p>The test checks how containers adjust internally as their
910           logical size decreases.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.erase_mem.results"/>
911             Results
912           </h6></div></div></div><p>The graphic below show the results for the native, collision-chaining, and general-probing hash types.
913           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_hash_int_erase_mem.png" style="text-align: middle"/></div></div><p>
914             The abbreviated names in the legend of the graphic above are
915             instantiated with the types in the following table.
916           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
917                     n_hash_map_ncah
918                   </td></tr><tr><td style="text-align: left">
919                     <code class="classname">std::tr1::unordered_map</code>
920                   </td><td style="text-align: left">
921                     <code class="classname">cache_hash_code</code>
922                   </td><td style="text-align: left">
923                     <code class="constant">false</code>
924                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
925                     cc_hash_mod_prime_1div1_nsth_map
926                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
927                     <code class="classname">cc_hash_table</code>
928                   </td><td style="text-align: left">
929                     <code class="classname">Comb_Hash_Fn</code>
930                   </td><td style="text-align: left">
931                     <code class="classname">direct_mod_range_hashing</code>
932                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
933                     <code class="classname">Resize_Policy</code>
934                   </td><td rowspan="2" style="text-align: left" valign="top">
935                     <code class="classname">hash_standard_resize_policy</code>
936                   </td><td style="text-align: left">
937                     <code class="classname">Size_Policy</code>
938                   </td><td style="text-align: left">
939                     <code class="classname">hash_prime_size_policy</code>
940                   </td></tr><tr><td style="text-align: left" valign="top">
941                     <code class="classname">Trigger_Policy</code>
942                   </td><td style="text-align: left">
943                     <code class="classname">hash_load_check_resize_trigger</code> with
944                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
945                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
946                     cc_hash_mask_exp_1div2_nsth_map
947                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
948                     <code class="classname">
949                       cc_hash_table
950                     </code>
951                   </td><td style="text-align: left">
952                     <code class="classname">Comb_Hash_Fn</code>
953                   </td><td style="text-align: left">
954                     <code class="classname">direct_mask_range_hashing</code>
955                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
956                     <code class="classname">Resize_Policy</code>
957                   </td><td rowspan="2" style="text-align: left" valign="top">
958                     <code class="classname">hash_standard_resize_policy</code>
959                   </td><td style="text-align: left">
960                     <code class="classname">Size_Policy</code>
961                   </td><td style="text-align: left">
962                     <code class="classname">hash_exponential_size_policy</code>
963                   </td></tr><tr><td style="text-align: left" valign="top">
964                     <code class="classname">Trigger_Policy</code>
965                   </td><td style="text-align: left">
966                     <code class="classname">hash_load_check_resize_trigger</code> with
967                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
968                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
969                     gp_hash_mask_linp_exp_1div2_nsth_set
970                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
971                     <code class="classname">gp_hash_table</code>
972                   </td><td style="text-align: left">
973                     <code class="classname">Comb_Hash_Fn</code>
974                   </td><td style="text-align: left">
975                     <code class="classname">direct_mask_range_hashing</code>
976                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
977                     <code class="classname">Probe_Fn</code>
978                   </td><td style="text-align: left">
979                     <code class="classname">linear_probe_fn</code>
980                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
981                     <code class="classname">Resize_Policy</code>
982                   </td><td rowspan="2" style="text-align: left" valign="top">
983                     <code class="classname">hash_standard_resize_policy</code>
984                   </td><td style="text-align: left">
985                     <code class="classname">Size_Policy</code>
986                   </td><td style="text-align: left">
987                     <code class="classname">hash_exponential_size_policy</code>
988                   </td></tr><tr><td style="text-align: left" valign="top">
989                     <code class="classname">Trigger_Policy</code>
990                   </td><td style="text-align: left">
991                     <code class="classname">hash_load_check_resize_trigger</code> with
992                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
993                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.erase_mem.observations"/>
994             Observations
995           </h6></div></div></div><p>The standard's hash-based containers act very differently than trees in
996           this respect. When erasing numerous keys from an standard
997           associative-container, the resulting memory user varies greatly
998           depending on whether the container is tree-based or hash-based.
999           This is a fundamental consequence of the standard's interface for
1000           associative containers, and it is not due to a specific
1001           implementation.</p></div></div></div><div class="section" title="Branch-Based"><div class="titlepage"><div><div><h4 class="title"><a id="performance.branch"/>Branch-Based</h4></div></div></div><p/><div class="section" title="Text insert"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.text_insert"/>
1002           Text <code class="function">insert</code>
1003         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_insert.info"/>
1004             Description
1005           </h6></div></div></div><p>This test inserts a number of values with keys from an arbitrary
1006           text ([ wickland96thirty ]) into a container
1007           using <code class="function">insert</code> . It measures the average time
1008           for <code class="function">insert</code> as a function of the number of
1009           values inserted.</p><p>The test checks the effect of different underlying
1010           data structures.</p><p>
1011             It uses the test file:
1012             <code class="filename">
1013               performance/ext/pb_ds/tree_text_insert_timing.cc
1014             </code>
1015           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_insert.results"/>
1016             Results
1017           </h6></div></div></div><p>The three graphics below show the results for the native
1018           tree and this library's node-based trees, the native tree and
1019           this library's vector-based trees, and the native tree
1020           and this library's PATRICIA-trie, respectively.
1021           </p><p>The graphic immediately below shows the results for the
1022           native tree type and several node-based tree types.
1023           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_insert_node.png" style="text-align: middle"/></div><p>
1024               The abbreviated names in the legend of the graphic above are
1025               instantiated with the types in the following table.
1026             </p></div><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1027                     n_map
1028                   </td></tr><tr><td style="text-align: left">
1029                     <code class="classname">std::map</code>
1030                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1031                     splay_tree_map
1032                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1033                     <code class="classname">tree</code>
1034                   </td><td style="text-align: left">
1035                     <code class="classname">Tag</code>
1036                   </td><td style="text-align: left">
1037                     <code class="classname">splay_tree_tag</code>
1038                   </td></tr><tr><td style="text-align: left">
1039                     <code class="classname">Node_update</code>
1040                   </td><td style="text-align: left">
1041                     <code class="classname">null_node_update</code>
1042                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1043                     rb_tree_map
1044                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1045                     <code class="classname">tree</code>
1046                   </td><td style="text-align: left">
1047                     <code class="classname">Tag</code>
1048                   </td><td style="text-align: left">
1049                     <code class="classname">rb_tree_tag</code>
1050                   </td></tr><tr><td style="text-align: left">
1051                     <code class="classname">Node_update</code>
1052                   </td><td style="text-align: left">
1053                     <code class="classname">null_node_update</code>
1054                   </td></tr></tbody></table></div><p>The graphic below shows the results for the
1055           native tree type and a vector-based tree type.
1056           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_insert_vector.png" style="text-align: middle"/></div></div><p>
1057             The abbreviated names in the legend of the graphic above are
1058             instantiated with the types in the following table.
1059           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1060                     n_map
1061                   </td></tr><tr><td style="text-align: left">
1062                     <code class="classname">std::map</code>
1063                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1064                     ov_tree_map
1065                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1066                     <code class="classname">tree</code>
1067                   </td><td style="text-align: left">
1068                     <code class="classname">Tag</code>
1069                   </td><td style="text-align: left">
1070                     <code class="classname">ov_tree_tag</code>
1071                   </td></tr><tr><td style="text-align: left">
1072                     <code class="classname">Node_update</code>
1073                   </td><td style="text-align: left">
1074                     <code class="classname">null_node_update</code>
1075                   </td></tr></tbody></table></div><p>The graphic below shows the results for the
1076           native tree type and a PATRICIA trie type.
1077           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_insert_trie.png" style="text-align: middle"/></div></div><p>
1078             The abbreviated names in the legend of the graphic above are
1079             instantiated with the types in the following table.
1080           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1081                     n_map
1082                   </td></tr><tr><td style="text-align: left">
1083                     <code class="classname">std::map</code>
1084                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1085                     pat_trie_map
1086                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1087                     <code class="classname">tree</code>
1088                   </td><td style="text-align: left">
1089                     <code class="classname">Tag</code>
1090                   </td><td style="text-align: left">
1091                     <code class="classname">pat_trie_tag</code>
1092                   </td></tr><tr><td style="text-align: left">
1093                     <code class="classname">Node_update</code>
1094                   </td><td style="text-align: left">
1095                     <code class="classname">null_node_update</code>
1096                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_insert.observations"/>
1097             Observations
1098           </h6></div></div></div><p>Observing the first graphic implies that for this setting, a splay tree
1099           (<code class="classname">tree</code> with <code class="classname">Tag
1100           </code> = <code class="classname">splay_tree_tag</code>) does not do
1101           well. See also the Branch-Based
1102           Text <code class="function">find</code> Find Timing Test. The two
1103           red-black trees perform better.</p><p>Observing the second graphic, an ordered-vector tree
1104           (<code class="classname">tree</code> with <code class="classname">Tag
1105           </code> = <code class="classname">ov_tree_tag</code>) performs
1106           abysmally. Inserting into this type of tree has linear complexity
1107           [ austern00noset].</p><p>Observing the third and last graphic, A PATRICIA trie
1108           (<code class="classname">trie</code> with <code class="classname">Tag
1109           </code> = <code class="classname">pat_trie_tag</code>) has abysmal
1110           performance, as well. This is not that surprising, since a
1111           large-fan-out PATRICIA trie works like a hash table with
1112           collisions resolved by a sub-trie. Each time a collision is
1113           encountered, a new "hash-table" is built A large fan-out PATRICIA
1114           trie, however, doe does well in look-ups (see Branch-Based
1115           Text <code class="function">find</code> Find Timing Test). It may be
1116           beneficial in semi-static settings.</p></div></div><div class="section" title="Text find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.text_find"/>
1117           Text <code class="function">find</code>
1118         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_find.info"/>
1119             Description
1120           </h6></div></div></div><p>This test inserts a number of values with keys from an
1121           arbitrary text ([wickland96thirty]) into
1122           a container, then performs a series of finds using
1123           <code class="function">find</code>. It measures the average time
1124           for <code class="function">find</code> as a function of the number of
1125           values inserted.</p><p>
1126             It uses the test file:
1127             <code class="filename">
1128               performance/ext/pb_ds/text_find_timing.cc
1129             </code>
1130           </p><p>The test checks the effect of different underlying
1131           data structures.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_find.results"/>
1132             Results
1133           </h6></div></div></div><p>The graphic immediately below shows the results for the
1134           native tree type and several other tree types.
1135           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_find.png" style="text-align: middle"/></div></div><p>
1136             The abbreviated names in the legend of the graphic above are
1137             instantiated with the types in the following table.
1138           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1139                     n_map
1140                   </td></tr><tr><td style="text-align: left">
1141                     <code class="classname">std::map</code>
1142                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1143                     splay_tree_map
1144                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1145                     <code class="classname">tree</code>
1146                   </td><td style="text-align: left">
1147                     <code class="classname">Tag</code>
1148                   </td><td style="text-align: left">
1149                     <code class="classname">splay_tree_tag</code>
1150                   </td></tr><tr><td style="text-align: left">
1151                     <code class="classname">Node_Update</code>
1152                   </td><td style="text-align: left">
1153                     <code class="classname">null_node_update</code>
1154                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1155                     rb_tree_map
1156                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1157                     <code class="classname">tree</code>
1158                   </td><td style="text-align: left">
1159                     <code class="classname">Tag</code>
1160                   </td><td style="text-align: left">
1161                     <code class="classname">rb_tree_tag</code>
1162                   </td></tr><tr><td style="text-align: left">
1163                     <code class="classname">Node_Update</code>
1164                   </td><td style="text-align: left">
1165                     <code class="classname">null_node_update</code>
1166                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1167                     ov_tree_map
1168                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1169                     <code class="classname">tree</code>
1170                   </td><td style="text-align: left">
1171                     <code class="classname">Tag</code>
1172                   </td><td style="text-align: left">
1173                     <code class="classname">ov_tree_tag</code>
1174                   </td></tr><tr><td style="text-align: left">
1175                     <code class="classname">Node_Update</code>
1176                   </td><td style="text-align: left">
1177                     <code class="classname">null_node_update</code>
1178                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1179                     pat_trie_map
1180                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1181                     <code class="classname">tree</code>
1182                   </td><td style="text-align: left">
1183                     <code class="classname">Tag</code>
1184                   </td><td style="text-align: left">
1185                     <code class="classname">pat_trie_tag</code>
1186                   </td></tr><tr><td style="text-align: left">
1187                     <code class="classname">Node_Update</code>
1188                   </td><td style="text-align: left">
1189                     <code class="classname">null_node_update</code>
1190                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_find.observations"/>
1191             Observations
1192           </h6></div></div></div><p>For this setting, a splay tree (<code class="classname">tree</code>
1193           with <code class="classname">Tag
1194           </code> = <code class="classname">splay_tree_tag</code>) does not do
1195           well. This is possibly due to two reasons:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>A splay tree is not guaranteed to be balanced [motwani95random]. If a
1196             splay tree contains n nodes, its average root-leaf
1197             path can be m &gt;&gt; log(n).</p></li><li class="listitem"><p>Assume a specific root-leaf search path has length
1198             m, and the search-target node has distance m'
1199             from the root. A red-black tree will require m + 1
1200             comparisons to find the required node; a splay tree will
1201             require 2 m' comparisons. A splay tree, consequently,
1202             can perform many more comparisons than a red-black tree.</p></li></ol></div><p>An ordered-vector tree (<code class="classname">tree</code>
1203           with <code class="classname">Tag</code> =  <code class="classname">ov_tree_tag</code>), a red-black
1204           tree (<code class="classname">tree</code>
1205           with <code class="classname">Tag</code>  = <code class="classname">rb_tree_tag</code>), and the
1206           native red-black tree all share approximately the same
1207           performance.</p><p>An ordered-vector tree is slightly slower than red-black
1208           trees, since it requires, in order to find a key, more math
1209           operations than they do. Conversely, an ordered-vector tree
1210           requires far lower space than the others. ([austern00noset], however,
1211           seems to have an implementation that is also faster than a
1212           red-black tree).</p><p>A PATRICIA trie (<code class="classname">trie</code>
1213           with <code class="classname">Tag</code> = <code class="classname">pat_trie_tag</code>) has good
1214           look-up performance, due to its large fan-out in this case. In
1215           this setting, a PATRICIA trie has look-up performance comparable
1216           to a hash table (see Hash-Based Text
1217           <code class="classname">find</code> Timing Test), but it is order
1218           preserving. This is not that surprising, since a large-fan-out
1219           PATRICIA trie works like a hash table with collisions resolved
1220           by a sub-trie. A large-fan-out PATRICIA trie does not do well on
1221           modifications (see Tree-Based and Trie-Based
1222           Text Insert Timing Test). Therefore, it is possibly beneficial in
1223           semi-static settings.</p></div></div><div class="section" title="Text find with Locality-of-Reference"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.text_lor_find"/>
1224           Text <code class="function">find</code> with Locality-of-Reference
1225         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_lor_find.info"/>
1226             Description
1227           </h6></div></div></div><p>This test inserts a number of values with keys from an
1228           arbitrary text ([ wickland96thirty ]) into
1229           a container, then performs a series of finds using
1230           <code class="function">find</code>. It is different than Tree-Based and
1231           Trie-Based Text <code class="function">find</code> Find Timing Test in the
1232           sequence of finds it performs: this test performs multiple
1233           <code class="function">find</code>s on the same key before moving on to the next
1234           key. It measures the average time for <code class="function">find</code> as a
1235           function of the number of values inserted.</p><p>
1236             It uses the test file:
1237             <code class="filename">
1238               performance/ext/pb_ds/tree_text_lor_find_timing.cc
1239             </code>
1240           </p><p>The test checks the effect of different underlying
1241           data structures in a locality-of-reference setting.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_lor_find.results"/>
1242             Results
1243           </h6></div></div></div><p>The graphic immediately below shows the results for the
1244           native tree type and several other tree types.
1245           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_lor_find.png" style="text-align: middle"/></div></div><p>
1246             The abbreviated names in the legend of the graphic above are
1247             instantiated with the types in the following table.
1248           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1249                     n_map
1250                   </td></tr><tr><td style="text-align: left">
1251                     <code class="classname">std::map</code>
1252                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1253                     splay_tree_map
1254                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1255                     <code class="classname">tree</code>
1256                   </td><td style="text-align: left">
1257                     <code class="classname">Tag</code>
1258                   </td><td style="text-align: left">
1259                     <code class="classname">splay_tree_tag</code>
1260                   </td></tr><tr><td style="text-align: left">
1261                     <code class="classname">Node_Update</code>
1262                   </td><td style="text-align: left">
1263                     <code class="classname">null_node_update</code>
1264                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1265                     rb_tree_map
1266                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1267                     <code class="classname">tree</code>
1268                   </td><td style="text-align: left">
1269                     <code class="classname">Tag</code>
1270                   </td><td style="text-align: left">
1271                     <code class="classname">rb_tree_tag</code>
1272                   </td></tr><tr><td style="text-align: left">
1273                     <code class="classname">Node_Update</code>
1274                   </td><td style="text-align: left">
1275                     <code class="classname">null_node_update</code>
1276                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1277                     ov_tree_map
1278                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1279                     <code class="classname">tree</code>
1280                   </td><td style="text-align: left">
1281                     <code class="classname">Tag</code>
1282                   </td><td style="text-align: left">
1283                     <code class="classname">ov_tree_tag</code>
1284                   </td></tr><tr><td style="text-align: left">
1285                     <code class="classname">Node_Update</code>
1286                   </td><td style="text-align: left">
1287                     <code class="classname">null_node_update</code>
1288                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1289                     pat_trie_map
1290                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1291                     <code class="classname">tree</code>
1292                   </td><td style="text-align: left">
1293                     <code class="classname">Tag</code>
1294                   </td><td style="text-align: left">
1295                     <code class="classname">pat_trie_tag</code>
1296                   </td></tr><tr><td style="text-align: left">
1297                     <code class="classname">Node_Update</code>
1298                   </td><td style="text-align: left">
1299                     <code class="classname">null_node_update</code>
1300                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_lor_find.observations"/>
1301             Observations
1302           </h6></div></div></div><p>For this setting, an ordered-vector tree
1303           (<code class="classname">tree</code> with <code class="classname">Tag</code>
1304           = <code class="classname">ov_tree_tag</code>), a red-black tree
1305           (<code class="classname">tree</code> with <code class="classname">Tag</code>
1306           = <code class="classname">rb_tree_tag</code>), and the native red-black
1307           tree all share approximately the same performance.</p><p>A splay tree (<code class="classname">tree</code>
1308           with <code class="classname">Tag</code> = <code class="classname">splay_tree_tag</code>) does
1309           much better, since each (successful) find "bubbles" the
1310           corresponding node to the root of the tree.</p></div></div><div class="section" title="split and join"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.split_join"/>
1311           <code class="function">split</code> and <code class="function">join</code>
1312         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.split_join.info"/>
1313             Description
1314           </h6></div></div></div><p>This test a container, inserts into a number of values, splits
1315           the container at the median, and joins the two containers. (If the
1316           containers are one of this library's trees,
1317           it splits and joins with the <code class="function">split</code> and
1318           <code class="function">join</code> method; otherwise, it uses the <code class="function">erase</code> and
1319           <code class="function">insert</code> methods.) It measures the time for splitting
1320           and joining the containers as a function of the number of
1321           values inserted.</p><p>
1322             It uses the test file:
1323             <code class="filename">
1324               performance/ext/pb_ds/tree_split_join_timing.cc
1325             </code>
1326           </p><p>The test checks the performance difference of <code class="function">join</code>
1327           as opposed to a sequence of <code class="function">insert</code> operations; by
1328           implication, this test checks the most efficient way to erase a
1329           sub-sequence from a tree-like-based container, since this can
1330           always be performed by a small sequence of splits and joins.
1331           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.split_join.results"/>
1332             Results
1333           </h6></div></div></div><p>The graphic immediately below shows the results for the
1334           native tree type and several other tree types.
1335           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_split_join.png" style="text-align: middle"/></div></div><p>
1336             The abbreviated names in the legend of the graphic above are
1337             instantiated with the types in the following table.
1338           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1339                     n_set
1340                   </td></tr><tr><td style="text-align: left">
1341                     <code class="classname">std::set</code>
1342                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1343                     splay_tree_set
1344                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1345                     <code class="classname">tree</code>
1346                   </td><td style="text-align: left">
1347                     <code class="classname">Tag</code>
1348                   </td><td style="text-align: left">
1349                     <code class="classname">splay_tree_tag</code>
1350                   </td></tr><tr><td style="text-align: left">
1351                     <code class="classname">Node_Update</code>
1352                   </td><td style="text-align: left">
1353                     <code class="classname">null_node_update</code>
1354                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1355                     rb_tree_set
1356                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1357                     <code class="classname">tree</code>
1358                   </td><td style="text-align: left">
1359                     <code class="classname">Tag</code>
1360                   </td><td style="text-align: left">
1361                     <code class="classname">rb_tree_tag</code>
1362                   </td></tr><tr><td style="text-align: left">
1363                     <code class="classname">Node_Update</code>
1364                   </td><td style="text-align: left">
1365                     <code class="classname">null_node_update</code>
1366                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1367                     ov_tree_set
1368                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1369                     <code class="classname">tree</code>
1370                   </td><td style="text-align: left">
1371                     <code class="classname">Tag</code>
1372                   </td><td style="text-align: left">
1373                     <code class="classname">ov_tree_tag</code>
1374                   </td></tr><tr><td style="text-align: left">
1375                     <code class="classname">Node_Update</code>
1376                   </td><td style="text-align: left">
1377                     <code class="classname">null_node_update</code>
1378                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1379                     pat_trie_map
1380                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1381                     <code class="classname">tree</code>
1382                   </td><td style="text-align: left">
1383                     <code class="classname">Tag</code>
1384                   </td><td style="text-align: left">
1385                     <code class="classname">pat_trie_tag</code>
1386                   </td></tr><tr><td style="text-align: left">
1387                     <code class="classname">Node_Update</code>
1388                   </td><td style="text-align: left">
1389                     <code class="classname">null_node_update</code>
1390                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.split_join.observations"/>
1391             Observations
1392           </h6></div></div></div><p>In this test, the native red-black trees must be split and
1393           joined externally, through a sequence of <code class="function">erase</code> and
1394           <code class="function">insert</code> operations. This is clearly
1395           super-linear, and it is not that surprising that the cost is
1396           high.</p><p>This library's tree-based containers use in this test the
1397           <code class="function">split</code> and <code class="function">join</code> methods,
1398           which have lower complexity: the <code class="function">join</code> method
1399           of a splay tree (<code class="classname">tree</code>
1400           with <code class="classname">Tag </code>
1401           = <code class="classname">splay_tree_tag</code>) is quadratic in the
1402           length of the longest root-leaf path, and linear in the total
1403           number of elements; the <code class="function">join</code> method of a
1404           red-black tree (<code class="classname">tree</code>
1405           with <code class="classname">Tag </code>
1406           = <code class="classname">rb_tree_tag</code>) or an ordered-vector tree
1407           (<code class="classname">tree</code> with <code class="classname">Tag </code>
1408           = <code class="classname">ov_tree_tag</code>) is linear in the number of
1409           elements.</p><p>Asides from orders of growth, this library's trees access their
1410           allocator very little in these operations, and some of them do not
1411           access it at all. This leads to lower constants in their
1412           complexity, and, for some containers, to exception-free splits and
1413           joins (which can be determined
1414           via <code class="classname">container_traits</code>).</p><p>It is important to note that <code class="function">split</code> and
1415           <code class="function">join</code> are not esoteric methods - they are the most
1416           efficient means of erasing a contiguous range of values from a
1417           tree based container.</p></div></div><div class="section" title="Order-Statistics"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.order_statistics"/>
1418           Order-Statistics
1419         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.order_statistics.info"/>
1420             Description
1421           </h6></div></div></div><p>This test creates a container, inserts random integers into the
1422           the container, and then checks the order-statistics of the
1423           container's values. (If the container is one of this
1424           library's trees, it does this with
1425           the <code class="function">order_of_key</code> method of
1426           <code class="classname">tree_order_statistics_node_update</code>
1427           ; otherwise, it uses the <code class="function">find</code> method and
1428           <code class="function">std::distance</code>.) It measures the average
1429           time for such queries as a function of the number of values
1430           inserted.</p><p>
1431             It uses the test file:
1432             <code class="filename">
1433               performance/ext/pb_ds/tree_order_statistics_timing.cc
1434             </code>
1435           </p><p>The test checks the performance difference of policies based
1436           on node-invariant as opposed to a external functions.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.order_statistics.results"/>
1437             Results
1438           </h6></div></div></div><p>The graphic immediately below shows the results for the
1439           native tree type and several other tree types.
1440           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_order_statistics.png" style="text-align: middle"/></div></div><p>
1441             The abbreviated names in the legend of the graphic above are
1442             instantiated with the types in the following table.
1443           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1444                     n_set
1445                   </td></tr><tr><td style="text-align: left">
1446                     <code class="classname">std::set</code>
1447                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1448                     splay_tree_ost_set
1449                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1450                     <code class="classname">tree</code>
1451                   </td><td style="text-align: left">
1452                     <code class="classname">Tag</code>
1453                   </td><td style="text-align: left">
1454                     <code class="classname">splay_tree_tag</code>
1455                   </td></tr><tr><td style="text-align: left">
1456                     <code class="classname">Node_Update</code>
1457                   </td><td style="text-align: left">
1458                     <code class="classname">tree_order_statistics_node_update</code>
1459                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
1460                     rb_tree_ost_set
1461                   </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1462                     <code class="classname">tree</code>
1463                   </td><td style="text-align: left">
1464                     <code class="classname">Tag</code>
1465                   </td><td style="text-align: left">
1466                     <code class="classname">rb_tree_tag</code>
1467                   </td></tr><tr><td style="text-align: left">
1468                     <code class="classname">Node_Update</code>
1469                   </td><td style="text-align: left">
1470                     <code class="classname">tree_order_statistics_node_update</code>
1471                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.order_statistics.observations"/>
1472             Observations
1473           </h6></div></div></div><p>In this test, the native red-black tree can support
1474           order-statistics queries only externally, by performing a
1475           <code class="classname">find</code> (alternatively, <code class="classname">lower_bound</code> or
1476           <code class="classname">upper_bound</code> ) and then using <code class="classname">std::distance</code> .
1477           This is clearly linear, and it is not that surprising that the
1478           cost is high.</p><p>This library's tree-based containers use in this test the
1479           <code class="classname">order_of_key</code> method of <code class="classname">tree_order_statistics_node_update</code>.
1480           This method has only linear complexity in the length of the
1481           root-node path. Unfortunately, the average path of a splay tree
1482           (<code class="classname">tree</code>
1483           with <code class="classname">Tag =</code> <code class="classname">splay_tree_tag</code> ) can
1484           be higher than logarithmic; the longest path of a red-black
1485           tree (<code class="classname">tree</code>
1486           with <code class="classname">Tag =</code> <code class="classname">rb_tree_tag</code> ) is
1487           logarithmic in the number of elements. Consequently, the splay
1488           tree has worse performance than the red-black tree.</p></div></div></div><div class="section" title="Multimap"><div class="titlepage"><div><div><h4 class="title"><a id="performance.multimap"/>Multimap</h4></div></div></div><p/><div class="section" title="Text find with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_find_small"/>
1489           Text <code class="function">find</code> with Small Secondary-to-Primary Key Ratios 
1490         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_small.info"/>
1491             Description
1492           </h6></div></div></div><p>This test inserts a number of pairs into a container. The
1493           first item of each pair is a string from an arbitrary text
1494           [wickland96thirty], and
1495           the second is a uniform i.i.d.integer. The container is a
1496           "multimap" - it considers the first member of each pair as a
1497           primary key, and the second member of each pair as a secondary
1498           key (see Motivation::Associative
1499           Containers::Alternative to Multiple Equivalent Keys). There
1500           are 400 distinct primary keys, and the ratio of secondary keys
1501           to primary keys ranges from 1 to 5.</p><p>The test measures the average find-time as a function of the
1502           number of values inserted. For this library's containers, it
1503           finds the secondary key from a container obtained from finding
1504           a primary key. For the native multimaps, it searches a range
1505           obtained using <code class="classname">std::equal_range</code> on a primary key.</p><p>
1506             It uses the test file:
1507             <code class="filename">
1508               performance/ext/pb_ds/multimap_text_find_timing_small.cc
1509             </code>
1510           </p><p>The test checks the find-time scalability of different
1511           "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_small.results"/>
1512             Results
1513           </h6></div></div></div><p>The graphic below show the results for "multimaps" which
1514           use a tree-based container for primary keys.
1515           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_small_s2p_tree.png" style="text-align: middle"/></div></div><p>
1516             The abbreviated names in the legend of the graphic above are
1517             instantiated with the types in the following table.
1518           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1519                     n_mmap
1520                   </td></tr><tr><td style="text-align: left">
1521                     <code class="classname">std::multimap</code>
1522                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1523                     rb_tree_mmap_lu_mtf_set
1524                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1525                     <code class="classname">tree</code>
1526                   </td><td style="text-align: left">
1527                     <code class="classname">Tag</code>
1528                   </td><td style="text-align: left">
1529                     <code class="classname">rb_tree_tag</code>
1530                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1531                     <code class="classname">Node_Update</code>
1532                   </td><td style="text-align: left">
1533                     <code class="classname">null_node_update</code>
1534                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1535                     <code class="classname">Mapped</code>
1536                   </td><td style="text-align: left">
1537                     <code class="classname">list_update</code>
1538                   </td><td style="text-align: left">
1539                     <code class="classname">Update_Policy</code>
1540                   </td><td style="text-align: left">
1541                     <code class="classname">lu_move_to_front_policy</code>
1542                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1543                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
1544                   </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
1545                     <code class="classname">tree</code>
1546                   </td><td style="text-align: left">
1547                     <code class="classname">Tag</code>
1548                   </td><td style="text-align: left">
1549                     <code class="classname">rb_tree_tag</code>
1550                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1551                     <code class="classname">Node_Update</code>
1552                   </td><td style="text-align: left">
1553                     <code class="classname">null_node_update</code>
1554                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1555                     <code class="classname">Mapped</code>
1556                   </td><td rowspan="3" style="text-align: left" valign="top">
1557                     <code class="classname">cc_hash_table</code>
1558                   </td><td style="text-align: left">
1559                     <code class="classname">Comb_Hash_Fn</code>
1560                   </td><td style="text-align: left">
1561                     <code class="classname">direct_mask_range_hashing</code>
1562                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1563                     <code class="classname">Resize_Policy</code>
1564                   </td><td rowspan="2" style="text-align: left" valign="top">
1565                     <code class="classname">hash_standard_resize_policy</code>
1566                   </td><td style="text-align: left">
1567                     <code class="classname">Size_Policy</code>
1568                   </td><td style="text-align: left">
1569                     <code class="classname">hash_exponential_size_policy</code>
1570                   </td></tr><tr><td style="text-align: left" valign="top">
1571                     <code class="classname">Trigger_Policy</code>
1572                   </td><td style="text-align: left">
1573                     <code class="classname">hash_load_check_resize_trigger</code> with
1574                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1575                   </td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
1576           use a hash-based container for primary keys.
1577           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_small_s2p_hash.png" style="text-align: middle"/></div></div><p>
1578             The abbreviated names in the legend of the graphic above are
1579             instantiated with the types in the following table.
1580           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1581                     n_hash_mmap
1582                   </td></tr><tr><td style="text-align: left">
1583                     <code class="classname">std::tr1::unordered_multimap</code>
1584                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1585                     rb_tree_mmap_lu_mtf_set
1586                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
1587                     <code class="classname">
1588                       cc_hash_table
1589                     </code>
1590                   </td><td style="text-align: left">
1591                     <code class="classname">Comb_Hash_Fn</code>
1592                   </td><td style="text-align: left">
1593                     <code class="classname">direct_mask_range_hashing</code>
1594                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1595                     <code class="classname">Resize_Policy</code>
1596                   </td><td rowspan="2" style="text-align: left" valign="top">
1597                     <code class="classname">hash_standard_resize_policy</code>
1598                   </td><td style="text-align: left">
1599                     <code class="classname">Size_Policy</code>
1600                   </td><td style="text-align: left">
1601                     <code class="classname">hash_exponential_size_policy</code>
1602                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
1603                     <code class="classname">Trigger_Policy</code>
1604                   </td><td style="text-align: left">
1605                     <code class="classname">hash_load_check_resize_trigger</code> with
1606                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1607                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1608                     <code class="classname">Mapped</code>
1609                   </td><td style="text-align: left">
1610                     <code class="classname">list_update</code>
1611                   </td><td style="text-align: left">
1612                     <code class="classname">Update_Policy</code>
1613                   </td><td style="text-align: left">
1614                     <code class="classname">lu_move_to_front_policy</code>
1615                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1616                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
1617                   </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
1618                     <code class="classname">
1619                       cc_hash_table
1620                     </code>
1621                   </td><td style="text-align: left">
1622                     <code class="classname">Comb_Hash_Fn</code>
1623                   </td><td style="text-align: left">
1624                     <code class="classname">direct_mask_range_hashing</code>
1625                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1626                     <code class="classname">Resize_Policy</code>
1627                   </td><td rowspan="2" style="text-align: left" valign="top">
1628                     <code class="classname">hash_standard_resize_policy</code>
1629                   </td><td style="text-align: left">
1630                     <code class="classname">Size_Policy</code>
1631                   </td><td style="text-align: left">
1632                     <code class="classname">hash_exponential_size_policy</code>
1633                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
1634                     <code class="classname">Trigger_Policy</code>
1635                   </td><td style="text-align: left">
1636                     <code class="classname">hash_load_check_resize_trigger</code> with
1637                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1638                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1639                     <code class="classname">Mapped</code>
1640                   </td><td rowspan="3" style="text-align: left" valign="top">
1641                     <code class="classname">cc_hash_table</code>
1642                   </td><td style="text-align: left">
1643                     <code class="classname">Comb_Hash_Fn</code>
1644                   </td><td style="text-align: left">
1645                     <code class="classname">direct_mask_range_hashing</code>
1646                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1647                     <code class="classname">Resize_Policy</code>
1648                   </td><td rowspan="2" style="text-align: left" valign="top">
1649                     <code class="classname">hash_standard_resize_policy</code>
1650                   </td><td style="text-align: left">
1651                     <code class="classname">Size_Policy</code>
1652                   </td><td style="text-align: left">
1653                     <code class="classname">hash_exponential_size_policy</code>
1654                   </td></tr><tr><td style="text-align: left" valign="top">
1655                     <code class="classname">Trigger_Policy</code>
1656                   </td><td style="text-align: left">
1657                     <code class="classname">hash_load_check_resize_trigger</code> with
1658                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1659                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_small.observations"/>
1660             Observations
1661           </h6></div></div></div><p>See Observations::Mapping-Semantics
1662           Considerations.</p></div></div><div class="section" title="Text find with Large Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_find_large"/>
1663           Text <code class="function">find</code> with Large Secondary-to-Primary Key Ratios 
1664         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_large.info"/>
1665             Description
1666           </h6></div></div></div><p>This test inserts a number of pairs into a container. The
1667           first item of each pair is a string from an arbitrary text
1668           [wickland96thirty], and
1669           the second is a uniform integer. The container is a
1670           "multimap" - it considers the first member of each pair as a
1671           primary key, and the second member of each pair as a secondary
1672           key. There
1673           are 400 distinct primary keys, and the ratio of secondary keys
1674           to primary keys ranges from 1 to 5.</p><p>The test measures the average find-time as a function of the
1675           number of values inserted. For this library's containers, it
1676           finds the secondary key from a container obtained from finding
1677           a primary key. For the native multimaps, it searches a range
1678           obtained using <code class="classname">std::equal_range</code> on a primary key.</p><p>
1679             It uses the test file:
1680             <code class="filename">
1681               performance/ext/pb_ds/multimap_text_find_timing_large.cc
1682             </code>
1683           </p><p>The test checks the find-time scalability of different
1684           "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_large.results"/>
1685             Results
1686           </h6></div></div></div><p>The graphic below show the results for "multimaps" which
1687           use a tree-based container for primary keys.
1688           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_tree.png" style="text-align: middle"/></div></div><p>
1689             The abbreviated names in the legend of the graphic above are
1690             instantiated with the types in the following table.
1691           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1692                     n_mmap
1693                   </td></tr><tr><td style="text-align: left">
1694                     <code class="classname">std::multimap</code>
1695                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1696                     rb_tree_mmap_lu_mtf_set
1697                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1698                     <code class="classname">tree</code>
1699                   </td><td style="text-align: left">
1700                     <code class="classname">Tag</code>
1701                   </td><td style="text-align: left">
1702                     <code class="classname">rb_tree_tag</code>
1703                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1704                     <code class="classname">Node_Update</code>
1705                   </td><td style="text-align: left">
1706                     <code class="classname">null_node_update</code>
1707                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1708                     <code class="classname">Mapped</code>
1709                   </td><td style="text-align: left">
1710                     <code class="classname">list_update</code>
1711                   </td><td style="text-align: left">
1712                     <code class="classname">Update_Policy</code>
1713                   </td><td style="text-align: left">
1714                     <code class="classname">lu_move_to_front_policy</code>
1715                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1716                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
1717                   </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
1718                     <code class="classname">tree</code>
1719                   </td><td style="text-align: left">
1720                     <code class="classname">Tag</code>
1721                   </td><td style="text-align: left">
1722                     <code class="classname">rb_tree_tag</code>
1723                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1724                     <code class="classname">Node_Update</code>
1725                   </td><td style="text-align: left">
1726                     <code class="classname">null_node_update</code>
1727                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1728                     <code class="classname">Mapped</code>
1729                   </td><td rowspan="3" style="text-align: left" valign="top">
1730                     <code class="classname">cc_hash_table</code>
1731                   </td><td style="text-align: left">
1732                     <code class="classname">Comb_Hash_Fn</code>
1733                   </td><td style="text-align: left">
1734                     <code class="classname">direct_mask_range_hashing</code>
1735                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1736                     <code class="classname">Resize_Policy</code>
1737                   </td><td rowspan="2" style="text-align: left" valign="top">
1738                     <code class="classname">hash_standard_resize_policy</code>
1739                   </td><td style="text-align: left">
1740                     <code class="classname">Size_Policy</code>
1741                   </td><td style="text-align: left">
1742                     <code class="classname">hash_exponential_size_policy</code>
1743                   </td></tr><tr><td style="text-align: left" valign="top">
1744                     <code class="classname">Trigger_Policy</code>
1745                   </td><td style="text-align: left">
1746                     <code class="classname">hash_load_check_resize_trigger</code> with
1747                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1748                   </td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
1749           use a hash-based container for primary keys.
1750           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
1751             The abbreviated names in the legend of the graphic above are
1752             instantiated with the types in the following table.
1753           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1754                     n_hash_mmap
1755                   </td></tr><tr><td style="text-align: left">
1756                     <code class="classname">std::tr1::unordered_multimap</code>
1757                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1758                     rb_tree_mmap_lu_mtf_set
1759                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
1760                     <code class="classname">
1761                       cc_hash_table
1762                     </code>
1763                   </td><td style="text-align: left">
1764                     <code class="classname">Comb_Hash_Fn</code>
1765                   </td><td style="text-align: left">
1766                     <code class="classname">direct_mask_range_hashing</code>
1767                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1768                     <code class="classname">Resize_Policy</code>
1769                   </td><td rowspan="2" style="text-align: left" valign="top">
1770                     <code class="classname">hash_standard_resize_policy</code>
1771                   </td><td style="text-align: left">
1772                     <code class="classname">Size_Policy</code>
1773                   </td><td style="text-align: left">
1774                     <code class="classname">hash_exponential_size_policy</code>
1775                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
1776                     <code class="classname">Trigger_Policy</code>
1777                   </td><td style="text-align: left">
1778                     <code class="classname">hash_load_check_resize_trigger</code> with
1779                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1780                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1781                     <code class="classname">Mapped</code>
1782                   </td><td style="text-align: left">
1783                     <code class="classname">list_update</code>
1784                   </td><td style="text-align: left">
1785                     <code class="classname">Update_Policy</code>
1786                   </td><td style="text-align: left">
1787                     <code class="classname">lu_move_to_front_policy</code>
1788                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1789                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
1790                   </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
1791                     <code class="classname">
1792                       cc_hash_table
1793                     </code>
1794                   </td><td style="text-align: left">
1795                     <code class="classname">Comb_Hash_Fn</code>
1796                   </td><td style="text-align: left">
1797                     <code class="classname">direct_mask_range_hashing</code>
1798                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1799                     <code class="classname">Resize_Policy</code>
1800                   </td><td rowspan="2" style="text-align: left" valign="top">
1801                     <code class="classname">hash_standard_resize_policy</code>
1802                   </td><td style="text-align: left">
1803                     <code class="classname">Size_Policy</code>
1804                   </td><td style="text-align: left">
1805                     <code class="classname">hash_exponential_size_policy</code>
1806                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
1807                     <code class="classname">Trigger_Policy</code>
1808                   </td><td style="text-align: left">
1809                     <code class="classname">hash_load_check_resize_trigger</code> with
1810                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1811                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1812                     <code class="classname">Mapped</code>
1813                   </td><td rowspan="3" style="text-align: left" valign="top">
1814                     <code class="classname">cc_hash_table</code>
1815                   </td><td style="text-align: left">
1816                     <code class="classname">Comb_Hash_Fn</code>
1817                   </td><td style="text-align: left">
1818                     <code class="classname">direct_mask_range_hashing</code>
1819                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1820                     <code class="classname">Resize_Policy</code>
1821                   </td><td rowspan="2" style="text-align: left" valign="top">
1822                     <code class="classname">hash_standard_resize_policy</code>
1823                   </td><td style="text-align: left">
1824                     <code class="classname">Size_Policy</code>
1825                   </td><td style="text-align: left">
1826                     <code class="classname">hash_exponential_size_policy</code>
1827                   </td></tr><tr><td style="text-align: left" valign="top">
1828                     <code class="classname">Trigger_Policy</code>
1829                   </td><td style="text-align: left">
1830                     <code class="classname">hash_load_check_resize_trigger</code> with
1831                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1832                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_large.observations"/>
1833             Observations
1834           </h6></div></div></div><p>See Observations::Mapping-Semantics
1835           Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_small"/>
1836           Text <code class="function">insert</code> with Small
1837           Secondary-to-Primary Key Ratios
1838         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_small.info"/>
1839             Description
1840           </h6></div></div></div><p>This test inserts a number of pairs into a container. The
1841           first item of each pair is a string from an arbitrary text
1842           [wickland96thirty], and
1843           the second is a uniform integer. The container is a
1844           "multimap" - it considers the first member of each pair as a
1845           primary key, and the second member of each pair as a secondary
1846           key. There
1847           are 400 distinct primary keys, and the ratio of secondary keys
1848           to primary keys ranges from 1 to 5.</p><p>The test measures the average insert-time as a function of
1849           the number of values inserted. For this library's containers,
1850           it inserts a primary key into the primary associative
1851           container, then a secondary key into the secondary associative
1852           container. For the native multimaps, it obtains a range using
1853           <code class="classname">std::equal_range</code>, and inserts a value only if it was
1854           not contained already.</p><p>
1855             It uses the test file:
1856             <code class="filename">
1857               performance/ext/pb_ds/multimap_text_insert_timing_small.cc
1858             </code>
1859           </p><p>The test checks the insert-time scalability of different
1860           "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_small.results"/>
1861             Results
1862           </h6></div></div></div><p>The graphic below show the results for "multimaps" which
1863           use a tree-based container for primary keys.
1864           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_small_s2p_tree.png" style="text-align: middle"/></div></div><p>
1865             The abbreviated names in the legend of the graphic above are
1866             instantiated with the types in the following table.
1867           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1868                     n_mmap
1869                   </td></tr><tr><td style="text-align: left">
1870                     <code class="classname">std::multimap</code>
1871                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1872                     rb_tree_mmap_lu_mtf_set
1873                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1874                     <code class="classname">tree</code>
1875                   </td><td style="text-align: left">
1876                     <code class="classname">Tag</code>
1877                   </td><td style="text-align: left">
1878                     <code class="classname">rb_tree_tag</code>
1879                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1880                     <code class="classname">Node_Update</code>
1881                   </td><td style="text-align: left">
1882                     <code class="classname">null_node_update</code>
1883                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1884                     <code class="classname">Mapped</code>
1885                   </td><td style="text-align: left">
1886                     <code class="classname">list_update</code>
1887                   </td><td style="text-align: left">
1888                     <code class="classname">Update_Policy</code>
1889                   </td><td style="text-align: left">
1890                     <code class="classname">lu_move_to_front_policy</code>
1891                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1892                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
1893                   </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
1894                     <code class="classname">tree</code>
1895                   </td><td style="text-align: left">
1896                     <code class="classname">Tag</code>
1897                   </td><td style="text-align: left">
1898                     <code class="classname">rb_tree_tag</code>
1899                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1900                     <code class="classname">Node_Update</code>
1901                   </td><td style="text-align: left">
1902                     <code class="classname">null_node_update</code>
1903                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1904                     <code class="classname">Mapped</code>
1905                   </td><td rowspan="3" style="text-align: left" valign="top">
1906                     <code class="classname">cc_hash_table</code>
1907                   </td><td style="text-align: left">
1908                     <code class="classname">Comb_Hash_Fn</code>
1909                   </td><td style="text-align: left">
1910                     <code class="classname">direct_mask_range_hashing</code>
1911                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1912                     <code class="classname">Resize_Policy</code>
1913                   </td><td rowspan="2" style="text-align: left" valign="top">
1914                     <code class="classname">hash_standard_resize_policy</code>
1915                   </td><td style="text-align: left">
1916                     <code class="classname">Size_Policy</code>
1917                   </td><td style="text-align: left">
1918                     <code class="classname">hash_exponential_size_policy</code>
1919                   </td></tr><tr><td style="text-align: left" valign="top">
1920                     <code class="classname">Trigger_Policy</code>
1921                   </td><td style="text-align: left">
1922                     <code class="classname">hash_load_check_resize_trigger</code> with
1923                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1924                   </td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
1925           use a hash-based container for primary keys.
1926           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_small_s2p_hash.png" style="text-align: middle"/></div></div><p>
1927             The abbreviated names in the legend of the graphic above are
1928             instantiated with the types in the following table.
1929           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1930                     n_hash_mmap
1931                   </td></tr><tr><td style="text-align: left">
1932                     <code class="classname">std::tr1::unordered_multimap</code>
1933                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1934                     rb_tree_mmap_lu_mtf_set
1935                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
1936                     <code class="classname">
1937                       cc_hash_table
1938                     </code>
1939                   </td><td style="text-align: left">
1940                     <code class="classname">Comb_Hash_Fn</code>
1941                   </td><td style="text-align: left">
1942                     <code class="classname">direct_mask_range_hashing</code>
1943                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1944                     <code class="classname">Resize_Policy</code>
1945                   </td><td rowspan="2" style="text-align: left" valign="top">
1946                     <code class="classname">hash_standard_resize_policy</code>
1947                   </td><td style="text-align: left">
1948                     <code class="classname">Size_Policy</code>
1949                   </td><td style="text-align: left">
1950                     <code class="classname">hash_exponential_size_policy</code>
1951                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
1952                     <code class="classname">Trigger_Policy</code>
1953                   </td><td style="text-align: left">
1954                     <code class="classname">hash_load_check_resize_trigger</code> with
1955                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1956                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
1957                     <code class="classname">Mapped</code>
1958                   </td><td style="text-align: left">
1959                     <code class="classname">list_update</code>
1960                   </td><td style="text-align: left">
1961                     <code class="classname">Update_Policy</code>
1962                   </td><td style="text-align: left">
1963                     <code class="classname">lu_move_to_front_policy</code>
1964                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
1965                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
1966                   </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
1967                     <code class="classname">
1968                       cc_hash_table
1969                     </code>
1970                   </td><td style="text-align: left">
1971                     <code class="classname">Comb_Hash_Fn</code>
1972                   </td><td style="text-align: left">
1973                     <code class="classname">direct_mask_range_hashing</code>
1974                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1975                     <code class="classname">Resize_Policy</code>
1976                   </td><td rowspan="2" style="text-align: left" valign="top">
1977                     <code class="classname">hash_standard_resize_policy</code>
1978                   </td><td style="text-align: left">
1979                     <code class="classname">Size_Policy</code>
1980                   </td><td style="text-align: left">
1981                     <code class="classname">hash_exponential_size_policy</code>
1982                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
1983                     <code class="classname">Trigger_Policy</code>
1984                   </td><td style="text-align: left">
1985                     <code class="classname">hash_load_check_resize_trigger</code> with
1986                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
1987                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
1988                     <code class="classname">Mapped</code>
1989                   </td><td rowspan="3" style="text-align: left" valign="top">
1990                     <code class="classname">cc_hash_table</code>
1991                   </td><td style="text-align: left">
1992                     <code class="classname">Comb_Hash_Fn</code>
1993                   </td><td style="text-align: left">
1994                     <code class="classname">direct_mask_range_hashing</code>
1995                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
1996                     <code class="classname">Resize_Policy</code>
1997                   </td><td rowspan="2" style="text-align: left" valign="top">
1998                     <code class="classname">hash_standard_resize_policy</code>
1999                   </td><td style="text-align: left">
2000                     <code class="classname">Size_Policy</code>
2001                   </td><td style="text-align: left">
2002                     <code class="classname">hash_exponential_size_policy</code>
2003                   </td></tr><tr><td style="text-align: left" valign="top">
2004                     <code class="classname">Trigger_Policy</code>
2005                   </td><td style="text-align: left">
2006                     <code class="classname">hash_load_check_resize_trigger</code> with
2007                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2008                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_small.observations"/>
2009             Observations
2010           </h6></div></div></div><p>See Observations::Mapping-Semantics
2011           Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_large"/>
2012           Text <code class="function">insert</code> with Small
2013           Secondary-to-Primary Key Ratios
2014         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_large.info"/>
2015             Description
2016           </h6></div></div></div><p>This test inserts a number of pairs into a container. The
2017           first item of each pair is a string from an arbitrary text
2018           [wickland96thirty], and
2019           the second is a uniform integer. The container is a
2020           "multimap" - it considers the first member of each pair as a
2021           primary key, and the second member of each pair as a secondary
2022           key. There
2023           are 400 distinct primary keys, and the ratio of secondary keys
2024           to primary keys ranges from 1 to 5.</p><p>The test measures the average insert-time as a function of
2025           the number of values inserted. For this library's containers,
2026           it inserts a primary key into the primary associative
2027           container, then a secondary key into the secondary associative
2028           container. For the native multimaps, it obtains a range using
2029           <code class="classname">std::equal_range</code>, and inserts a value only if it was
2030           not contained already.</p><p>
2031             It uses the test file:
2032             <code class="filename">
2033               performance/ext/pb_ds/multimap_text_insert_timing_large.cc
2034             </code>
2035           </p><p>The test checks the insert-time scalability of different
2036           "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_large.results"/>
2037             Results
2038           </h6></div></div></div><p>The graphic below show the results for "multimaps" which
2039           use a tree-based container for primary keys.
2040           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_large_s2p_tree.png" style="text-align: middle"/></div></div><p>
2041             The abbreviated names in the legend of the graphic above are
2042             instantiated with the types in the following table.
2043           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2044                     n_mmap
2045                   </td></tr><tr><td style="text-align: left">
2046                     <code class="classname">std::multimap</code>
2047                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2048                     rb_tree_mmap_lu_mtf_set
2049                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2050                     <code class="classname">tree</code>
2051                   </td><td style="text-align: left">
2052                     <code class="classname">Tag</code>
2053                   </td><td style="text-align: left">
2054                     <code class="classname">rb_tree_tag</code>
2055                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2056                     <code class="classname">Node_Update</code>
2057                   </td><td style="text-align: left">
2058                     <code class="classname">null_node_update</code>
2059                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2060                     <code class="classname">Mapped</code>
2061                   </td><td style="text-align: left">
2062                     <code class="classname">list_update</code>
2063                   </td><td style="text-align: left">
2064                     <code class="classname">Update_Policy</code>
2065                   </td><td style="text-align: left">
2066                     <code class="classname">lu_move_to_front_policy</code>
2067                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2068                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
2069                   </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
2070                     <code class="classname">tree</code>
2071                   </td><td style="text-align: left">
2072                     <code class="classname">Tag</code>
2073                   </td><td style="text-align: left">
2074                     <code class="classname">rb_tree_tag</code>
2075                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2076                     <code class="classname">Node_Update</code>
2077                   </td><td style="text-align: left">
2078                     <code class="classname">null_node_update</code>
2079                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2080                     <code class="classname">Mapped</code>
2081                   </td><td rowspan="3" style="text-align: left" valign="top">
2082                     <code class="classname">cc_hash_table</code>
2083                   </td><td style="text-align: left">
2084                     <code class="classname">Comb_Hash_Fn</code>
2085                   </td><td style="text-align: left">
2086                     <code class="classname">direct_mask_range_hashing</code>
2087                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2088                     <code class="classname">Resize_Policy</code>
2089                   </td><td rowspan="2" style="text-align: left" valign="top">
2090                     <code class="classname">hash_standard_resize_policy</code>
2091                   </td><td style="text-align: left">
2092                     <code class="classname">Size_Policy</code>
2093                   </td><td style="text-align: left">
2094                     <code class="classname">hash_exponential_size_policy</code>
2095                   </td></tr><tr><td style="text-align: left" valign="top">
2096                     <code class="classname">Trigger_Policy</code>
2097                   </td><td style="text-align: left">
2098                     <code class="classname">hash_load_check_resize_trigger</code> with
2099                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2100                   </td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
2101           use a hash-based container for primary keys.
2102           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
2103             The abbreviated names in the legend of the graphic above are
2104             instantiated with the types in the following table.
2105           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2106                     n_hash_mmap
2107                   </td></tr><tr><td style="text-align: left">
2108                     <code class="classname">std::tr1::unordered_multimap</code>
2109                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2110                     rb_tree_mmap_lu_mtf_set
2111                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
2112                     <code class="classname">
2113                       cc_hash_table
2114                     </code>
2115                   </td><td style="text-align: left">
2116                     <code class="classname">Comb_Hash_Fn</code>
2117                   </td><td style="text-align: left">
2118                     <code class="classname">direct_mask_range_hashing</code>
2119                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2120                     <code class="classname">Resize_Policy</code>
2121                   </td><td rowspan="2" style="text-align: left" valign="top">
2122                     <code class="classname">hash_standard_resize_policy</code>
2123                   </td><td style="text-align: left">
2124                     <code class="classname">Size_Policy</code>
2125                   </td><td style="text-align: left">
2126                     <code class="classname">hash_exponential_size_policy</code>
2127                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
2128                     <code class="classname">Trigger_Policy</code>
2129                   </td><td style="text-align: left">
2130                     <code class="classname">hash_load_check_resize_trigger</code> with
2131                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2132                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2133                     <code class="classname">Mapped</code>
2134                   </td><td style="text-align: left">
2135                     <code class="classname">list_update</code>
2136                   </td><td style="text-align: left">
2137                     <code class="classname">Update_Policy</code>
2138                   </td><td style="text-align: left">
2139                     <code class="classname">lu_move_to_front_policy</code>
2140                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2141                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
2142                   </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
2143                     <code class="classname">
2144                       cc_hash_table
2145                     </code>
2146                   </td><td style="text-align: left">
2147                     <code class="classname">Comb_Hash_Fn</code>
2148                   </td><td style="text-align: left">
2149                     <code class="classname">direct_mask_range_hashing</code>
2150                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2151                     <code class="classname">Resize_Policy</code>
2152                   </td><td rowspan="2" style="text-align: left" valign="top">
2153                     <code class="classname">hash_standard_resize_policy</code>
2154                   </td><td style="text-align: left">
2155                     <code class="classname">Size_Policy</code>
2156                   </td><td style="text-align: left">
2157                     <code class="classname">hash_exponential_size_policy</code>
2158                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
2159                     <code class="classname">Trigger_Policy</code>
2160                   </td><td style="text-align: left">
2161                     <code class="classname">hash_load_check_resize_trigger</code> with
2162                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2163                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2164                     <code class="classname">Mapped</code>
2165                   </td><td rowspan="3" style="text-align: left" valign="top">
2166                     <code class="classname">cc_hash_table</code>
2167                   </td><td style="text-align: left">
2168                     <code class="classname">Comb_Hash_Fn</code>
2169                   </td><td style="text-align: left">
2170                     <code class="classname">direct_mask_range_hashing</code>
2171                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2172                     <code class="classname">Resize_Policy</code>
2173                   </td><td rowspan="2" style="text-align: left" valign="top">
2174                     <code class="classname">hash_standard_resize_policy</code>
2175                   </td><td style="text-align: left">
2176                     <code class="classname">Size_Policy</code>
2177                   </td><td style="text-align: left">
2178                     <code class="classname">hash_exponential_size_policy</code>
2179                   </td></tr><tr><td style="text-align: left" valign="top">
2180                     <code class="classname">Trigger_Policy</code>
2181                   </td><td style="text-align: left">
2182                     <code class="classname">hash_load_check_resize_trigger</code> with
2183                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2184                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_large.observations"/>
2185             Observations
2186           </h6></div></div></div><p>See Observations::Mapping-Semantics
2187           Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_mem_small"/>
2188           Text <code class="function">insert</code> with Small
2189           Secondary-to-Primary Key Ratios Memory Use
2190         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_small.info"/>
2191             Description
2192           </h6></div></div></div><p>This test inserts a number of pairs into a container. The
2193           first item of each pair is a string from an arbitrary text
2194           [wickland96thirty], and
2195           the second is a uniform integer. The container is a
2196           "multimap" - it considers the first member of each pair as a
2197           primary key, and the second member of each pair as a secondary
2198           key. There
2199           are 100 distinct primary keys, and the ratio of secondary keys
2200           to primary keys ranges to about 20.</p><p>The test measures the memory use as a function of the number
2201           of values inserted.</p><p>
2202             It uses the test file:
2203             <code class="filename">
2204               performance/ext/pb_ds/multimap_text_insert_mem_usage_small.cc
2205             </code>
2206           </p><p>The test checks the memory scalability of different
2207           "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_small.results"/>
2208             Results
2209           </h6></div></div></div><p>The graphic below show the results for "multimaps" which
2210           use a tree-based container for primary keys.
2211           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_mem_small_s2p_tree.png" style="text-align: middle"/></div></div><p>
2212             The abbreviated names in the legend of the graphic above are
2213             instantiated with the types in the following table.
2214           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2215                     n_mmap
2216                   </td></tr><tr><td style="text-align: left">
2217                     <code class="classname">std::multimap</code>
2218                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2219                     rb_tree_mmap_lu_mtf_set
2220                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2221                     <code class="classname">tree</code>
2222                   </td><td style="text-align: left">
2223                     <code class="classname">Tag</code>
2224                   </td><td style="text-align: left">
2225                     <code class="classname">rb_tree_tag</code>
2226                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2227                     <code class="classname">Node_Update</code>
2228                   </td><td style="text-align: left">
2229                     <code class="classname">null_node_update</code>
2230                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2231                     <code class="classname">Mapped</code>
2232                   </td><td style="text-align: left">
2233                     <code class="classname">list_update</code>
2234                   </td><td style="text-align: left">
2235                     <code class="classname">Update_Policy</code>
2236                   </td><td style="text-align: left">
2237                     <code class="classname">lu_move_to_front_policy</code>
2238                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2239                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
2240                   </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
2241                     <code class="classname">tree</code>
2242                   </td><td style="text-align: left">
2243                     <code class="classname">Tag</code>
2244                   </td><td style="text-align: left">
2245                     <code class="classname">rb_tree_tag</code>
2246                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2247                     <code class="classname">Node_Update</code>
2248                   </td><td style="text-align: left">
2249                     <code class="classname">null_node_update</code>
2250                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2251                     <code class="classname">Mapped</code>
2252                   </td><td rowspan="3" style="text-align: left" valign="top">
2253                     <code class="classname">cc_hash_table</code>
2254                   </td><td style="text-align: left">
2255                     <code class="classname">Comb_Hash_Fn</code>
2256                   </td><td style="text-align: left">
2257                     <code class="classname">direct_mask_range_hashing</code>
2258                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2259                     <code class="classname">Resize_Policy</code>
2260                   </td><td rowspan="2" style="text-align: left" valign="top">
2261                     <code class="classname">hash_standard_resize_policy</code>
2262                   </td><td style="text-align: left">
2263                     <code class="classname">Size_Policy</code>
2264                   </td><td style="text-align: left">
2265                     <code class="classname">hash_exponential_size_policy</code>
2266                   </td></tr><tr><td style="text-align: left" valign="top">
2267                     <code class="classname">Trigger_Policy</code>
2268                   </td><td style="text-align: left">
2269                     <code class="classname">hash_load_check_resize_trigger</code> with
2270                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2271                   </td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
2272           use a hash-based container for primary keys.
2273           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
2274             The abbreviated names in the legend of the graphic above are
2275             instantiated with the types in the following table.
2276           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2277                     n_hash_mmap
2278                   </td></tr><tr><td style="text-align: left">
2279                     <code class="classname">std::tr1::unordered_multimap</code>
2280                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2281                     rb_tree_mmap_lu_mtf_set
2282                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
2283                     <code class="classname">
2284                       cc_hash_table
2285                     </code>
2286                   </td><td style="text-align: left">
2287                     <code class="classname">Comb_Hash_Fn</code>
2288                   </td><td style="text-align: left">
2289                     <code class="classname">direct_mask_range_hashing</code>
2290                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2291                     <code class="classname">Resize_Policy</code>
2292                   </td><td rowspan="2" style="text-align: left" valign="top">
2293                     <code class="classname">hash_standard_resize_policy</code>
2294                   </td><td style="text-align: left">
2295                     <code class="classname">Size_Policy</code>
2296                   </td><td style="text-align: left">
2297                     <code class="classname">hash_exponential_size_policy</code>
2298                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
2299                     <code class="classname">Trigger_Policy</code>
2300                   </td><td style="text-align: left">
2301                     <code class="classname">hash_load_check_resize_trigger</code> with
2302                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2303                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2304                     <code class="classname">Mapped</code>
2305                   </td><td style="text-align: left">
2306                     <code class="classname">list_update</code>
2307                   </td><td style="text-align: left">
2308                     <code class="classname">Update_Policy</code>
2309                   </td><td style="text-align: left">
2310                     <code class="classname">lu_move_to_front_policy</code>
2311                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2312                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
2313                   </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
2314                     <code class="classname">
2315                       cc_hash_table
2316                     </code>
2317                   </td><td style="text-align: left">
2318                     <code class="classname">Comb_Hash_Fn</code>
2319                   </td><td style="text-align: left">
2320                     <code class="classname">direct_mask_range_hashing</code>
2321                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2322                     <code class="classname">Resize_Policy</code>
2323                   </td><td rowspan="2" style="text-align: left" valign="top">
2324                     <code class="classname">hash_standard_resize_policy</code>
2325                   </td><td style="text-align: left">
2326                     <code class="classname">Size_Policy</code>
2327                   </td><td style="text-align: left">
2328                     <code class="classname">hash_exponential_size_policy</code>
2329                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
2330                     <code class="classname">Trigger_Policy</code>
2331                   </td><td style="text-align: left">
2332                     <code class="classname">hash_load_check_resize_trigger</code> with
2333                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2334                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2335                     <code class="classname">Mapped</code>
2336                   </td><td rowspan="3" style="text-align: left" valign="top">
2337                     <code class="classname">cc_hash_table</code>
2338                   </td><td style="text-align: left">
2339                     <code class="classname">Comb_Hash_Fn</code>
2340                   </td><td style="text-align: left">
2341                     <code class="classname">direct_mask_range_hashing</code>
2342                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2343                     <code class="classname">Resize_Policy</code>
2344                   </td><td rowspan="2" style="text-align: left" valign="top">
2345                     <code class="classname">hash_standard_resize_policy</code>
2346                   </td><td style="text-align: left">
2347                     <code class="classname">Size_Policy</code>
2348                   </td><td style="text-align: left">
2349                     <code class="classname">hash_exponential_size_policy</code>
2350                   </td></tr><tr><td style="text-align: left" valign="top">
2351                     <code class="classname">Trigger_Policy</code>
2352                   </td><td style="text-align: left">
2353                     <code class="classname">hash_load_check_resize_trigger</code> with
2354                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2355                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_small.observations"/>
2356             Observations
2357           </h6></div></div></div><p>See Observations::Mapping-Semantics
2358           Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_mem_large"/>
2359           Text <code class="function">insert</code> with Small
2360           Secondary-to-Primary Key Ratios Memory Use
2361         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_large.info"/>
2362             Description
2363           </h6></div></div></div><p>This test inserts a number of pairs into a container. The
2364           first item of each pair is a string from an arbitrary text
2365           [wickland96thirty], and
2366           the second is a uniform integer. The container is a
2367           "multimap" - it considers the first member of each pair as a
2368           primary key, and the second member of each pair as a secondary
2369           key. There
2370           are 100 distinct primary keys, and the ratio of secondary keys
2371           to primary keys ranges to about 20.</p><p>The test measures the memory use as a function of the number
2372           of values inserted.</p><p>
2373             It uses the test file:
2374             <code class="filename">
2375               performance/ext/pb_ds/multimap_text_insert_mem_usage_large.cc
2376             </code>
2377           </p><p>The test checks the memory scalability of different
2378           "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_large.results"/>
2379             Results
2380           </h6></div></div></div><p>The graphic below show the results for "multimaps" which
2381           use a tree-based container for primary keys.
2382           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_mem_large_s2p_tree.png" style="text-align: middle"/></div></div><p>
2383             The abbreviated names in the legend of the graphic above are
2384             instantiated with the types in the following table.
2385           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2386                     n_mmap
2387                   </td></tr><tr><td style="text-align: left">
2388                     <code class="classname">std::multimap</code>
2389                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2390                     rb_tree_mmap_lu_mtf_set
2391                   </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2392                     <code class="classname">tree</code>
2393                   </td><td style="text-align: left">
2394                     <code class="classname">Tag</code>
2395                   </td><td style="text-align: left">
2396                     <code class="classname">rb_tree_tag</code>
2397                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2398                     <code class="classname">Node_Update</code>
2399                   </td><td style="text-align: left">
2400                     <code class="classname">null_node_update</code>
2401                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2402                     <code class="classname">Mapped</code>
2403                   </td><td style="text-align: left">
2404                     <code class="classname">list_update</code>
2405                   </td><td style="text-align: left">
2406                     <code class="classname">Update_Policy</code>
2407                   </td><td style="text-align: left">
2408                     <code class="classname">lu_move_to_front_policy</code>
2409                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2410                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
2411                   </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
2412                     <code class="classname">tree</code>
2413                   </td><td style="text-align: left">
2414                     <code class="classname">Tag</code>
2415                   </td><td style="text-align: left">
2416                     <code class="classname">rb_tree_tag</code>
2417                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2418                     <code class="classname">Node_Update</code>
2419                   </td><td style="text-align: left">
2420                     <code class="classname">null_node_update</code>
2421                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2422                     <code class="classname">Mapped</code>
2423                   </td><td rowspan="3" style="text-align: left" valign="top">
2424                     <code class="classname">cc_hash_table</code>
2425                   </td><td style="text-align: left">
2426                     <code class="classname">Comb_Hash_Fn</code>
2427                   </td><td style="text-align: left">
2428                     <code class="classname">direct_mask_range_hashing</code>
2429                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2430                     <code class="classname">Resize_Policy</code>
2431                   </td><td rowspan="2" style="text-align: left" valign="top">
2432                     <code class="classname">hash_standard_resize_policy</code>
2433                   </td><td style="text-align: left">
2434                     <code class="classname">Size_Policy</code>
2435                   </td><td style="text-align: left">
2436                     <code class="classname">hash_exponential_size_policy</code>
2437                   </td></tr><tr><td style="text-align: left" valign="top">
2438                     <code class="classname">Trigger_Policy</code>
2439                   </td><td style="text-align: left">
2440                     <code class="classname">hash_load_check_resize_trigger</code> with
2441                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2442                   </td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
2443           use a hash-based container for primary keys.
2444           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
2445             The abbreviated names in the legend of the graphic above are
2446             instantiated with the types in the following table.
2447           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2448                     n_hash_mmap
2449                   </td></tr><tr><td style="text-align: left">
2450                     <code class="classname">std::tr1::unordered_multimap</code>
2451                   </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2452                     rb_tree_mmap_lu_mtf_set
2453                   </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
2454                     <code class="classname">
2455                       cc_hash_table
2456                     </code>
2457                   </td><td style="text-align: left">
2458                     <code class="classname">Comb_Hash_Fn</code>
2459                   </td><td style="text-align: left">
2460                     <code class="classname">direct_mask_range_hashing</code>
2461                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2462                     <code class="classname">Resize_Policy</code>
2463                   </td><td rowspan="2" style="text-align: left" valign="top">
2464                     <code class="classname">hash_standard_resize_policy</code>
2465                   </td><td style="text-align: left">
2466                     <code class="classname">Size_Policy</code>
2467                   </td><td style="text-align: left">
2468                     <code class="classname">hash_exponential_size_policy</code>
2469                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
2470                     <code class="classname">Trigger_Policy</code>
2471                   </td><td style="text-align: left">
2472                     <code class="classname">hash_load_check_resize_trigger</code> with
2473                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2474                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
2475                     <code class="classname">Mapped</code>
2476                   </td><td style="text-align: left">
2477                     <code class="classname">list_update</code>
2478                   </td><td style="text-align: left">
2479                     <code class="classname">Update_Policy</code>
2480                   </td><td style="text-align: left">
2481                     <code class="classname">lu_move_to_front_policy</code>
2482                   </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
2483                     rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
2484                   </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
2485                     <code class="classname">
2486                       cc_hash_table
2487                     </code>
2488                   </td><td style="text-align: left">
2489                     <code class="classname">Comb_Hash_Fn</code>
2490                   </td><td style="text-align: left">
2491                     <code class="classname">direct_mask_range_hashing</code>
2492                   </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2493                     <code class="classname">Resize_Policy</code>
2494                   </td><td rowspan="2" style="text-align: left" valign="top">
2495                     <code class="classname">hash_standard_resize_policy</code>
2496                   </td><td style="text-align: left">
2497                     <code class="classname">Size_Policy</code>
2498                   </td><td style="text-align: left">
2499                     <code class="classname">hash_exponential_size_policy</code>
2500                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
2501                     <code class="classname">Trigger_Policy</code>
2502                   </td><td style="text-align: left">
2503                     <code class="classname">hash_load_check_resize_trigger</code> with
2504                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2505                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
2506                     <code class="classname">Mapped</code>
2507                   </td><td rowspan="3" style="text-align: left" valign="top">
2508                     <code class="classname">cc_hash_table</code>
2509                   </td><td style="text-align: left">
2510                     <code class="classname">Comb_Hash_Fn</code>
2511                   </td><td style="text-align: left">
2512                     <code class="classname">direct_mask_range_hashing</code>
2513                   </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
2514                     <code class="classname">Resize_Policy</code>
2515                   </td><td rowspan="2" style="text-align: left" valign="top">
2516                     <code class="classname">hash_standard_resize_policy</code>
2517                   </td><td style="text-align: left">
2518                     <code class="classname">Size_Policy</code>
2519                   </td><td style="text-align: left">
2520                     <code class="classname">hash_exponential_size_policy</code>
2521                   </td></tr><tr><td style="text-align: left" valign="top">
2522                     <code class="classname">Trigger_Policy</code>
2523                   </td><td style="text-align: left">
2524                     <code class="classname">hash_load_check_resize_trigger</code> with
2525                     α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
2526                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_large.observations"/>
2527             Observations
2528           </h6></div></div></div><p>See Observations::Mapping-Semantics
2529           Considerations.</p></div></div></div><div class="section" title="Priority Queue"><div class="titlepage"><div><div><h4 class="title"><a id="performance.priority_queue"/>Priority Queue</h4></div></div></div><div class="section" title="Text push"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_push"/>
2530           Text <code class="function">push</code>
2531         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push.info"/>
2532             Description
2533           </h6></div></div></div><p>This test inserts a number of values with keys from an
2534           arbitrary text ([ wickland96thirty ]) into
2535           a container using <code class="function">push</code>. It measures the average time
2536           for <code class="function">push</code> as a function of the number of values
2537           pushed.</p><p>
2538             It uses the test file:
2539             <code class="filename">
2540               performance/ext/pb_ds/priority_queue_text_push_timing.cc
2541             </code>
2542           </p><p>The test checks the effect of different underlying data
2543           structures.
2544           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push.results"/>
2545             Results
2546           </h6></div></div></div><p>The two graphics below show the results for the native
2547           priority_queues and this library's priority_queues.
2548           </p><p>The graphic immediately below shows the results for the
2549           native priority_queue type instantiated with different underlying
2550           container types versus several different versions of library's
2551           priority_queues.
2552           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_push.png" style="text-align: middle"/></div></div><p>
2553             The abbreviated names in the legend of the graphic above are
2554             instantiated with the types in the following table.
2555           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2556                     n_pq_vector
2557                   </td></tr><tr><td style="text-align: left">
2558                     <code class="classname">std::priority_queue</code>
2559                   </td><td style="text-align: left">
2560                     <code class="classname">Sequence</code>
2561                   </td><td style="text-align: left">
2562                     <code class="classname">std::vector</code>
2563                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2564                     n_pq_deque
2565                   </td></tr><tr><td style="text-align: left">
2566                     <code class="classname">std::priority_queue</code>
2567                   </td><td style="text-align: left">
2568                     <code class="classname">Sequence</code>
2569                   </td><td style="text-align: left">
2570                     <code class="classname">std::deque</code>
2571                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2572                     binary_heap
2573                   </td></tr><tr><td style="text-align: left">
2574                     <code class="classname">priority_queue</code>
2575                   </td><td style="text-align: left">
2576                     <code class="classname">Tag</code>
2577                   </td><td style="text-align: left">
2578                     <code class="classname">binary_heap_tag</code>
2579                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2580                     binomial_heap
2581                   </td></tr><tr><td style="text-align: left">
2582                     <code class="classname">priority_queue</code>
2583                   </td><td style="text-align: left">
2584                     <code class="classname">Tag</code>
2585                   </td><td style="text-align: left">
2586                     <code class="classname">binomial_heap_tag</code>
2587                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2588                     rc_binomial_heap
2589                   </td></tr><tr><td style="text-align: left">
2590                     <code class="classname">priority_queue</code>
2591                   </td><td style="text-align: left">
2592                     <code class="classname">Tag</code>
2593                   </td><td style="text-align: left">
2594                     <code class="classname">rc_binomial_heap_tag</code>
2595                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2596                     thin_heap
2597                   </td></tr><tr><td style="text-align: left">
2598                     <code class="classname">priority_queue</code>
2599                   </td><td style="text-align: left">
2600                     <code class="classname">Tag</code>
2601                   </td><td style="text-align: left">
2602                     <code class="classname">thin_heap_tag</code>
2603                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2604                     pairing_heap
2605                   </td></tr><tr><td style="text-align: left">
2606                     <code class="classname">priority_queue</code>
2607                   </td><td style="text-align: left">
2608                     <code class="classname">Tag</code>
2609                   </td><td style="text-align: left">
2610                     <code class="classname">pairing_heap_tag</code>
2611                   </td></tr></tbody></table></div><p>The graphic below shows the results for the binary-heap
2612           based native priority queues and this library's pairing-heap
2613           priority_queue data structures.
2614           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_push.png" style="text-align: middle"/></div></div><p>
2615             The abbreviated names in the legend of the graphic above are
2616             instantiated with the types in the following table.
2617           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2618                     n_pq_vector
2619                   </td></tr><tr><td style="text-align: left">
2620                     <code class="classname">std::priority_queue</code>
2621                   </td><td style="text-align: left">
2622                     <code class="classname">Sequence</code>
2623                   </td><td style="text-align: left">
2624                     <code class="classname">std::vector</code>
2625                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2626                     n_pq_deque
2627                   </td></tr><tr><td style="text-align: left">
2628                     <code class="classname">std::priority_queue</code>
2629                   </td><td style="text-align: left">
2630                     <code class="classname">Sequence</code>
2631                   </td><td style="text-align: left">
2632                     <code class="classname">std::deque</code>
2633                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2634                     thin_heap
2635                   </td></tr><tr><td style="text-align: left">
2636                     <code class="classname">priority_queue</code>
2637                   </td><td style="text-align: left">
2638                     <code class="classname">Tag</code>
2639                   </td><td style="text-align: left">
2640                     <code class="classname">thin_heap_tag</code>
2641                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2642                     pairing_heap
2643                   </td></tr><tr><td style="text-align: left">
2644                     <code class="classname">priority_queue</code>
2645                   </td><td style="text-align: left">
2646                     <code class="classname">Tag</code>
2647                   </td><td style="text-align: left">
2648                     <code class="classname">pairing_heap_tag</code>
2649                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push.observations"/>
2650             Observations
2651           </h6></div></div></div><p>Pairing heaps (<code class="classname">priority_queue</code> with
2652           <code class="classname">Tag</code> = <code class="classname">pairing_heap_tag</code>)
2653           are the most suited for sequences of <code class="function">push</code> and
2654           <code class="function">pop</code> operations of non-primitive types (e.g.
2655           <code class="classname">std::string</code>s). (See Priority Queue
2656           Text <code class="function">push</code> and <code class="function">pop</code> Timing Test.) They are
2657           less constrained than binomial heaps, e.g., and since
2658           they are node-based, they outperform binary heaps. (See
2659           Priority
2660           Queue Random Integer <code class="function">push</code> Timing Test for the case
2661           of primitive types.)</p><p>The standard's priority queues do not seem to perform well in
2662           this case: the <code class="classname">std::vector</code> implementation needs to
2663           perform a logarithmic sequence of string operations for each
2664           operation, and the deque implementation is possibly hampered by
2665           its need to manipulate a relatively-complex type (deques
2666           support a O(1) <code class="function">push_front</code>, even though it is
2667           not used by <code class="classname">std::priority_queue</code>.)</p></div></div><div class="section" title="Text push and pop"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_push_pop"/>
2668           Text <code class="function">push</code> and <code class="function">pop</code>
2669         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push_pop.info"/>
2670             Description
2671           </h6></div></div></div><p>This test inserts a number of values with keys from an
2672           arbitrary text ([ wickland96thirty ]) into
2673           a container using <code class="classname">push</code> , then removes them using
2674           <code class="classname">pop</code> . It measures the average time for <code class="classname">push</code>
2675           as a function of the number of values.</p><p>
2676             It uses the test file:
2677             <code class="filename">
2678               performance/ext/pb_ds/priority_queue_text_push_pop_timing.cc
2679             </code>
2680           </p><p>The test checks the effect of different underlying data
2681           structures.
2682           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push_pop.results"/>
2683             Results
2684           </h6></div></div></div><p>The two graphics below show the results for the native
2685           priority_queues and this library's priority_queues.
2686           </p><p>The graphic immediately below shows the results for the
2687           native priority_queue type instantiated with different underlying
2688           container types versus several different versions of library's
2689           priority_queues.
2690           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_push_pop.png" style="text-align: middle"/></div></div><p>
2691             The abbreviated names in the legend of the graphic above are
2692             instantiated with the types in the following table.
2693           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2694                     n_pq_vector
2695                   </td></tr><tr><td style="text-align: left">
2696                     <code class="classname">std::priority_queue</code>
2697                   </td><td style="text-align: left">
2698                     <code class="classname">Sequence</code>
2699                   </td><td style="text-align: left">
2700                     <code class="classname">std::vector</code>
2701                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2702                     n_pq_deque
2703                   </td></tr><tr><td style="text-align: left">
2704                     <code class="classname">std::priority_queue</code>
2705                   </td><td style="text-align: left">
2706                     <code class="classname">Sequence</code>
2707                   </td><td style="text-align: left">
2708                     <code class="classname">std::deque</code>
2709                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2710                     binary_heap
2711                   </td></tr><tr><td style="text-align: left">
2712                     <code class="classname">priority_queue</code>
2713                   </td><td style="text-align: left">
2714                     <code class="classname">Tag</code>
2715                   </td><td style="text-align: left">
2716                     <code class="classname">binary_heap_tag</code>
2717                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2718                     binomial_heap
2719                   </td></tr><tr><td style="text-align: left">
2720                     <code class="classname">priority_queue</code>
2721                   </td><td style="text-align: left">
2722                     <code class="classname">Tag</code>
2723                   </td><td style="text-align: left">
2724                     <code class="classname">binomial_heap_tag</code>
2725                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2726                     rc_binomial_heap
2727                   </td></tr><tr><td style="text-align: left">
2728                     <code class="classname">priority_queue</code>
2729                   </td><td style="text-align: left">
2730                     <code class="classname">Tag</code>
2731                   </td><td style="text-align: left">
2732                     <code class="classname">rc_binomial_heap_tag</code>
2733                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2734                     thin_heap
2735                   </td></tr><tr><td style="text-align: left">
2736                     <code class="classname">priority_queue</code>
2737                   </td><td style="text-align: left">
2738                     <code class="classname">Tag</code>
2739                   </td><td style="text-align: left">
2740                     <code class="classname">thin_heap_tag</code>
2741                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2742                     pairing_heap
2743                   </td></tr><tr><td style="text-align: left">
2744                     <code class="classname">priority_queue</code>
2745                   </td><td style="text-align: left">
2746                     <code class="classname">Tag</code>
2747                   </td><td style="text-align: left">
2748                     <code class="classname">pairing_heap_tag</code>
2749                   </td></tr></tbody></table></div><p>The graphic below shows the results for the native priority
2750           queues and this library's pairing-heap priority_queue data
2751           structures.
2752           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_push_pop.png" style="text-align: middle"/></div></div><p>
2753             The abbreviated names in the legend of the graphic above are
2754             instantiated with the types in the following table.
2755           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2756                     n_pq_vector
2757                   </td></tr><tr><td style="text-align: left">
2758                     <code class="classname">std::priority_queue</code> adapting <code class="classname">std::vector</code>
2759                   </td><td style="text-align: left">
2760                     <code class="classname">Sequence</code>
2761                   </td><td style="text-align: left">
2762                     <code class="classname">std::vector</code>
2763                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2764                     n_pq_deque
2765                   </td></tr><tr><td style="text-align: left">
2766                     <code class="classname">std::priority_queue</code>
2767                   </td><td style="text-align: left">
2768                     <code class="classname">Sequence</code>
2769                   </td><td style="text-align: left">
2770                     <code class="classname">std::deque</code>
2771                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2772                     pairing_heap
2773                   </td></tr><tr><td style="text-align: left">
2774                     <code class="classname">priority_queue</code>
2775                   </td><td style="text-align: left">
2776                     <code class="classname">Tag</code>
2777                   </td><td style="text-align: left">
2778                     <code class="classname">pairing_heap_tag</code>
2779                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push_pop.observations"/>
2780             Observations
2781           </h6></div></div></div><p>These results are very similar to Priority Queue Text
2782           <code class="function">push</code> Timing Test. As stated there, pairing heaps
2783           (<code class="classname">priority_queue</code> with
2784           <code class="classname">Tag</code>
2785           = <code class="classname">pairing_heap_tag</code>) are most suited
2786           for <code class="function">push</code> and <code class="function">pop</code>
2787           sequences of non-primitive types such as strings. Observing these
2788           two tests, one can note that a pairing heap outperforms the others
2789           in terms of <code class="function">push</code> operations, but equals
2790           binary heaps (<code class="classname">priority_queue</code> with
2791           <code class="classname">Tag</code>
2792           = <code class="classname">binary_heap_tag</code>) if the number
2793           of <code class="function">push</code> and <code class="function">pop</code>
2794           operations is equal. As the number of <code class="function">pop</code>
2795           operations is at most equal to the number
2796           of <code class="function">push</code> operations, pairing heaps are better
2797           in this case. See Priority Queue Random
2798           Integer <code class="function">push</code> and <code class="function">pop</code>
2799           Timing Test for a case which is different.</p></div></div><div class="section" title="Integer push"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.int_push"/>
2800           Integer <code class="function">push</code>
2801         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push.info"/>
2802             Description
2803           </h6></div></div></div><p>This test inserts a number of values with integer keys
2804           into a container using <code class="function">push</code>. It
2805           measures the average time for <code class="function">push</code> as a
2806           function of the number of values.</p><p>
2807             It uses the test file:
2808             <code class="filename">
2809               performance/ext/pb_ds/priority_queue_random_int_push_timing.cc
2810             </code>
2811           </p><p>The test checks the effect of different underlying data
2812           structures.
2813           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push.results"/>
2814             Results
2815           </h6></div></div></div><p>The two graphics below show the results for the native
2816           priority_queues and this library's priority_queues.
2817           </p><p>The graphic immediately below shows the results for the
2818           native priority_queue type instantiated with different underlying
2819           container types versus several different versions of library's
2820           priority_queues.
2821           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_int_push.png" style="text-align: middle"/></div></div><p>
2822             The abbreviated names in the legend of the graphic above are
2823             instantiated with the types in the following table.
2824           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2825                     n_pq_vector
2826                   </td></tr><tr><td style="text-align: left">
2827                     <code class="classname">std::priority_queue</code>
2828                   </td><td style="text-align: left">
2829                     <code class="classname">Sequence</code>
2830                   </td><td style="text-align: left">
2831                     <code class="classname">std::vector</code>
2832                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2833                     n_pq_deque
2834                   </td></tr><tr><td style="text-align: left">
2835                     <code class="classname">std::priority_queue</code>
2836                   </td><td style="text-align: left">
2837                     <code class="classname">Sequence</code>
2838                   </td><td style="text-align: left">
2839                     <code class="classname">std::deque</code>
2840                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2841                     binary_heap
2842                   </td></tr><tr><td style="text-align: left">
2843                     <code class="classname">priority_queue</code>
2844                   </td><td style="text-align: left">
2845                     <code class="classname">Tag</code>
2846                   </td><td style="text-align: left">
2847                     <code class="classname">binary_heap_tag</code>
2848                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2849                     binomial_heap
2850                   </td></tr><tr><td style="text-align: left">
2851                     <code class="classname">priority_queue</code>
2852                   </td><td style="text-align: left">
2853                     <code class="classname">Tag</code>
2854                   </td><td style="text-align: left">
2855                     <code class="classname">binomial_heap_tag</code>
2856                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2857                     rc_binomial_heap
2858                   </td></tr><tr><td style="text-align: left">
2859                     <code class="classname">priority_queue</code>
2860                   </td><td style="text-align: left">
2861                     <code class="classname">Tag</code>
2862                   </td><td style="text-align: left">
2863                     <code class="classname">rc_binomial_heap_tag</code>
2864                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2865                     thin_heap
2866                   </td></tr><tr><td style="text-align: left">
2867                     <code class="classname">priority_queue</code>
2868                   </td><td style="text-align: left">
2869                     <code class="classname">Tag</code>
2870                   </td><td style="text-align: left">
2871                     <code class="classname">thin_heap_tag</code>
2872                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2873                     pairing_heap
2874                   </td></tr><tr><td style="text-align: left">
2875                     <code class="classname">priority_queue</code>
2876                   </td><td style="text-align: left">
2877                     <code class="classname">Tag</code>
2878                   </td><td style="text-align: left">
2879                     <code class="classname">pairing_heap_tag</code>
2880                   </td></tr></tbody></table></div><p>The graphic below shows the results for the binary-heap
2881           based native priority queues and this library's
2882           priority_queue data structures.
2883           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_binary_priority_queue_int_push.png" style="text-align: middle"/></div></div><p>
2884             The abbreviated names in the legend of the graphic above are
2885             instantiated with the types in the following table.
2886           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2887                     n_pq_vector
2888                   </td></tr><tr><td style="text-align: left">
2889                     <code class="classname">std::priority_queue</code> adapting <code class="classname">std::vector</code>
2890                   </td><td style="text-align: left">
2891                     <code class="classname">Sequence</code>
2892                   </td><td style="text-align: left">
2893                     <code class="classname">std::vector</code>
2894                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2895                     n_pq_deque
2896                   </td></tr><tr><td style="text-align: left">
2897                     <code class="classname">std::priority_queue</code>
2898                   </td><td style="text-align: left">
2899                     <code class="classname">Sequence</code>
2900                   </td><td style="text-align: left">
2901                     <code class="classname">std::deque</code>
2902                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2903                     binary_heap
2904                   </td></tr><tr><td style="text-align: left">
2905                     <code class="classname">priority_queue</code>
2906                   </td><td style="text-align: left">
2907                     <code class="classname">Tag</code>
2908                   </td><td style="text-align: left">
2909                     <code class="classname">binary_heap_tag</code>
2910                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push.observations"/>
2911             Observations
2912           </h6></div></div></div><p>Binary heaps are the most suited for sequences of
2913           <code class="function">push</code> and <code class="function">pop</code> operations of primitive types
2914           (e.g. <span class="type">int</span>s). They are less constrained
2915           than any other type, and since it is very efficient to store
2916           such types in arrays, they outperform even pairing heaps. (See
2917           Priority
2918           Queue Text <code class="function">push</code> Timing Test for the case of
2919           non-primitive types.)</p></div></div><div class="section" title="Integer push"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.int_push_pop"/>
2920           Integer <code class="function">push</code>
2921         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push_pop.info"/>
2922             Description
2923           </h6></div></div></div><p>This test inserts a number of values with integer keys
2924           into a container using <code class="function">push</code> , then removes them
2925           using <code class="function">pop</code> . It measures the average time for
2926           <code class="function">push</code> and <code class="function">pop</code> as a function
2927           of the number of values.</p><p>
2928             It uses the test file:
2929             <code class="filename">
2930               performance/ext/pb_ds/priority_queue_random_int_push_pop_timing.cc
2931             </code>
2932           </p><p>The test checks the effect of different underlying data
2933           structures.
2934           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push_pop.results"/>
2935             Results
2936           </h6></div></div></div><p>The graphic immediately below shows the results for the
2937           native priority_queue type instantiated with different underlying
2938           container types versus several different versions of library's
2939           priority_queues.
2940           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_int_push_pop.png" style="text-align: middle"/></div></div><p>
2941             The abbreviated names in the legend of the graphic above are
2942             instantiated with the types in the following table.
2943           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2944                     n_pq_vector
2945                   </td></tr><tr><td style="text-align: left">
2946                     <code class="classname">std::priority_queue</code>
2947                   </td><td style="text-align: left">
2948                     <code class="classname">Sequence</code>
2949                   </td><td style="text-align: left">
2950                     <code class="classname">std::vector</code>
2951                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2952                     n_pq_deque
2953                   </td></tr><tr><td style="text-align: left">
2954                     <code class="classname">std::priority_queue</code>
2955                   </td><td style="text-align: left">
2956                     <code class="classname">Sequence</code>
2957                   </td><td style="text-align: left">
2958                     <code class="classname">std::deque</code>
2959                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2960                     binary_heap
2961                   </td></tr><tr><td style="text-align: left">
2962                     <code class="classname">priority_queue</code>
2963                   </td><td style="text-align: left">
2964                     <code class="classname">Tag</code>
2965                   </td><td style="text-align: left">
2966                     <code class="classname">binary_heap_tag</code>
2967                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2968                     binomial_heap
2969                   </td></tr><tr><td style="text-align: left">
2970                     <code class="classname">priority_queue</code>
2971                   </td><td style="text-align: left">
2972                     <code class="classname">Tag</code>
2973                   </td><td style="text-align: left">
2974                     <code class="classname">binomial_heap_tag</code>
2975                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2976                     rc_binomial_heap
2977                   </td></tr><tr><td style="text-align: left">
2978                     <code class="classname">priority_queue</code>
2979                   </td><td style="text-align: left">
2980                     <code class="classname">Tag</code>
2981                   </td><td style="text-align: left">
2982                     <code class="classname">rc_binomial_heap_tag</code>
2983                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2984                     thin_heap
2985                   </td></tr><tr><td style="text-align: left">
2986                     <code class="classname">priority_queue</code>
2987                   </td><td style="text-align: left">
2988                     <code class="classname">Tag</code>
2989                   </td><td style="text-align: left">
2990                     <code class="classname">thin_heap_tag</code>
2991                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
2992                     pairing_heap
2993                   </td></tr><tr><td style="text-align: left">
2994                     <code class="classname">priority_queue</code>
2995                   </td><td style="text-align: left">
2996                     <code class="classname">Tag</code>
2997                   </td><td style="text-align: left">
2998                     <code class="classname">pairing_heap_tag</code>
2999                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push_pop.observations"/>
3000             Observations
3001           </h6></div></div></div><p>Binary heaps are the most suited for sequences of
3002           <code class="function">push</code> and <code class="function">pop</code> operations of primitive types
3003           (e.g. <span class="type">int</span>s). This is explained in
3004           Priority
3005           Queue Random Int <code class="function">push</code> Timing Test. (See Priority Queue
3006           Text <code class="function">push</code> Timing Test for the case of primitive
3007           types.)</p><p>At first glance it seems that the standard's vector-based
3008           priority queue is approximately on par with this
3009           library's corresponding priority queue. There are two
3010           differences however:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>The standard's priority queue does not downsize the underlying
3011             vector (or deque) as the priority queue becomes smaller
3012             (see Priority Queue
3013             Text <code class="function">pop</code> Memory Use Test). It is therefore
3014             gaining some speed at the expense of space.</p></li><li class="listitem"><p>From Priority Queue Random
3015             Integer <code class="function">push</code> and <code class="function">pop</code>
3016             Timing Test, it seems that the standard's priority queue is
3017             slower in terms of <code class="function">push</code> operations. Since
3018             the number of
3019             <code class="function">pop</code> operations is at most that of <code class="function">push</code>
3020             operations, the test here is the "best" for the standard's
3021             priority queue.</p></li></ol></div></div></div><div class="section" title="Text pop Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_pop"/>
3022           Text <code class="function">pop</code> Memory Use
3023         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_pop.info"/>
3024             Description
3025           </h6></div></div></div><p>This test inserts a number of values with keys from an
3026           arbitrary text ([ wickland96thirty ]) into
3027           a container, then pops them until only one is left in the
3028           container. It measures the memory use as a function of the
3029           number of values pushed to the container.</p><p>
3030             It uses the test file:
3031             <code class="filename">
3032               performance/ext/pb_ds/priority_queue_text_pop_mem_usage.cc
3033             </code>
3034           </p><p>The test checks the effect of different underlying data
3035           structures.
3036           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_pop.results"/>
3037             Results
3038           </h6></div></div></div><p>The graphic immediately below shows the results for the
3039           native priority_queue type instantiated with different underlying
3040           container types versus several different versions of library's
3041           priority_queues.
3042           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_pop_mem.png" style="text-align: middle"/></div></div><p>
3043             The abbreviated names in the legend of the graphic above are
3044             instantiated with the types in the following table.
3045           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3046                     n_pq_vector
3047                   </td></tr><tr><td style="text-align: left">
3048                     <code class="classname">std::priority_queue</code>
3049                   </td><td style="text-align: left">
3050                     <code class="classname">Sequence</code>
3051                   </td><td style="text-align: left">
3052                     <code class="classname">std::vector</code>
3053                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3054                     n_pq_deque
3055                   </td></tr><tr><td style="text-align: left">
3056                     <code class="classname">std::priority_queue</code>
3057                   </td><td style="text-align: left">
3058                     <code class="classname">Sequence</code>
3059                   </td><td style="text-align: left">
3060                     <code class="classname">std::deque</code>
3061                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3062                     binary_heap
3063                   </td></tr><tr><td style="text-align: left">
3064                     <code class="classname">priority_queue</code>
3065                   </td><td style="text-align: left">
3066                     <code class="classname">Tag</code>
3067                   </td><td style="text-align: left">
3068                     <code class="classname">binary_heap_tag</code>
3069                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3070                     binomial_heap
3071                   </td></tr><tr><td style="text-align: left">
3072                     <code class="classname">priority_queue</code>
3073                   </td><td style="text-align: left">
3074                     <code class="classname">Tag</code>
3075                   </td><td style="text-align: left">
3076                     <code class="classname">binomial_heap_tag</code>
3077                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3078                     rc_binomial_heap
3079                   </td></tr><tr><td style="text-align: left">
3080                     <code class="classname">priority_queue</code>
3081                   </td><td style="text-align: left">
3082                     <code class="classname">Tag</code>
3083                   </td><td style="text-align: left">
3084                     <code class="classname">rc_binomial_heap_tag</code>
3085                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3086                     thin_heap
3087                   </td></tr><tr><td style="text-align: left">
3088                     <code class="classname">priority_queue</code>
3089                   </td><td style="text-align: left">
3090                     <code class="classname">Tag</code>
3091                   </td><td style="text-align: left">
3092                     <code class="classname">thin_heap_tag</code>
3093                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3094                     pairing_heap
3095                   </td></tr><tr><td style="text-align: left">
3096                     <code class="classname">priority_queue</code>
3097                   </td><td style="text-align: left">
3098                     <code class="classname">Tag</code>
3099                   </td><td style="text-align: left">
3100                     <code class="classname">pairing_heap_tag</code>
3101                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_pop.observations"/>
3102             Observations
3103           </h6></div></div></div><p>The priority queue implementations (excluding the standard's) use
3104           memory proportionally to the number of values they hold:
3105           node-based implementations (e.g., a pairing heap) do so
3106           naturally; this library's binary heap de-allocates memory when
3107           a certain lower threshold is exceeded.</p><p>Note from Priority Queue Text <code class="function">push</code>
3108           and <code class="function">pop</code> Timing Test and Priority Queue
3109           Random Integer <code class="function">push</code>
3110           and <code class="function">pop</code> Timing Test that this does not
3111           impede performance compared to the standard's priority
3112           queues.</p><p>See Hash-Based Erase
3113           Memory Use Test for a similar phenomenon regarding priority
3114           queues.</p></div></div><div class="section" title="Text join"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_join"/>
3115           Text <code class="function">join</code>
3116         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_join.info"/>
3117             Description
3118           </h6></div></div></div><p>This test inserts a number of values with keys from an
3119           arbitrary text ([ wickland96thirty ]) into
3120           two containers, then merges the containers. It uses
3121           <code class="function">join</code> for this library's priority queues; for
3122           the standard's priority queues, it successively pops values from
3123           one container and pushes them into the other. The test measures
3124           the average time as a function of the number of values.</p><p>
3125             It uses the test file:
3126             <code class="filename">
3127               performance/ext/pb_ds/priority_queue_text_join_timing.cc
3128             </code>
3129           </p><p>The test checks the effect of different underlying data
3130           structures.
3131           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_join.results"/>
3132             Results
3133           </h6></div></div></div><p>The graphic immediately below shows the results for the
3134           native priority_queue type instantiated with different underlying
3135           container types versus several different versions of library's
3136           priority_queues.
3137           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_join.png" style="text-align: middle"/></div></div><p>
3138             The abbreviated names in the legend of the graphic above are
3139             instantiated with the types in the following table.
3140           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3141                     n_pq_vector
3142                   </td></tr><tr><td style="text-align: left">
3143                     <code class="classname">std::priority_queue</code>
3144                   </td><td style="text-align: left">
3145                     <code class="classname">Sequence</code>
3146                   </td><td style="text-align: left">
3147                     <code class="classname">std::vector</code>
3148                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3149                     n_pq_deque
3150                   </td></tr><tr><td style="text-align: left">
3151                     <code class="classname">std::priority_queue</code>
3152                   </td><td style="text-align: left">
3153                     <code class="classname">Sequence</code>
3154                   </td><td style="text-align: left">
3155                     <code class="classname">std::deque</code>
3156                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3157                     binary_heap
3158                   </td></tr><tr><td style="text-align: left">
3159                     <code class="classname">priority_queue</code>
3160                   </td><td style="text-align: left">
3161                     <code class="classname">Tag</code>
3162                   </td><td style="text-align: left">
3163                     <code class="classname">binary_heap_tag</code>
3164                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3165                     binomial_heap
3166                   </td></tr><tr><td style="text-align: left">
3167                     <code class="classname">priority_queue</code>
3168                   </td><td style="text-align: left">
3169                     <code class="classname">Tag</code>
3170                   </td><td style="text-align: left">
3171                     <code class="classname">binomial_heap_tag</code>
3172                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3173                     rc_binomial_heap
3174                   </td></tr><tr><td style="text-align: left">
3175                     <code class="classname">priority_queue</code>
3176                   </td><td style="text-align: left">
3177                     <code class="classname">Tag</code>
3178                   </td><td style="text-align: left">
3179                     <code class="classname">rc_binomial_heap_tag</code>
3180                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3181                     thin_heap
3182                   </td></tr><tr><td style="text-align: left">
3183                     <code class="classname">priority_queue</code>
3184                   </td><td style="text-align: left">
3185                     <code class="classname">Tag</code>
3186                   </td><td style="text-align: left">
3187                     <code class="classname">thin_heap_tag</code>
3188                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3189                     pairing_heap
3190                   </td></tr><tr><td style="text-align: left">
3191                     <code class="classname">priority_queue</code>
3192                   </td><td style="text-align: left">
3193                     <code class="classname">Tag</code>
3194                   </td><td style="text-align: left">
3195                     <code class="classname">pairing_heap_tag</code>
3196                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_join.observations"/>
3197             Observations
3198           </h6></div></div></div><p>In this test the node-based heaps perform <code class="function">join</code> in
3199           either logarithmic or constant time. The binary heap requires
3200           linear time, since the well-known heapify algorithm [clrs2001] is linear.</p><p>It would be possible to apply the heapify algorithm to the
3201           standard containers, if they would support iteration (which they
3202           don't). Barring iterators, it is still somehow possible to perform
3203           linear-time merge on a <code class="classname">std::vector</code>-based
3204           standard priority queue, using <code class="function">top()</code>
3205           and <code class="function">size()</code> (since they are enough to expose
3206           the underlying array), but this is impossible for
3207           a <code class="classname">std::deque</code>-based standard priority queue.
3208           Without heapify, the cost is super-linear.</p></div></div><div class="section" title="Text modify Up"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_modify_up"/>
3209           Text <code class="function">modify</code> Up
3210         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_up.info"/>
3211             Description
3212           </h6></div></div></div><p>This test inserts a number of values with keys from an
3213           arbitrary text ([ wickland96thirty ]) into
3214           into a container then modifies each one "up" (i.e., it
3215           makes it larger). It uses <code class="function">modify</code> for this library's
3216           priority queues; for the standard's priority queues, it pops values
3217           from a container until it reaches the value that should be
3218           modified, then pushes values back in. It measures the average
3219           time for <code class="function">modify</code> as a function of the number of
3220           values.</p><p>
3221             It uses the test file:
3222             <code class="filename">
3223               performance/ext/pb_ds/priority_queue_text_modify_up_timing.cc
3224             </code>
3225           </p><p>The test checks the effect of different underlying data
3226           structures for graph algorithms settings.  Note that making an
3227           arbitrary value larger (in the sense of the priority queue's
3228           comparison functor) corresponds to decrease-key in standard graph
3229           algorithms [clrs2001].
3230           </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_up.results"/>
3231             Results
3232           </h6></div></div></div><p>The two graphics below show the results for the native
3233           priority_queues and this library's priority_queues.
3234           </p><p>The graphic immediately below shows the results for the
3235           native priority_queue type instantiated with different underlying
3236           container types versus several different versions of library's
3237           priority_queues.
3238           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_modify_up.png" style="text-align: middle"/></div></div><p>
3239             The abbreviated names in the legend of the graphic above are
3240             instantiated with the types in the following table.
3241           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3242                     n_pq_vector
3243                   </td></tr><tr><td style="text-align: left">
3244                     <code class="classname">std::priority_queue</code>
3245                   </td><td style="text-align: left">
3246                     <code class="classname">Sequence</code>
3247                   </td><td style="text-align: left">
3248                     <code class="classname">std::vector</code>
3249                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3250                     n_pq_deque
3251                   </td></tr><tr><td style="text-align: left">
3252                     <code class="classname">std::priority_queue</code>
3253                   </td><td style="text-align: left">
3254                     <code class="classname">Sequence</code>
3255                   </td><td style="text-align: left">
3256                     <code class="classname">std::deque</code>
3257                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3258                     binary_heap
3259                   </td></tr><tr><td style="text-align: left">
3260                     <code class="classname">priority_queue</code>
3261                   </td><td style="text-align: left">
3262                     <code class="classname">Tag</code>
3263                   </td><td style="text-align: left">
3264                     <code class="classname">binary_heap_tag</code>
3265                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3266                     binomial_heap
3267                   </td></tr><tr><td style="text-align: left">
3268                     <code class="classname">priority_queue</code>
3269                   </td><td style="text-align: left">
3270                     <code class="classname">Tag</code>
3271                   </td><td style="text-align: left">
3272                     <code class="classname">binomial_heap_tag</code>
3273                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3274                     rc_binomial_heap
3275                   </td></tr><tr><td style="text-align: left">
3276                     <code class="classname">priority_queue</code>
3277                   </td><td style="text-align: left">
3278                     <code class="classname">Tag</code>
3279                   </td><td style="text-align: left">
3280                     <code class="classname">rc_binomial_heap_tag</code>
3281                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3282                     thin_heap
3283                   </td></tr><tr><td style="text-align: left">
3284                     <code class="classname">priority_queue</code>
3285                   </td><td style="text-align: left">
3286                     <code class="classname">Tag</code>
3287                   </td><td style="text-align: left">
3288                     <code class="classname">thin_heap_tag</code>
3289                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3290                     pairing_heap
3291                   </td></tr><tr><td style="text-align: left">
3292                     <code class="classname">priority_queue</code>
3293                   </td><td style="text-align: left">
3294                     <code class="classname">Tag</code>
3295                   </td><td style="text-align: left">
3296                     <code class="classname">pairing_heap_tag</code>
3297                   </td></tr></tbody></table></div><p>The graphic below shows the results for the
3298           native priority queues and this library's pairing and thin heap
3299           priority_queue data structures.
3300           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_modify_up_thin.png" style="text-align: middle"/></div></div><p>
3301             The abbreviated names in the legend of the graphic above are
3302             instantiated with the types in the following table.
3303           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3304                     thin_heap
3305                   </td></tr><tr><td style="text-align: left">
3306                     <code class="classname">priority_queue</code>
3307                   </td><td style="text-align: left">
3308                     <code class="classname">Tag</code>
3309                   </td><td style="text-align: left">
3310                     <code class="classname">thin_heap_tag</code>
3311                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3312                     pairing_heap
3313                   </td></tr><tr><td style="text-align: left">
3314                     <code class="classname">priority_queue</code>
3315                   </td><td style="text-align: left">
3316                     <code class="classname">Tag</code>
3317                   </td><td style="text-align: left">
3318                     <code class="classname">pairing_heap_tag</code>
3319                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_up.observations"/>
3320             Observations
3321           </h6></div></div></div><p>As noted above, increasing an arbitrary value (in the sense of
3322           the priority queue's comparison functor) is very common in
3323           graph-related algorithms. In this case, a thin heap
3324           (<code class="classname">priority_queue</code> with
3325           <code class="classname">Tag</code> = <code class="classname">thin_heap_tag</code>)
3326           outperforms a pairing heap (<code class="classname">priority_queue</code> with
3327           <code class="classname">Tag</code> = <code class="classname">pairing_heap_tag</code>).
3328           Conversely, Priority Queue Text
3329           <code class="function">push</code> Timing Test, Priority Queue
3330           Text <code class="function">push</code> and <code class="function">pop</code> Timing Test, Priority
3331           Queue Random Integer <code class="function">push</code> Timing Test, and
3332           Priority
3333           Queue Random Integer <code class="function">push</code> and <code class="function">pop</code> Timing
3334           Test show that the situation is reversed for other
3335           operations. It is not clear when to prefer one of these two
3336           different types.</p><p>In this test this library's binary heaps
3337           effectively perform modify in linear time. As explained in
3338           Priority Queue Design::Traits, given a valid point-type iterator,
3339           a binary heap can perform
3340           <code class="function">modify</code> logarithmically. The problem is that binary
3341           heaps invalidate their find iterators with each modifying
3342           operation, and so the only way to obtain a valid point-type
3343           iterator is to iterate using a range-type iterator until
3344           finding the appropriate value, then use the range-type iterator
3345           for the <code class="function">modify</code> operation.</p><p>The explanation for the standard's priority queues' performance
3346           is similar to that in Priority Queue Text
3347           <code class="function">join</code> Timing Test.</p></div></div><div class="section" title="Text modify Down"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_modify_down"/>
3348           Text <code class="function">modify</code> Down
3349         </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_down.info"/>
3350             Description
3351           </h6></div></div></div><p>This test inserts a number of values with keys from an
3352           arbitrary text ([ wickland96thirty ]) into
3353           into a container then modifies each one "down" (i.e., it
3354           makes it smaller). It uses <code class="function">modify</code> for this library's
3355           priority queues; for the standard's priority queues, it pops values
3356           from a container until it reaches the value that should be
3357           modified, then pushes values back in. It measures the average
3358           time for <code class="function">modify</code> as a function of the number of
3359           values.</p><p>
3360             It uses the test file:
3361             <code class="filename">
3362               performance/ext/pb_ds/priority_queue_text_modify_down_timing.cc
3363             </code>
3364           </p><p>The main purpose of this test is to contrast Priority Queue
3365           Text <code class="classname">modify</code> Up Timing Test.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_down.results"/>
3366             Results
3367           </h6></div></div></div><p>The two graphics below show the results for the native
3368           priority_queues and this library's priority_queues.
3369           </p><p>The graphic immediately below shows the results for the
3370           native priority_queue type instantiated with different underlying
3371           container types versus several different versions of library's
3372           priority_queues.
3373           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_modify_down.png" style="text-align: middle"/></div></div><p>
3374             The abbreviated names in the legend of the graphic above are
3375             instantiated with the types in the following table.
3376           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3377                     n_pq_vector
3378                   </td></tr><tr><td style="text-align: left">
3379                     <code class="classname">std::priority_queue</code>
3380                   </td><td style="text-align: left">
3381                     <code class="classname">Sequence</code>
3382                   </td><td style="text-align: left">
3383                     <code class="classname">std::vector</code>
3384                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3385                     n_pq_deque
3386                   </td></tr><tr><td style="text-align: left">
3387                     <code class="classname">std::priority_queue</code>
3388                   </td><td style="text-align: left">
3389                     <code class="classname">Sequence</code>
3390                   </td><td style="text-align: left">
3391                     <code class="classname">std::deque</code>
3392                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3393                     binary_heap
3394                   </td></tr><tr><td style="text-align: left">
3395                     <code class="classname">priority_queue</code>
3396                   </td><td style="text-align: left">
3397                     <code class="classname">Tag</code>
3398                   </td><td style="text-align: left">
3399                     <code class="classname">binary_heap_tag</code>
3400                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3401                     binomial_heap
3402                   </td></tr><tr><td style="text-align: left">
3403                     <code class="classname">priority_queue</code>
3404                   </td><td style="text-align: left">
3405                     <code class="classname">Tag</code>
3406                   </td><td style="text-align: left">
3407                     <code class="classname">binomial_heap_tag</code>
3408                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3409                     rc_binomial_heap
3410                   </td></tr><tr><td style="text-align: left">
3411                     <code class="classname">priority_queue</code>
3412                   </td><td style="text-align: left">
3413                     <code class="classname">Tag</code>
3414                   </td><td style="text-align: left">
3415                     <code class="classname">rc_binomial_heap_tag</code>
3416                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3417                     thin_heap
3418                   </td></tr><tr><td style="text-align: left">
3419                     <code class="classname">priority_queue</code>
3420                   </td><td style="text-align: left">
3421                     <code class="classname">Tag</code>
3422                   </td><td style="text-align: left">
3423                     <code class="classname">thin_heap_tag</code>
3424                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3425                     pairing_heap
3426                   </td></tr><tr><td style="text-align: left">
3427                     <code class="classname">priority_queue</code>
3428                   </td><td style="text-align: left">
3429                     <code class="classname">Tag</code>
3430                   </td><td style="text-align: left">
3431                     <code class="classname">pairing_heap_tag</code>
3432                   </td></tr></tbody></table></div><p>The graphic below shows the results for the
3433           native priority queues and this library's pairing and thin heap
3434           priority_queue data structures.
3435           </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_modify_down_thin.png" style="text-align: middle"/></div></div><p>
3436             The abbreviated names in the legend of the graphic above are
3437             instantiated with the types in the following table.
3438           </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3439                     thin_heap
3440                   </td></tr><tr><td style="text-align: left">
3441                     <code class="classname">priority_queue</code>
3442                   </td><td style="text-align: left">
3443                     <code class="classname">Tag</code>
3444                   </td><td style="text-align: left">
3445                     <code class="classname">thin_heap_tag</code>
3446                   </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
3447                     pairing_heap
3448                   </td></tr><tr><td style="text-align: left">
3449                     <code class="classname">priority_queue</code>
3450                   </td><td style="text-align: left">
3451                     <code class="classname">Tag</code>
3452                   </td><td style="text-align: left">
3453                     <code class="classname">pairing_heap_tag</code>
3454                   </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_down.observations"/>
3455             Observations
3456           </h6></div></div></div><p>Most points in these results are similar to Priority Queue
3457           Text <code class="function">modify</code> Up Timing Test.</p><p>It is interesting to note, however, that as opposed to that
3458           test, a thin heap (<code class="classname">priority_queue</code> with
3459           <code class="classname">Tag</code> = <code class="classname">thin_heap_tag</code>) is
3460           outperformed by a pairing heap (<code class="classname">priority_queue</code> with
3461           <code class="classname">Tag</code> = <code class="classname">pairing_heap_tag</code>).
3462           In this case, both heaps essentially perform an <code class="function">erase</code>
3463           operation followed by a <code class="function">push</code> operation. As the other
3464           tests show, a pairing heap is usually far more efficient than a
3465           thin heap, so this is not surprising.</p><p>Most algorithms that involve priority queues increase values
3466           (in the sense of the priority queue's comparison functor), and
3467           so Priority Queue
3468           Text <code class="classname">modify</code> Up Timing Test - is more interesting
3469           than this test.</p></div></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h4 class="title"><a id="pbds.test.performance.observations"/>Observations</h4></div></div></div><div class="section" title="Associative"><div class="titlepage"><div><div><h5 class="title"><a id="observations.associative"/>Associative</h5></div></div></div><div class="section" title="Underlying Data-Structure Families"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.underlying"/>
3470             Underlying Data-Structure Families
3471           </h6></div></div></div><p>In general, hash-based containers have better timing performance
3472           than containers based on different underlying-data structures. The
3473           main reason to choose a tree-based or trie-based container is if a
3474           byproduct of the tree-like structure is required: either
3475           order-preservation, or the ability to utilize node invariants. If
3476           memory-use is the major factor, an ordered-vector tree gives
3477           optimal results (albeit with high modificiation costs), and a
3478           list-based container gives reasonable results.</p></div><div class="section" title="Hash-Based Containers"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.hash"/>
3479             Hash-Based Containers
3480           </h6></div></div></div><p>Hash-based containers are typically either collision
3481           chaining or probing. Collision-chaining
3482           containers are more flexible internally, and so offer better
3483           timing performance. Probing containers, if used for simple
3484           value-types, manage memory more efficiently (they perform far
3485           fewer allocation-related calls). In general, therefore, a
3486           collision-chaining table should be used. A probing container,
3487           conversely, might be used efficiently for operations such as
3488           eliminating duplicates in a sequence, or counting the number of
3489           occurrences within a sequence. Probing containers might be more
3490           useful also in multithreaded applications where each thread
3491           manipulates a hash-based container: in the standard, allocators have
3492           class-wise semantics (see [meyers96more] - Item 10); a
3493           probing container might incur less contention in this case.</p></div><div class="section" title="Hash Policies"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.hash_policies"/>
3494             Hash Policies
3495           </h6></div></div></div><p>In hash-based containers, the range-hashing scheme seems to
3496           affect performance more than other considerations. In most
3497           settings, a mask-based scheme works well (or can be made to
3498           work well). If the key-distribution can be estimated a-priori,
3499           a simple hash function can produce nearly uniform hash-value
3500           distribution. In many other cases (e.g., text hashing,
3501           floating-point hashing), the hash function is powerful enough
3502           to generate hash values with good uniformity properties
3503           [knuth98sorting];
3504           a modulo-based scheme, taking into account all bits of the hash
3505           value, appears to overlap the hash function in its effort.</p><p>The range-hashing scheme determines many of the other
3506           policies. A mask-based scheme works
3507           well with an exponential-size policy; for
3508           probing-based containers, it goes well with a linear-probe
3509           function.</p><p>An orthogonal consideration is the trigger policy. This
3510           presents difficult tradeoffs. E.g., different load
3511           factors in a load-check trigger policy yield a
3512           space/amortized-cost tradeoff.</p></div><div class="section" title="Branch-Based Containers"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.branch"/>
3513             Branch-Based Containers
3514           </h6></div></div></div><p>In general, there are several families of tree-based
3515           underlying data structures: balanced node-based trees
3516           (e.g., red-black or AVL trees), high-probability
3517           balanced node-based trees (e.g., random treaps or
3518           skip-lists), competitive node-based trees (e.g., splay
3519           trees), vector-based "trees", and tries. (Additionally, there
3520           are disk-residing or network-residing trees, such as B-Trees
3521           and their numerous variants. An interface for this would have
3522           to deal with the execution model and ACID guarantees; this is
3523           out of the scope of this library.) Following are some
3524           observations on their application to different settings.</p><p>Of the balanced node-based trees, this library includes a
3525           red-black tree, as does standard (in
3526           practice). This type of tree is the "workhorse" of tree-based
3527           containers: it offers both reasonable modification and
3528           reasonable lookup time. Unfortunately, this data structure
3529           stores a huge amount of metadata. Each node must contain,
3530           besides a value, three pointers and a boolean. This type might
3531           be avoided if space is at a premium [austern00noset].</p><p>High-probability balanced node-based trees suffer the
3532           drawbacks of deterministic balanced trees. Although they are
3533           fascinating data structures, preliminary tests with them showed
3534           their performance was worse than red-black trees. The library
3535           does not contain any such trees, therefore.</p><p>Competitive node-based trees have two drawbacks. They are
3536           usually somewhat unbalanced, and they perform a large number of
3537           comparisons. Balanced trees perform one comparison per each
3538           node they encounter on a search path; a splay tree performs two
3539           comparisons. If the keys are complex objects, e.g.,
3540           <code class="classname">std::string</code>, this can increase the running time.
3541           Conversely, such trees do well when there is much locality of
3542           reference. It is difficult to determine in which case to prefer
3543           such trees over balanced trees. This library includes a splay
3544           tree.</p><p>Ordered-vector trees use very little space
3545           [austern00noset].
3546           They do not have any other advantages (at least in this
3547           implementation).</p><p>Large-fan-out PATRICIA tries have excellent lookup
3548           performance, but they do so through maintaining, for each node,
3549           a miniature "hash-table". Their space efficiency is low, and
3550           their modification performance is bad. These tries might be
3551           used for semi-static settings, where order preservation is
3552           important. Alternatively, red-black trees cross-referenced with
3553           hash tables can be used. [okasaki98mereable]
3554           discusses small-fan-out PATRICIA tries for integers, but the
3555           cited results seem to indicate that the amortized cost of
3556           maintaining such trees is higher than that of balanced trees.
3557           Moderate-fan-out trees might be useful for sequences where each
3558           element has a limited number of choices, e.g., DNA
3559           strings.</p></div><div class="section" title="Mapping-Semantics"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.mapping_semantics"/>
3560             Mapping-Semantics
3561           </h6></div></div></div><p>Different mapping semantics were discussed in the introduction and design sections.Here
3562           the focus will be on the case where a keys can be composed into
3563           primary keys and secondary keys. (In the case where some keys
3564           are completely identical, it is trivial that one should use an
3565           associative container mapping values to size types.) In this
3566           case there are (at least) five possibilities:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>Use an associative container that allows equivalent-key
3567             values (such as <code class="classname">std::multimap</code>)</p></li><li class="listitem"><p>Use a unique-key value associative container that maps
3568             each primary key to some complex associative container of
3569             secondary keys, say a tree-based or hash-based container.
3570             </p></li><li class="listitem"><p>Use a unique-key value associative container that maps
3571             each primary key to some simple associative container of
3572             secondary keys, say a list-based container.</p></li><li class="listitem"><p>Use a unique-key value associative container that maps
3573             each primary key to some non-associative container
3574             (e.g., <code class="classname">std::vector</code>)</p></li><li class="listitem"><p>Use a unique-key value associative container that takes
3575             into account both primary and secondary keys.</p></li></ol></div><p>Stated simply: there is a simple answer for this. (Excluding
3576           option 1, which should be avoided in all cases).</p><p>If the expected ratio of secondary keys to primary keys is
3577           small, then 3 and 4 seem reasonable. Both types of secondary
3578           containers are relatively lightweight (in terms of memory use
3579           and construction time), and so creating an entire container
3580           object for each primary key is not too expensive. Option 4
3581           might be preferable to option 3 if changing the secondary key
3582           of some primary key is frequent - one cannot modify an
3583           associative container's key, and the only possibility,
3584           therefore, is erasing the secondary key and inserting another
3585           one instead; a non-associative container, conversely, can
3586           support in-place modification. The actual cost of erasing a
3587           secondary key and inserting another one depends also on the
3588           allocator used for secondary associative-containers (The tests
3589           above used the standard allocator, but in practice one might
3590           choose to use, e.g., [boost_pool]). Option 2 is
3591           definitely an overkill in this case. Option 1 loses out either
3592           immediately (when there is one secondary key per primary key)
3593           or almost immediately after that. Option 5 has the same
3594           drawbacks as option 2, but it has the additional drawback that
3595           finding all values whose primary key is equivalent to some key,
3596           might be linear in the total number of values stored (for
3597           example, if using a hash-based container).</p><p>If the expected ratio of secondary keys to primary keys is
3598           large, then the answer is more complicated. It depends on the
3599           distribution of secondary keys to primary keys, the
3600           distribution of accesses according to primary keys, and the
3601           types of operations most frequent.</p><p>To be more precise, assume there are m primary keys,
3602           primary key i is mapped to n<sub>i</sub>
3603           secondary keys, and each primary key is mapped, on average, to
3604           n secondary keys (i.e.,
3605           E(n<sub>i</sub>) = n).</p><p>Suppose one wants to find a specific pair of primary and
3606           secondary keys. Using 1 with a tree based container
3607           (<code class="classname">std::multimap</code>), the expected cost is
3608           E(Θ(log(m) + n<sub>i</sub>)) = Θ(log(m) +
3609           n); using 1 with a hash-based container
3610           (<code class="classname">std::tr1::unordered_multimap</code>), the expected cost is
3611           Θ(n). Using 2 with a primary hash-based container
3612           and secondary hash-based containers, the expected cost is
3613           O(1); using 2 with a primary tree-based container and
3614           secondary tree-based containers, the expected cost is (using
3615           the Jensen inequality [motwani95random])
3616           E(O(log(m) + log(n<sub>i</sub>)) = O(log(m)) +
3617           E(O(log(n<sub>i</sub>)) = O(log(m)) + O(log(n)),
3618           assuming that primary keys are accessed equiprobably. 3 and 4
3619           are similar to 1, but with lower constants. Using 5 with a
3620           hash-based container, the expected cost is O(1); using 5
3621           with a tree based container, the cost is
3622           E(Θ(log(mn))) = Θ(log(m) +
3623           log(n)).</p><p>Suppose one needs the values whose primary key matches some
3624           given key. Using 1 with a hash-based container, the expected
3625           cost is Θ(n), but the values will not be ordered
3626           by secondary keys (which may or may not be required); using 1
3627           with a tree-based container, the expected cost is
3628           Θ(log(m) + n), but with high constants; again the
3629           values will not be ordered by secondary keys. 2, 3, and 4 are
3630           similar to 1, but typically with lower constants (and,
3631           additionally, if one uses a tree-based container for secondary
3632           keys, they will be ordered). Using 5 with a hash-based
3633           container, the cost is Θ(mn).</p><p>Suppose one wants to assign to a primary key all secondary
3634           keys assigned to a different primary key. Using 1 with a
3635           hash-based container, the expected cost is Θ(n),
3636           but with very high constants; using 1 with a tree-based
3637           container, the cost is Θ(nlog(mn)). Using 2, 3,
3638           and 4, the expected cost is Θ(n), but typically
3639           with far lower costs than 1. 5 is similar to 1.</p></div></div><div class="section" title="Priority_Queue"><div class="titlepage"><div><div><h5 class="title"><a id="observations.priority_queue"/>Priority_Queue</h5></div></div></div><div class="section" title="Complexity"><div class="titlepage"><div><div><h6 class="title"><a id="observations.priority_queue.complexity"/>Complexity</h6></div></div></div><p>The following table shows the complexities of the different
3640           underlying data structures in terms of orders of growth. It is
3641           interesting to note that this table implies something about the
3642           constants of the operations as well (see Amortized <code class="function">push</code>
3643           and <code class="function">pop</code> operations).</p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/></colgroup><thead><tr><th style="text-align: left"> </th><th style="text-align: left"><span class="emphasis"><em><code class="function">push</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">pop</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">modify</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">erase</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">join</code></em></span></th></tr></thead><tbody><tr><td style="text-align: left">
3644                     <code class="classname">std::priority_queue</code>
3645                   </td><td style="text-align: left">
3646                     Θ(n) worst
3647                     Θ(log(n)) amortized
3648                   </td><td style="text-align: left">
3649                     Θ(log(n)) Worst
3650                   </td><td style="text-align: left">
3651                     Θ(n log(n)) Worst
3652                     <sub>[std note 1]</sub>
3653                   </td><td style="text-align: left">
3654                     Θ(n log(n))
3655                     <sub>[std note 2]</sub>
3656                   </td><td style="text-align: left">
3657                     Θ(n log(n))
3658                     <sub>[std note 1]</sub>
3659                   </td></tr><tr><td style="text-align: left">
3660                     <code class="classname">priority_queue</code>
3661                     &lt;<code class="classname">Tag</code> =
3662                     <code class="classname">pairing_heap_tag</code>&gt;
3663                   </td><td style="text-align: left">
3664                     O(1)
3665                   </td><td style="text-align: left">
3666                     Θ(n) worst
3667                     Θ(log(n)) amortized
3668                   </td><td style="text-align: left">
3669                     Θ(n) worst
3670                     Θ(log(n)) amortized
3671                   </td><td style="text-align: left">
3672                     Θ(n) worst
3673                     Θ(log(n)) amortized
3674                   </td><td style="text-align: left">
3675                     O(1)
3676                   </td></tr><tr><td style="text-align: left">
3677                     <code class="classname">priority_queue</code>
3678                     &lt;<code class="classname">Tag</code> =
3679                     <code class="classname">binary_heap_tag</code>&gt;
3680                   </td><td style="text-align: left">
3681                     Θ(n) worst
3682                     Θ(log(n)) amortized
3683                   </td><td style="text-align: left">
3684                     Θ(n) worst
3685                     Θ(log(n)) amortized
3686                   </td><td style="text-align: left">
3687                     Θ(n)
3688                   </td><td style="text-align: left">
3689                     Θ(n)
3690                   </td><td style="text-align: left">
3691                     Θ(n)
3692                   </td></tr><tr><td style="text-align: left">
3693                     <code class="classname">priority_queue</code>
3694                     &lt;<code class="classname">Tag</code> =
3695                     <code class="classname">binomial_heap_tag</code>&gt;
3696                   </td><td style="text-align: left">
3697                     Θ(log(n)) worst
3698                     O(1) amortized
3699                   </td><td style="text-align: left">
3700                     Θ(log(n))
3701                   </td><td style="text-align: left">
3702                     Θ(log(n))
3703                   </td><td style="text-align: left">
3704                     Θ(log(n))
3705                   </td><td style="text-align: left">
3706                     Θ(log(n))
3707                   </td></tr><tr><td style="text-align: left">
3708                     <code class="classname">priority_queue</code>
3709                     &lt;<code class="classname">Tag</code> =
3710                     <code class="classname">rc_binomial_heap_tag</code>&gt;
3711                   </td><td style="text-align: left">
3712                     O(1)
3713                   </td><td style="text-align: left">
3714                     Θ(log(n))
3715                   </td><td style="text-align: left">
3716                     Θ(log(n))
3717                   </td><td style="text-align: left">
3718                     Θ(log(n))
3719                   </td><td style="text-align: left">
3720                     Θ(log(n))
3721                   </td></tr><tr><td style="text-align: left">
3722                     <code class="classname">priority_queue</code>&lt;<code class="classname">Tag</code> =
3723                     <code class="classname">thin_heap_tag</code>&gt;
3724                   </td><td style="text-align: left">
3725                     O(1)
3726                   </td><td style="text-align: left">
3727                     Θ(n) worst
3728                     Θ(log(n)) amortized
3729                   </td><td style="text-align: left">
3730                     Θ(log(n)) worst
3731                     O(1) amortized,
3732                     or Θ(log(n)) amortized
3733                     <sub>[thin_heap_note]</sub>
3734                   </td><td style="text-align: left">
3735                     Θ(n) worst
3736                     Θ(log(n)) amortized
3737                   </td><td style="text-align: left">
3738                     Θ(n)
3739                   </td></tr></tbody></table></div><p>[std note 1] This
3740           is not a property of the algorithm, but rather due to the fact
3741           that the standard's priority queue implementation does not support
3742           iterators (and consequently the ability to access a specific
3743           value inside it). If the priority queue is adapting an
3744           <code class="classname">std::vector</code>, then it is still possible to reduce this
3745           to Θ(n) by adapting over the standard's adapter and
3746           using the fact that <code class="function">top</code> returns a reference to the
3747           first value; if, however, it is adapting an
3748           <code class="classname">std::deque</code>, then this is impossible.</p><p>[std note 2] As
3749           with [std note 1], this is not a
3750           property of the algorithm, but rather the standard's implementation.
3751           Again, if the priority queue is adapting an
3752           <code class="classname">std::vector</code> then it is possible to reduce this to
3753           Θ(n), but with a very high constant (one must call
3754           <code class="function">std::make_heap</code> which is an expensive linear
3755           operation); if the priority queue is adapting an
3756           <code class="classname">std::deque</code>, then this is impossible.</p><p>[thin_heap_note] A thin heap has
3757           Θ(log(n)) worst case <code class="function">modify</code> time
3758           always, but the amortized time depends on the nature of the
3759           operation: I) if the operation increases the key (in the sense
3760           of the priority queue's comparison functor), then the amortized
3761           time is O(1), but if II) it decreases it, then the
3762           amortized time is the same as the worst case time. Note that
3763           for most algorithms, I) is important and II) is not.</p></div><div class="section" title="Amortized push and pop operations"><div class="titlepage"><div><div><h6 class="title"><a id="observations.priority_queue.amortized_ops"/>
3764             Amortized <code class="function">push</code>
3765             and <code class="function">pop</code> operations
3766           </h6></div></div></div><p>In many cases, a priority queue is needed primarily for
3767           sequences of <code class="function">push</code> and <code class="function">pop</code> operations. All of
3768           the underlying data structures have the same amortized
3769           logarithmic complexity, but they differ in terms of
3770           constants.</p><p>The table above shows that the different data structures are
3771           "constrained" in some respects. In general, if a data structure
3772           has lower worst-case complexity than another, then it will
3773           perform slower in the amortized sense. Thus, for example a
3774           redundant-counter binomial heap (<code class="classname">priority_queue</code> with
3775           <code class="classname">Tag</code> = <code class="classname">rc_binomial_heap_tag</code>)
3776           has lower worst-case <code class="function">push</code> performance than a binomial
3777           heap (<code class="classname">priority_queue</code>
3778           with <code class="classname">Tag</code> = <code class="classname">binomial_heap_tag</code>),
3779           and so its amortized <code class="function">push</code> performance is slower in
3780           terms of constants.</p><p>As the table shows, the "least constrained" underlying
3781           data structures are binary heaps and pairing heaps.
3782           Consequently, it is not surprising that they perform best in
3783           terms of amortized constants.</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>Pairing heaps seem to perform best for non-primitive
3784             types (e.g., <code class="classname">std::string</code>s), as shown by
3785             Priority
3786             Queue Text <code class="function">push</code> Timing Test and Priority
3787             Queue Text <code class="function">push</code> and <code class="function">pop</code> Timing
3788             Test</p></li><li class="listitem"><p>binary heaps seem to perform best for primitive types
3789             (e.g., <span class="type">int</span>s), as shown by Priority
3790             Queue Random Integer <code class="function">push</code> Timing Test and
3791             Priority
3792             Queue Random Integer <code class="function">push</code> and <code class="function">pop</code> Timing
3793             Test.</p></li></ol></div></div><div class="section" title="Graph Algorithms"><div class="titlepage"><div><div><h6 class="title"><a id="observations.priority_queue.graphs"/>
3794             Graph Algorithms
3795           </h6></div></div></div><p>In some graph algorithms, a decrease-key operation is
3796           required [clrs2001];
3797           this operation is identical to <code class="function">modify</code> if a value is
3798           increased (in the sense of the priority queue's comparison
3799           functor). The table above and Priority Queue
3800           Text <code class="function">modify</code> Up Timing Test show that a thin heap
3801           (<code class="classname">priority_queue</code> with
3802           <code class="classname">Tag</code> = <code class="classname">thin_heap_tag</code>)
3803           outperforms a pairing heap (<code class="classname">priority_queue</code> with
3804           <code class="classname">Tag</code> = <code class="classname">Tag</code> = <code class="classname">pairing_heap_tag</code>),
3805           but the rest of the tests show otherwise.</p><p>This makes it difficult to decide which implementation to use in
3806           this case. Dijkstra's shortest-path algorithm, for example, requires
3807           Θ(n) <code class="function">push</code> and <code class="function">pop</code> operations
3808           (in the number of vertices), but O(n<sup>2</sup>)
3809           <code class="function">modify</code> operations, which can be in practice Θ(n)
3810           as well. It is difficult to find an a-priori characterization of
3811           graphs in which the actual number of <code class="function">modify</code>
3812           operations will dwarf the number of <code class="function">push</code> and
3813           <code class="function">pop</code> operations.</p></div></div></div></div></div><div class="navfooter"><hr/><table width="100%" summary="Navigation footer"><tr><td align="left"><a accesskey="p" href="policy_data_structures_design.html">Prev</a> </td><td align="center"><a accesskey="u" href="policy_data_structures.html">Up</a></td><td align="right"> <a accesskey="n" href="policy_data_structures_biblio.html">Next</a></td></tr><tr><td align="left" valign="top">Design </td><td align="center"><a accesskey="h" href="../index.html">Home</a></td><td align="right" valign="top"> Acknowledgments</td></tr></table></div></body></html>