Repository navigation
Commit 1a49f80
committed
Choose the QuickSelect pivot by median of three
partition took its pivot from a fixed position, arr[lo]. On an ordered range that
is the smallest element, so each partition strips one element instead of about
half, and select becomes quadratic. At 16k elements it costs 100,667,391
comparisons where 32,727 suffice.
Using the median of arr[lo], the middle and arr[hi] makes an ordered range the
best case rather than the worst, since the middle element of an ordered range is
its true median. It also leaves arr[hi] >= the pivot, which bounds the ascending
scan, so both scans drop their per-element bound check.
No caller reaches the quadratic case today: every one passes an array read out of
a hash table, and theta indexes slots by the low bits of the hash, which are
independent of its magnitude. Feeding a union gadget strictly ascending hashes
still yields a table whose ascending-adjacent-pair fraction is 0.51. The exposure
is QuickSelect being public API, where ordered input is unremarkable, and a
compact ordered sketch's hashes are sorted.
Speed on the library's own inputs is unchanged either way, within 6% in both
directions depending on how full the hash table is.
The existing tests all shuffle before asserting, so ordered input was never
covered. They now also run ascending, descending and all-equal input, plus a
large ordered array under a time limit, which is the only way the quadratic path
can be caught given it returns the correct value.1 parent 3a1bf7f commit 1a49f80
2 files changed
Lines changed: 111 additions & 22 deletions
File tree
- src
- main/java/org/apache/datasketches/common
- test/java/org/apache/datasketches/thetacommon
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
107 | 107 | | |
108 | 108 | | |
109 | 109 | | |
110 | | - | |
| 110 | + | |
| 111 | + | |
111 | 112 | | |
112 | 113 | | |
113 | 114 | | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
124 | 118 | | |
125 | 119 | | |
126 | 120 | | |
| |||
135 | 129 | | |
136 | 130 | | |
137 | 131 | | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
138 | 147 | | |
139 | 148 | | |
140 | 149 | | |
| |||
211 | 220 | | |
212 | 221 | | |
213 | 222 | | |
214 | | - | |
| 223 | + | |
| 224 | + | |
215 | 225 | | |
216 | 226 | | |
217 | 227 | | |
218 | | - | |
219 | | - | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
228 | 231 | | |
229 | 232 | | |
230 | 233 | | |
| |||
239 | 242 | | |
240 | 243 | | |
241 | 244 | | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
242 | 259 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| 56 | + | |
| 57 | + | |
56 | 58 | | |
57 | 59 | | |
58 | 60 | | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
59 | 79 | | |
60 | 80 | | |
61 | 81 | | |
| |||
116 | 136 | | |
117 | 137 | | |
118 | 138 | | |
| 139 | + | |
| 140 | + | |
119 | 141 | | |
120 | 142 | | |
121 | 143 | | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
122 | 161 | | |
123 | 162 | | |
124 | 163 | | |
| |||
164 | 203 | | |
165 | 204 | | |
166 | 205 | | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
167 | 239 | | |
168 | 240 | | |
169 | 241 | | |
| |||
0 commit comments