Hey Harmon,

On Tue, May 26 2020, Harmon Nine wrote:
> Does such an optimization exist?  If not, is there an means of getting the 
> next-key in a sorted-map given a current-key that is better than O(n)?

I just had a look at clojure.core and found that subseq operates on a
sorted collection. Based on my quick test I think it can find the next
element in a sublinear number of comparisons:

(def ^:dynamic comparisons nil)
(defn count-comparisons [x]
  (when comparisons (swap! comparisons inc))
  x)
(def s (into (sorted-set-by (comp count-comparisons compare))
             (range 1000)))

(= (for [i (range 1001)]
     (first (subseq s > (- i 0.5))))
   (concat (range 1000) [nil]))
;; true

(frequencies
 (for [i (range 1001)]
   (binding [comparisons (atom 0)]
     (first (subseq s > (- i 0.5)))
     @comparisons)))
;; => {10 256, 11 384, 12 192, 13 96, 14 56, 15 16, 16 1}

I can only confirm that this works for > and >= as the comparison,
though, which are interpreted relative to the sort order for the
collection. Switching the sort order in the collection effectively flips
the meaning of >, too.

(def s2 (into (sorted-set-by (comp - compare))
              (range 1000)))
(= (for [i (range 1001)]
     (first (subseq s2 > (- i 0.5))))
   (cons nil (range 1000)))
;; true

Other comparisons seem to fall back to just calling take-while, which
doesn't seem right to me.

I hope that helps!

Carlo

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/clojure/87367nsl23.fsf%40gmail.com.

Reply via email to