Interval trees
parent
51b5ec84f6
commit
4a9b5d2127
|
@ -0,0 +1 @@
|
|||
Daniel Ehrenberg
|
|
@ -0,0 +1,21 @@
|
|||
USING: kernel namespaces trees.avl trees.interval tools.test ;
|
||||
IN: trees.interval.test
|
||||
|
||||
SYMBOL: test
|
||||
|
||||
<avl> test set
|
||||
|
||||
[ f ] [ 2 test get interval-at ] unit-test
|
||||
[ ] [ 2 1 test get add-single ] unit-test
|
||||
[ 2 ] [ 1 test get interval-at ] unit-test
|
||||
[ f ] [ 2 test get interval-at ] unit-test
|
||||
[ f ] [ 0 test get interval-at ] unit-test
|
||||
|
||||
[ ] [ 3 4 8 test get add-range ] unit-test
|
||||
[ 3 ] [ 5 test get interval-at ] unit-test
|
||||
[ 3 ] [ 8 test get interval-at ] unit-test
|
||||
[ 3 ] [ 4 test get interval-at ] unit-test
|
||||
[ f ] [ 9 test get interval-at ] unit-test
|
||||
[ 2 ] [ 1 test get interval-at ] unit-test
|
||||
[ f ] [ 2 test get interval-at ] unit-test
|
||||
[ f ] [ 0 test get interval-at ] unit-test
|
|
@ -0,0 +1,42 @@
|
|||
! Copyright (c) 2008 Daniel Ehrenberg
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: trees trees.avl kernel math accessors math.intervals
|
||||
math.order assocs ;
|
||||
IN: trees.interval
|
||||
|
||||
TUPLE: int-node interval max-under value ;
|
||||
: <int-node> ( value start end -- int-node )
|
||||
[ [a,b] ] keep rot int-node boa ;
|
||||
|
||||
: interval-choose-branch ( key node -- key left/right )
|
||||
dup left>> [
|
||||
max-under>> pick >= [ left>> ] [ right>> ] if
|
||||
] [ right>> ] if* ;
|
||||
|
||||
: (interval-at*) ( key node -- value ? )
|
||||
[
|
||||
2dup value>> interval>> interval-contains?
|
||||
[ nip value>> value>> t ]
|
||||
[ interval-choose-branch (interval-at*) ] if
|
||||
] [ drop f f ] if* ;
|
||||
|
||||
: interval-at* ( key tree -- value ? )
|
||||
root>> (interval-at*) ;
|
||||
|
||||
: interval-at ( key tree -- value ) interval-at* drop ;
|
||||
: interval-key? ( key tree -- ? ) interval-at* nip ;
|
||||
|
||||
: update-max-under ( max key node -- )
|
||||
! The outer conditional shouldn't be necessary
|
||||
[
|
||||
2dup key>> = [ 3drop ] [
|
||||
[ nip value>> [ max ] change-max-under drop ]
|
||||
[ choose-branch update-max-under ] 3bi
|
||||
] if
|
||||
] [ 2drop ] if* ;
|
||||
|
||||
: add-range ( value start end tree -- )
|
||||
[ >r over >r <int-node> r> r> set-at ]
|
||||
[ root>> swapd update-max-under ] 3bi ;
|
||||
|
||||
: add-single ( value key tree -- ) dupd add-range ;
|
|
@ -0,0 +1 @@
|
|||
Interval trees for disjoint closed ranges
|
Loading…
Reference in New Issue