[rucksack-devel] binary search in find-subnode
Cyrus Harmon
ch-rucksack at bobobeach.com
Sun Jan 14 19:35:25 UTC 2007
Ah, whoops. Pasted wrong function. But the one I have doesn't work
either. Will resend in a moment after I (hopefully) fix it.
Cyrus
On Jan 14, 2007, at 11:19 AM, Cyrus Harmon wrote:
> And for find-binding-in-node:
>
> (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.")))
>
> Cyrus
>
>
>
> On Jan 14, 2007, at 11:02 AM, Cyrus Harmon wrote:
>
>>
>> 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
>>
>> _______________________________________________
>> rucksack-devel mailing list
>> rucksack-devel at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/rucksack-devel
>
> _______________________________________________
> rucksack-devel mailing list
> rucksack-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/rucksack-devel
More information about the rucksack-devel
mailing list