Fix longest prefix match
This commit is contained in:
parent
dbc2923b7b
commit
d27dd3a5a3
|
@ -77,15 +77,22 @@
|
|||
[setter! (rt-setter bit)]
|
||||
[orig-label (rt-edge-label orig-edge)]
|
||||
[orig-target (rt-edge-target orig-edge)]
|
||||
[new-orig-edge (rt-edge (drop orig-label prefix-len) orig-target)]
|
||||
[new-insert-edge (rt-edge (drop key prefix-len)
|
||||
[new-orig-edge (rt-edge (drop orig-label prefix-len) orig-target)])
|
||||
(if (= prefix-len (length key))
|
||||
(let* ([next-bit (list-ref orig-label prefix-len)]
|
||||
[common-node (rt-node (if next-bit #f new-orig-edge)
|
||||
(if next-bit new-orig-edge #f)
|
||||
(updater (failure-result)))]
|
||||
[common-edge (rt-edge (take key prefix-len) common-node)])
|
||||
(setter! node common-edge))
|
||||
(let* ([new-insert-edge (rt-edge (drop key prefix-len)
|
||||
(rt-node #f #f (updater (failure-result))))]
|
||||
[diff-bit (list-ref key prefix-len)]
|
||||
[common-node (rt-node (if diff-bit new-orig-edge new-insert-edge)
|
||||
(if diff-bit new-insert-edge new-orig-edge)
|
||||
empty-node-data)]
|
||||
[common-edge (rt-edge (take key prefix-len) common-node)])
|
||||
(setter! node common-edge)))
|
||||
(setter! node common-edge)))))
|
||||
(match (rt-partial-iterate node key)
|
||||
[(list 'exact node)
|
||||
(set-rt-node-data!
|
||||
|
@ -124,19 +131,6 @@
|
|||
[rst (apply append (map flatten-edge (list e1 e2)))])
|
||||
(if (equal? data empty-node-data) rst (cons data rst))))
|
||||
|
||||
; (define test (make-rt))
|
||||
; (define (test-insert! x)
|
||||
; (rt-update!
|
||||
; test
|
||||
; (map (curry equal? #\1) (string->list x))
|
||||
; (lambda (_) x)
|
||||
; (lambda () x)))
|
||||
; (test-insert! "0001")
|
||||
; ; (test-insert! "1000")
|
||||
; ; (test-insert! "1010")
|
||||
; (test-insert! "0011")
|
||||
; (test-insert! "0000")
|
||||
|
||||
;; RT [Str] ->
|
||||
;; Debug print function that dumps the tree to current-output-port in a vaguely human-readable
|
||||
;; format
|
||||
|
@ -150,4 +144,25 @@
|
|||
(when edge1
|
||||
(displayln (format "~a edge1 ~a" prefix (rt-edge-label edge1)))
|
||||
(rt-dump (rt-edge-target edge1) (string-append prefix " "))))
|
||||
|
||||
(define test (make-rt))
|
||||
(define (str->bl x)
|
||||
(map (curry equal? #\1) (string->list x)))
|
||||
(define (test-insert! x)
|
||||
(rt-update!
|
||||
test
|
||||
(str->bl x)
|
||||
(lambda (_) x)
|
||||
(lambda () x)))
|
||||
; (test-insert! "0001")
|
||||
; (test-insert! "000")
|
||||
; (test-insert! "0")
|
||||
; (rt-dump test)
|
||||
; (rt-partial-iterate test (str->bl "0001"))
|
||||
; (rt-lookup test (str->bl "0001") (lambda () (error "bad")))
|
||||
|
||||
; (test-insert! "0001")
|
||||
; (test-insert! "1000")
|
||||
; (test-insert! "1010")
|
||||
; (test-insert! "0011")
|
||||
; (test-insert! "0000")
|
||||
|
|
Loading…
Reference in New Issue