[rucksack-devel] binary search in find-subnode

Cyrus Harmon ch-rucksack at bobobeach.com
Sun Jan 14 19:02:34 UTC 2007


Well, it took me longer than I'd care to admit to get this right, but  
here's what I came up with for the binary search routine. I'm sure  
this could be cleaned up a bit, but if anyone with a fresh set of  
eyes wants to take a look at this, I'd appreciate it:

(defun find-subnode (btree node key)
   "Returns the subnode that contains more information for the given  
key."
   (let ((btree-key< (btree-key< btree))
         (last (1- (btree-node-index-count node))))
     (labels ((binary-search (start end)
                (let* ((mid (+ start (truncate (- end start) 2)))
                       (mid-binding (node-binding node mid)))
                  (if (= start mid)
                      (if (not (funcall btree-key< (binding-key mid- 
binding) key))
                          (binding-value mid-binding)
                          (binding-value (node-binding node (1+ mid))))
                      (if (not (funcall btree-key< (binding-key mid- 
binding) key))
                          (binary-search start mid)
                          (binary-search mid end))))))
       (if (funcall btree-key< (binding-key (node-binding node (1-  
last))) key)
           (binding-value (node-binding node last))
           (binary-search 0 (1- last)))))
   ;;; this is the old (linear search) version kept here for reference
   ;;; for the moment
   #+nil
   (progn
     (loop with btree-key< = (btree-key< btree)
        with last-index = (1- (btree-node-index-count node))
        for i to last-index
        for binding = (node-binding node i)
        when (or (= i last-index)
                 (funcall btree-key< key (binding-key binding))
                 (not (funcall btree-key< (binding-key binding) key)))
        do (return-from find-subnode (binding-value binding)))
     (error "This shouldn't happen.")))


Thanks,

Cyrus




More information about the rucksack-devel mailing list