Here's a round of benchmarks for the new functions (avl/{nearest,subrange,split-at,split-key}), with a lookup benchmark included as a point of reference.
Cheers, Michał (let [m (apply avl/sorted-map (interleave (range 100000) (range 100000)))] (c/bench (get m 99999)) (c/bench (avl/nearest m < 100000)) (c/bench (avl/subrange m >= 10000 < 75000)) (c/bench (avl/split-at 30000 m)) (c/bench (avl/split-key 30000 m))) WARNING: Final GC required 4.244287716089524 % of runtime Evaluation count : 213693000 in 60 samples of 3561550 calls. Execution time mean : 278.027014 ns Execution time std-deviation : 4.284738 ns Execution time lower quantile : 273.830485 ns ( 2.5%) Execution time upper quantile : 287.103701 ns (97.5%) Overhead used : 2.289159 ns Found 10 outliers in 60 samples (16.6667 %) low-severe 9 (15.0000 %) low-mild 1 (1.6667 %) Variance from outliers : 1.6389 % Variance is slightly inflated by outliers Evaluation count : 168881400 in 60 samples of 2814690 calls. Execution time mean : 352.393290 ns Execution time std-deviation : 5.226142 ns Execution time lower quantile : 346.698762 ns ( 2.5%) Execution time upper quantile : 364.246208 ns (97.5%) Overhead used : 2.289159 ns Found 4 outliers in 60 samples (6.6667 %) low-severe 4 (6.6667 %) Variance from outliers : 1.6389 % Variance is slightly inflated by outliers Evaluation count : 1333200 in 60 samples of 22220 calls. Execution time mean : 45.605490 µs Execution time std-deviation : 682.937868 ns Execution time lower quantile : 44.839275 µs ( 2.5%) Execution time upper quantile : 47.176367 µs (97.5%) Overhead used : 2.289159 ns Found 3 outliers in 60 samples (5.0000 %) low-severe 3 (5.0000 %) Variance from outliers : 1.6389 % Variance is slightly inflated by outliers Evaluation count : 2338740 in 60 samples of 38979 calls. Execution time mean : 25.715076 µs Execution time std-deviation : 366.924494 ns Execution time lower quantile : 25.249912 µs ( 2.5%) Execution time upper quantile : 26.592419 µs (97.5%) Overhead used : 2.289159 ns Found 2 outliers in 60 samples (3.3333 %) low-severe 2 (3.3333 %) Variance from outliers : 1.6389 % Variance is slightly inflated by outliers Evaluation count : 2596800 in 60 samples of 43280 calls. Execution time mean : 23.343989 µs Execution time std-deviation : 308.669720 ns Execution time lower quantile : 22.908707 µs ( 2.5%) Execution time upper quantile : 24.143221 µs (97.5%) Overhead used : 2.289159 ns Found 4 outliers in 60 samples (6.6667 %) low-severe 4 (6.6667 %) Variance from outliers : 1.6389 % Variance is slightly inflated by outliers On 24 April 2014 08:51, Michał Marczyk <michal.marc...@gmail.com> wrote: > Cheers Alex! > > See below for the results of yesterday's run of my benchmark suite for > the basic operations. (I'll post some benchmark results for the new > functions in a separate message sometime soon.) > > In general, it's fair to expect (persistent) assoc/dissoc to be slower > with data.avl maps, since AVL trees do more work to rebalance > themselves than red-black trees. (That's on average, of course.) > > The upside is that lookups in AVL trees are faster on average, > sometimes quite dramatically, due to the trees being shallower. It's > worth pointing out that this really is "on average" -- individual > timings depend on the path through the tree the lookup operation needs > to traverse, and for nodes at exactly the same position in the tree > the built-ins are slightly faster (23.9 ns vs. 25.5 ns for a lookup > succeeding at the root node, see the (get % 131071) benchmark case > below; as I recall, 0 happens to occupy the same position in both > benchmark maps as well) -- but if we hit a deeper part of a red-black > tree, data.avl is likely to win by a large margin, as in the case of > the 311 ns (data.avl) vs. 588 ns (built-in) result for looking up > 299999 in the two benchmark maps. > > For longer chains of "updates" -- including construction of instances > with more than a handful of elements -- data.avl wins thanks to its > support for transients; in particular, inserting 300000 entries in > ascending order of keys took 197 ns with data.avl's sorted-map during > my benchmark run yesterday vs. 317 ns with the built-in. > > > ;;; the setup: > > (def ks (range 300000)) > (def ksks (interleave ks ks)) > > (def rb (apply sorted-map ksks)) > (def avl (apply avl/sorted-map ksks)) > > ;;; the actual benchmark run > > Clojure 1.5.1 > user=> (all-benchmarks) > (lookup-benchmarks) > =================== > (c/bench (get avl 0)) > WARNING: Final GC required 17.95425214438086 % of runtime > WARNING: Final GC required 1.44548564181991 % of runtime > Evaluation count : 233348580 in 60 samples of 3889143 calls. > Execution time mean : 257.269857 ns > Execution time std-deviation : 2.083817 ns > Execution time lower quantile : 254.044412 ns ( 2.5%) > Execution time upper quantile : 261.944879 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (get rb 0)) > WARNING: Final GC required 1.443796805141993 % of runtime > Evaluation count : 245219880 in 60 samples of 4086998 calls. > Execution time mean : 244.222199 ns > Execution time std-deviation : 1.613109 ns > Execution time lower quantile : 240.981893 ns ( 2.5%) > Execution time upper quantile : 247.680884 ns (97.5%) > Overhead used : 2.115402 ns > (c/bench (get avl 131071)) > WARNING: Final GC required 1.538687432575083 % of runtime > Evaluation count : 2189108520 in 60 samples of 36485142 calls. > Execution time mean : 25.463933 ns > Execution time std-deviation : 0.159206 ns > Execution time lower quantile : 25.242537 ns ( 2.5%) > Execution time upper quantile : 25.846594 ns (97.5%) > Overhead used : 2.115402 ns > > Found 2 outliers in 60 samples (3.3333 %) > low-severe 2 (3.3333 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (get rb 131071)) > WARNING: Final GC required 1.544907815808739 % of runtime > Evaluation count : 2306183280 in 60 samples of 38436388 calls. > Execution time mean : 23.873777 ns > Execution time std-deviation : 0.243375 ns > Execution time lower quantile : 23.590693 ns ( 2.5%) > Execution time upper quantile : 24.503250 ns (97.5%) > Overhead used : 2.115402 ns > > Found 3 outliers in 60 samples (5.0000 %) > low-severe 1 (1.6667 %) > low-mild 2 (3.3333 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (get avl 299999)) > WARNING: Final GC required 1.4317314000518289 % of runtime > Evaluation count : 192818880 in 60 samples of 3213648 calls. > Execution time mean : 311.396507 ns > Execution time std-deviation : 2.029572 ns > Execution time lower quantile : 308.219265 ns ( 2.5%) > Execution time upper quantile : 315.544485 ns (97.5%) > Overhead used : 2.115402 ns > (c/bench (get rb 299999)) > WARNING: Final GC required 1.424486278904469 % of runtime > Evaluation count : 102060180 in 60 samples of 1701003 calls. > Execution time mean : 588.846851 ns > Execution time std-deviation : 3.124839 ns > Execution time lower quantile : 584.394022 ns ( 2.5%) > Execution time upper quantile : 594.415623 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (construction-benchmarks) > ========================= > (c/bench (apply avl/sorted-map ksks)) > WARNING: Final GC required 5.3006864743254365 % of runtime > Evaluation count : 360 in 60 samples of 6 calls. > Execution time mean : 197.715700 ms > Execution time std-deviation : 1.410989 ms > Execution time lower quantile : 195.528307 ms ( 2.5%) > Execution time upper quantile : 200.733827 ms (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (apply sorted-map ksks)) > WARNING: Final GC required 4.7280630882454275 % of runtime > Evaluation count : 240 in 60 samples of 4 calls. > Execution time mean : 317.073457 ms > Execution time std-deviation : 1.799728 ms > Execution time lower quantile : 314.404224 ms ( 2.5%) > Execution time upper quantile : 320.886432 ms (97.5%) > Overhead used : 2.115402 ns > (assoc-benchmarks) > ================== > (c/bench (assoc avl -1 -1)) > WARNING: Final GC required 1.4272766765260692 % of runtime > Evaluation count : 94731120 in 60 samples of 1578852 calls. > Execution time mean : 640.949880 ns > Execution time std-deviation : 5.268487 ns > Execution time lower quantile : 632.929494 ns ( 2.5%) > Execution time upper quantile : 651.026693 ns (97.5%) > Overhead used : 2.115402 ns > (c/bench (assoc rb -1 -1)) > WARNING: Final GC required 1.4813094150003698 % of runtime > Evaluation count : 101334900 in 60 samples of 1688915 calls. > Execution time mean : 586.478825 ns > Execution time std-deviation : 6.445327 ns > Execution time lower quantile : 577.251444 ns ( 2.5%) > Execution time upper quantile : 600.983215 ns (97.5%) > Overhead used : 2.115402 ns > > Found 2 outliers in 60 samples (3.3333 %) > low-severe 2 (3.3333 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (assoc avl 131071.5 131071.5)) > WARNING: Final GC required 1.44705071828203 % of runtime > Evaluation count : 89874900 in 60 samples of 1497915 calls. > Execution time mean : 674.654642 ns > Execution time std-deviation : 7.380872 ns > Execution time lower quantile : 662.647528 ns ( 2.5%) > Execution time upper quantile : 690.152387 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (assoc rb 131071.5 131071.5)) > WARNING: Final GC required 1.476998263803252 % of runtime > Evaluation count : 104773620 in 60 samples of 1746227 calls. > Execution time mean : 581.851687 ns > Execution time std-deviation : 5.236315 ns > Execution time lower quantile : 573.394307 ns ( 2.5%) > Execution time upper quantile : 591.444744 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (assoc avl 300000 300000)) > WARNING: Final GC required 1.4573754017132279 % of runtime > Evaluation count : 52686120 in 60 samples of 878102 calls. > Execution time mean : 1.143503 µs > Execution time std-deviation : 8.905816 ns > Execution time lower quantile : 1.128491 µs ( 2.5%) > Execution time upper quantile : 1.161180 µs (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (assoc rb 300000 300000)) > WARNING: Final GC required 1.4453736865925522 % of runtime > Evaluation count : 61066200 in 60 samples of 1017770 calls. > Execution time mean : 986.964073 ns > Execution time std-deviation : 9.099675 ns > Execution time lower quantile : 971.014487 ns ( 2.5%) > Execution time upper quantile : 1.005402 µs (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (dissoc-benchmarks) > =================== > (c/bench (dissoc avl 0)) > WARNING: Final GC required 1.409625923637254 % of runtime > Evaluation count : 95106480 in 60 samples of 1585108 calls. > Execution time mean : 632.360192 ns > Execution time std-deviation : 6.758100 ns > Execution time lower quantile : 622.348742 ns ( 2.5%) > Execution time upper quantile : 644.801029 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (dissoc rb 0)) > WARNING: Final GC required 1.4395319870486911 % of runtime > Evaluation count : 98152980 in 60 samples of 1635883 calls. > Execution time mean : 616.735094 ns > Execution time std-deviation : 7.850262 ns > Execution time lower quantile : 603.999108 ns ( 2.5%) > Execution time upper quantile : 631.343617 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (dissoc avl 131071)) > WARNING: Final GC required 1.521591424378216 % of runtime > Evaluation count : 221033940 in 60 samples of 3683899 calls. > Execution time mean : 274.098530 ns > Execution time std-deviation : 2.452287 ns > Execution time lower quantile : 270.107011 ns ( 2.5%) > Execution time upper quantile : 279.445027 ns (97.5%) > Overhead used : 2.115402 ns > > Found 6 outliers in 60 samples (10.0000 %) > low-severe 6 (10.0000 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (dissoc rb 131071)) > WARNING: Final GC required 1.518838691811953 % of runtime > Evaluation count : 110069460 in 60 samples of 1834491 calls. > Execution time mean : 544.040051 ns > Execution time std-deviation : 6.594133 ns > Execution time lower quantile : 533.460485 ns ( 2.5%) > Execution time upper quantile : 559.612526 ns (97.5%) > Overhead used : 2.115402 ns > > Found 2 outliers in 60 samples (3.3333 %) > low-severe 2 (3.3333 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (dissoc avl 299999)) > WARNING: Final GC required 1.4221011007954931 % of runtime > Evaluation count : 55003980 in 60 samples of 916733 calls. > Execution time mean : 1.106014 µs > Execution time std-deviation : 7.937471 ns > Execution time lower quantile : 1.090420 µs ( 2.5%) > Execution time upper quantile : 1.119023 µs (97.5%) > Overhead used : 2.115402 ns > (c/bench (dissoc rb 299999)) > WARNING: Final GC required 1.4984644559577371 % of runtime > Evaluation count : 69322080 in 60 samples of 1155368 calls. > Execution time mean : 866.398607 ns > Execution time std-deviation : 9.504058 ns > Execution time lower quantile : 851.988220 ns ( 2.5%) > Execution time upper quantile : 887.694665 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (reduce-kv-benchmarks) > ====================== > (c/bench (reduce-kv + 0 avl)) > WARNING: Final GC required 1.4943999357205922 % of runtime > Evaluation count : 1680 in 60 samples of 28 calls. > Execution time mean : 37.019830 ms > Execution time std-deviation : 211.307503 µs > Execution time lower quantile : 36.602312 ms ( 2.5%) > Execution time upper quantile : 37.377517 ms (97.5%) > Overhead used : 2.115402 ns > (c/bench (reduce-kv + 0 rb)) > WARNING: Final GC required 1.470636145118843 % of runtime > Evaluation count : 1500 in 60 samples of 25 calls. > Execution time mean : 41.019274 ms > Execution time std-deviation : 285.334885 µs > Execution time lower quantile : 40.541044 ms ( 2.5%) > Execution time upper quantile : 41.504517 ms (97.5%) > Overhead used : 2.115402 ns > (select-benchmarks) > =================== > (c/bench (nth avl 0)) > WARNING: Final GC required 1.494616669407989 % of runtime > Evaluation count : 222102300 in 60 samples of 3701705 calls. > Execution time mean : 269.443606 ns > Execution time std-deviation : 2.158203 ns > Execution time lower quantile : 265.797360 ns ( 2.5%) > Execution time upper quantile : 273.406291 ns (97.5%) > Overhead used : 2.115402 ns > (c/bench (nth (seq rb) 0)) > WARNING: Final GC required 1.420496053869465 % of runtime > Evaluation count : 272733660 in 60 samples of 4545561 calls. > Execution time mean : 218.593345 ns > Execution time std-deviation : 1.965696 ns > Execution time lower quantile : 215.009791 ns ( 2.5%) > Execution time upper quantile : 221.595814 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (nth avl 131071)) > WARNING: Final GC required 1.4913582150274651 % of runtime > Evaluation count : 2340271560 in 60 samples of 39004526 calls. > Execution time mean : 23.958321 ns > Execution time std-deviation : 0.273586 ns > Execution time lower quantile : 23.512070 ns ( 2.5%) > Execution time upper quantile : 24.470681 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (nth (seq rb) 131071)) > WARNING: Final GC required 1.442980458629981 % of runtime > Evaluation count : 15240 in 60 samples of 254 calls. > Execution time mean : 3.971846 ms > Execution time std-deviation : 37.538641 µs > Execution time lower quantile : 3.908583 ms ( 2.5%) > Execution time upper quantile : 4.046135 ms (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (nth avl 299999)) > WARNING: Final GC required 1.396166903433299 % of runtime > Evaluation count : 62932200 in 60 samples of 1048870 calls. > Execution time mean : 966.061999 ns > Execution time std-deviation : 12.227245 ns > Execution time lower quantile : 950.801928 ns ( 2.5%) > Execution time upper quantile : 994.606117 ns (97.5%) > Overhead used : 2.115402 ns > > Found 4 outliers in 60 samples (6.6667 %) > low-severe 3 (5.0000 %) > low-mild 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (nth (seq rb) 299999)) > WARNING: Final GC required 1.411884727250311 % of runtime > Evaluation count : 3480 in 60 samples of 58 calls. > Execution time mean : 17.404103 ms > Execution time std-deviation : 125.910185 µs > Execution time lower quantile : 17.180238 ms ( 2.5%) > Execution time upper quantile : 17.698525 ms (97.5%) > Overhead used : 2.115402 ns > > Found 2 outliers in 60 samples (3.3333 %) > low-severe 2 (3.3333 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (rank-of-benchmarks) > ==================== > (c/bench (avl/rank-of avl 0)) > WARNING: Final GC required 1.410760546097934 % of runtime > Evaluation count : 228328740 in 60 samples of 3805479 calls. > Execution time mean : 262.229200 ns > Execution time std-deviation : 1.545106 ns > Execution time lower quantile : 260.026098 ns ( 2.5%) > Execution time upper quantile : 265.501717 ns (97.5%) > Overhead used : 2.115402 ns > (c/bench (rb-rank-of rb 0)) > WARNING: Final GC required 1.528903400498107 % of runtime > Evaluation count : 122421060 in 60 samples of 2040351 calls. > Execution time mean : 489.908995 ns > Execution time std-deviation : 4.341988 ns > Execution time lower quantile : 483.130264 ns ( 2.5%) > Execution time upper quantile : 497.383919 ns (97.5%) > Overhead used : 2.115402 ns > > Found 1 outliers in 60 samples (1.6667 %) > low-severe 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (avl/rank-of avl 131071)) > WARNING: Final GC required 1.601437516988401 % of runtime > Evaluation count : 1923909240 in 60 samples of 32065154 calls. > Execution time mean : 29.024185 ns > Execution time std-deviation : 0.271967 ns > Execution time lower quantile : 28.621628 ns ( 2.5%) > Execution time upper quantile : 29.530897 ns (97.5%) > Overhead used : 2.115402 ns > > Found 3 outliers in 60 samples (5.0000 %) > low-severe 2 (3.3333 %) > low-mild 1 (1.6667 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (rb-rank-of rb 131071)) > WARNING: Final GC required 1.5253557008726901 % of runtime > Evaluation count : 2700 in 60 samples of 45 calls. > Execution time mean : 22.259014 ms > Execution time std-deviation : 176.571734 µs > Execution time lower quantile : 21.949530 ms ( 2.5%) > Execution time upper quantile : 22.639924 ms (97.5%) > Overhead used : 2.115402 ns > (c/bench (avl/rank-of avl 299999)) > WARNING: Final GC required 1.46116006270368 % of runtime > Evaluation count : 139283400 in 60 samples of 2321390 calls. > Execution time mean : 429.526612 ns > Execution time std-deviation : 3.425081 ns > Execution time lower quantile : 425.422751 ns ( 2.5%) > Execution time upper quantile : 437.939328 ns (97.5%) > Overhead used : 2.115402 ns > > Found 2 outliers in 60 samples (3.3333 %) > low-severe 2 (3.3333 %) > Variance from outliers : 1.6389 % Variance is slightly inflated by outliers > (c/bench (rb-rank-of rb 299999)) > WARNING: Final GC required 1.5002581976759541 % of runtime > Evaluation count : 1200 in 60 samples of 20 calls. > Execution time mean : 50.728340 ms > Execution time std-deviation : 353.191435 µs > Execution time lower quantile : 50.130720 ms ( 2.5%) > Execution time upper quantile : 51.368250 ms (97.5%) > Overhead used : 2.115402 ns > nil > > > On 23 April 2014 18:37, Alex Miller <a...@puredanger.com> wrote: >> Great work as always! >> >> Are there any places where data.avl performs worse than the built-in sorted >> maps and sets? >> >> >> On Wednesday, April 23, 2014 7:59:59 AM UTC-5, Michał Marczyk wrote: >>> >>> Hi, >>> >>> I am pleased to announce the 0.0.12 release of data.avl, a Clojure >>> Contrib library providing drop-in replacements for Clojure(Script)'s >>> built-in sorted maps and sets with additional functionality: >>> >>> 1. real (non-view) logarithmic-time slicing and splits; >>> >>> 2. logarithmic-time nearest neighbour lookups and rank queries; >>> >>> 3. support for transients. >>> >>> This release is identical to 0.0.12-alpha1 except for the fact that >>> the Vars clojure.data.avl/empty-{set,map}-hash{eq,code} are now marked >>> private, as they should be. >>> >>> Changes since 0.0.11 include an important fix to the rebalancing >>> algorithm, so I would strongly advise all users of 0.0.11 to upgrade >>> as soon as possible. There are also several new additions to the API, >>> on which more below. >>> >>> [org.clojure/data.avl "0.0.12"] >>> >>> <dependency> >>> <groupId>org.clojure</groupId> >>> <artifactId>data.avl</artifactId> >>> <version>0.0.12</version> >>> </dependency> >>> >>> org.clojure:data.avl:0.0.12 >>> >>> The following transcript of a REPL session includes calls to each of >>> the new public functions: >>> >>> (require '[clojure.data.avl :as avl]) >>> >>> (avl/nearest (avl/sorted-set 0 1 2) < 2) >>> ;= 1 >>> >>> (avl/subrange (avl/sorted-set 0 1 2 3 4 5) >= 1 < 4) >>> ;= #{1 2 3} >>> >>> (avl/split-at 2 (avl/sorted-set 0 1 2 3 4 5)) >>> ;= [#{0 1} #{2 3 4 5}] >>> >>> (avl/split-key 3 (avl/sorted-set 0 2 4 6)) >>> ;= [#{0 2} nil #{4 6}] >>> >>> All of these functions operate in time logarithmic in the size of >>> their inputs. avl/subrange returns a data.avl collection of the same >>> type as its input and completely independent from it -- that is, it >>> shares structure with the input where possible, but does not hold on >>> to any parts of the tree containing keys that should not be present in >>> the output. avl/split-at and avl/split-key return similarly >>> independent data.avl collections; the middle element of the vector >>> returned by split-key is the element at the split key if present in >>> the input, nil otherwise. >>> >>> "split" is the name usually applied in the literature to the operation >>> that splits a tree into a "left" tree, a middle element and a "right" >>> tree. "subrange" could also be called "slice". The split-* functions >>> take their collection argument last to be consistent with >>> clojure.core's split-at and split-with. Arguments accepted by subrange >>> are analogous to those taken by subseq/rsubseq. >>> >>> Many thanks to the two new contributors to this release (listed here >>> in chronological order of ticket creation): Pepijn de Vos, who >>> prompted me to develop the above-mentioned new features by creating >>> the ticket asking for what is now avl/nearest and mentioning >>> java.util.Navigable{Map,Set}, and who provided new tests for >>> avl/nearest; and Andy Fingerhut, who kept on top of the hashing >>> changes and provided the initial implementation of new-style hasheq >>> for data.avl with further tests. >>> >>> Cheers, >>> Michał >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with your >> first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.