Remove old heap from unmaintained
parent
a86a138b08
commit
3c28446ac3
|
@ -1,74 +0,0 @@
|
||||||
! Binary Min Heap
|
|
||||||
! Copyright 2007 Ryan Murphy
|
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
|
||||||
|
|
||||||
USING: kernel math sequences ;
|
|
||||||
IN: heap
|
|
||||||
|
|
||||||
: [comp] ( elt elt -- ? ) <=> 0 > ;
|
|
||||||
|
|
||||||
: <heap> ( -- heap ) V{ } clone ;
|
|
||||||
|
|
||||||
: left ( index -- index ) ! left child
|
|
||||||
2 * 1 + ;
|
|
||||||
|
|
||||||
: leftv ( heap index -- value )
|
|
||||||
left swap nth ;
|
|
||||||
|
|
||||||
: right ( index -- index ) ! right child
|
|
||||||
2 * 2 + ;
|
|
||||||
|
|
||||||
: rightv ( heap index -- value )
|
|
||||||
right swap nth ;
|
|
||||||
|
|
||||||
: l-oob ( i heap -- ? ) swap left swap length >= ;
|
|
||||||
: r-oob ( i heap -- ? ) swap right swap length >= ;
|
|
||||||
|
|
||||||
: up ( index -- index ) ! parent node
|
|
||||||
1 - 2 /i ;
|
|
||||||
|
|
||||||
: upv ( heap index -- value ) ! parent's value
|
|
||||||
up swap nth ;
|
|
||||||
|
|
||||||
: lasti ( seq -- index ) length 1 - ;
|
|
||||||
|
|
||||||
: swapup ( heap index -- ) dup up rot exchange ;
|
|
||||||
|
|
||||||
: (farchild) ( heap index -- index ) tuck 2dup leftv -rot rightv [comp] [ right ] [ left ] if ;
|
|
||||||
|
|
||||||
: farchild ( heap index -- index ) dup right pick length >= [ nip left ] [ (farchild) ] if ;
|
|
||||||
|
|
||||||
: farchildv ( heap index -- value ) dupd farchild swap nth ;
|
|
||||||
|
|
||||||
: swapdown ( heap index -- ) 2dup farchild rot exchange ;
|
|
||||||
|
|
||||||
: upheap ( heap -- )
|
|
||||||
dup dup lasti upv over peek [comp]
|
|
||||||
[ dup lasti 2dup swapup up 1 + head-slice upheap ] [ drop ] if ;
|
|
||||||
|
|
||||||
: add ( elt heap -- )
|
|
||||||
tuck push upheap ;
|
|
||||||
|
|
||||||
: add-many ( seq heap -- )
|
|
||||||
swap [ swap add ] each-with ;
|
|
||||||
|
|
||||||
DEFER: (downheap)
|
|
||||||
|
|
||||||
: (downheap2) ( i heap -- )
|
|
||||||
2dup nth -rot
|
|
||||||
2dup swap farchild dup pick nth 2swap
|
|
||||||
>r >r
|
|
||||||
swapd [comp]
|
|
||||||
[ r> r> tuck swap swapdown (downheap) ] [ drop r> r> 2drop ] if ;
|
|
||||||
|
|
||||||
: (downheap) ( i heap -- )
|
|
||||||
over left over length >= [ 2drop ] [ (downheap2) ] if ;
|
|
||||||
|
|
||||||
: downheap ( heap -- )
|
|
||||||
0 swap (downheap) ;
|
|
||||||
|
|
||||||
: bump ( heap -- )
|
|
||||||
dup peek 0 pick set-nth dup pop* downheap ;
|
|
||||||
|
|
||||||
: gbump ( heap -- first )
|
|
||||||
dup first swap bump ;
|
|
|
@ -1,76 +0,0 @@
|
||||||
! Binary Min Heap
|
|
||||||
! Copyright 2007 Ryan Murphy
|
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
|
||||||
|
|
||||||
USING: help heap sequences ;
|
|
||||||
|
|
||||||
ARTICLE: { "heap" "heap" } "Binary Min Heap"
|
|
||||||
"A vector-based implementation of a binary min heap. Elements are simply stored in a vector, so use " { $link first } " to access the root of the heap."
|
|
||||||
{ $subsection <heap> }
|
|
||||||
{ $subsection add }
|
|
||||||
{ $subsection add-many }
|
|
||||||
{ $subsection bump }
|
|
||||||
{ $subsection gbump }
|
|
||||||
{ $subsection print-heap }
|
|
||||||
;
|
|
||||||
|
|
||||||
HELP: <heap>
|
|
||||||
"Creates a new heap with nothing on it." ;
|
|
||||||
|
|
||||||
HELP: add
|
|
||||||
"Adds 1 element to the heap."
|
|
||||||
{ $examples
|
|
||||||
{ $code
|
|
||||||
"USE: heap"
|
|
||||||
"<heap> 3 over add 4 over add 5 over add"
|
|
||||||
"print-heap"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
HELP: add-many
|
|
||||||
"For each element in the sequence, add it to the heap."
|
|
||||||
{ $examples
|
|
||||||
{ $code
|
|
||||||
"USE: heap"
|
|
||||||
"<heap> { 7 6 5 4 3 2 1 } over add-many"
|
|
||||||
"print-heap"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
HELP: bump
|
|
||||||
"\"Bumps\" the root element off of the heap, rearranging the remaining elements so that the heap remains valid."
|
|
||||||
{ $examples
|
|
||||||
{ $code
|
|
||||||
"USE: heap"
|
|
||||||
"<heap> { 7 6 5 4 3 2 1 } over add-many"
|
|
||||||
"dup print-heap"
|
|
||||||
"dup bump \"(bump)\" print dup print-heap"
|
|
||||||
"dup bump \"(bump)\" print dup print-heap"
|
|
||||||
"dup bump \"(bump)\" print dup print-heap"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
HELP: gbump
|
|
||||||
"(\"Get-bump\") Does a " { $link bump } ", but leaves the bumped element on the stack instead of discarding it."
|
|
||||||
{ $examples
|
|
||||||
{ $code
|
|
||||||
"USE: heap"
|
|
||||||
"<heap> { 7 6 5 4 3 2 1 } over add-many"
|
|
||||||
"dup gbump"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
HELP: print-heap
|
|
||||||
"Prints the heap in tree form."
|
|
||||||
{ $examples
|
|
||||||
{ $code
|
|
||||||
"USE: heap"
|
|
||||||
"<heap> { 7 6 5 4 3 2 1 } over add-many"
|
|
||||||
"print-heap"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
|
@ -1,100 +0,0 @@
|
||||||
: test-agg2 ( -- )
|
|
||||||
{
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
} >vector
|
|
||||||
aggregate2 [ print ] each "" print
|
|
||||||
|
|
||||||
{
|
|
||||||
"aa"
|
|
||||||
"aa"
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
} >vector
|
|
||||||
aggregate2 [ print ] each "" print
|
|
||||||
|
|
||||||
{
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
} >vector
|
|
||||||
aggregate2 [ print ] each "" print
|
|
||||||
|
|
||||||
{
|
|
||||||
"aaaaaaa"
|
|
||||||
"aaaaaaa"
|
|
||||||
"aaaaaaa"
|
|
||||||
"aaaaaaa"
|
|
||||||
"aaaaaaa"
|
|
||||||
"aaaaaaa"
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
"bbbb"
|
|
||||||
"bbbb"
|
|
||||||
"bbbb"
|
|
||||||
} >vector
|
|
||||||
aggregate2 [ print ] each "" print
|
|
||||||
|
|
||||||
{
|
|
||||||
"aaaa"
|
|
||||||
"aaaa"
|
|
||||||
"aaaa"
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
"bbbbbbb"
|
|
||||||
} >vector
|
|
||||||
aggregate2 [ print ] each "" print
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
: test-agg ( -- )
|
|
||||||
{
|
|
||||||
"....5.."
|
|
||||||
"...|.|."
|
|
||||||
"..7...9"
|
|
||||||
".|....."
|
|
||||||
"8......"
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
"..3.."
|
|
||||||
".|.|."
|
|
||||||
"4...4"
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
".2."
|
|
||||||
"|.|"
|
|
||||||
} >vector
|
|
||||||
aggregate3 [ print ] each "" print
|
|
||||||
|
|
||||||
{
|
|
||||||
"....5.."
|
|
||||||
"...|.|."
|
|
||||||
"..7...9"
|
|
||||||
".|....."
|
|
||||||
"8......"
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
"......3...."
|
|
||||||
".....|.|..."
|
|
||||||
"....4...4.."
|
|
||||||
"...|.|....."
|
|
||||||
"..5...6...."
|
|
||||||
".|........."
|
|
||||||
"6.........."
|
|
||||||
} >vector
|
|
||||||
{
|
|
||||||
".2."
|
|
||||||
"|.|"
|
|
||||||
} >vector
|
|
||||||
aggregate3 [ print ] each "" print
|
|
||||||
;
|
|
|
@ -1,16 +0,0 @@
|
||||||
! Binary Min Heap
|
|
||||||
! Copyright 2007 Ryan Murphy
|
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
|
||||||
|
|
||||||
PROVIDE: libs/heap
|
|
||||||
|
|
||||||
{ +files+ {
|
|
||||||
"heap.factor"
|
|
||||||
"print.factor"
|
|
||||||
|
|
||||||
"heap.facts"
|
|
||||||
} }
|
|
||||||
|
|
||||||
{ +tests+ {
|
|
||||||
"tests.factor"
|
|
||||||
} } ;
|
|
|
@ -1,51 +0,0 @@
|
||||||
! Binary Min Heap
|
|
||||||
! Copyright 2007 Ryan Murphy
|
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
|
||||||
|
|
||||||
USING: namespaces kernel math sequences prettyprint io ;
|
|
||||||
IN: heap
|
|
||||||
|
|
||||||
: spaces ( n -- str )
|
|
||||||
[ [ " " % ] times ] "" make ;
|
|
||||||
|
|
||||||
: prepend-s ( v1 n -- v1' )
|
|
||||||
spaces swap [ append ] map-with ;
|
|
||||||
|
|
||||||
: append-s ( v1 v2 -- v1' )
|
|
||||||
spaces swap [ swap append ] map-with ;
|
|
||||||
|
|
||||||
: pad-r ( lv rv -- rv' )
|
|
||||||
dup first length spaces pick length pick length -
|
|
||||||
[ [ dup , ] times ] V{ } make
|
|
||||||
nip append nip ;
|
|
||||||
|
|
||||||
: pad-l ( lv rv -- lv' )
|
|
||||||
swap pad-r ;
|
|
||||||
|
|
||||||
: (aggregate2) ( lv rv -- v )
|
|
||||||
over length over length >= [ dupd pad-r ] [ tuck pad-l swap ] if
|
|
||||||
[ append ] 2map ;
|
|
||||||
|
|
||||||
: aggregate2 ( lv rv -- v )
|
|
||||||
dup empty? [ drop ] [ over empty? [ nip ] [ (aggregate2) ] if ] if ;
|
|
||||||
|
|
||||||
: (agg3len) ( v -- len )
|
|
||||||
dup empty? [ drop 0 ] [ first length ] if ;
|
|
||||||
|
|
||||||
: aggregate3 ( lv rv pv -- v )
|
|
||||||
dup (agg3len) -roll
|
|
||||||
pick (agg3len) prepend-s
|
|
||||||
over (agg3len) append-s
|
|
||||||
-roll -rot swap append-s
|
|
||||||
swap aggregate2 append ;
|
|
||||||
|
|
||||||
: output-node ( elt -- str ) [ [ pprint ] string-out , ] V{ } make ;
|
|
||||||
|
|
||||||
: (print-heap) ( i heap -- vector )
|
|
||||||
2dup l-oob [ V{ } clone ] [ over left over (print-heap) ] if -rot
|
|
||||||
2dup r-oob [ V{ } clone ] [ over right over (print-heap) ] if -rot
|
|
||||||
V{ } clone pick pick nth output-node append
|
|
||||||
-rot 2drop aggregate3 ;
|
|
||||||
|
|
||||||
: print-heap ( heap -- )
|
|
||||||
dup empty? [ drop ] [ 0 swap (print-heap) [ print ] each ] if ;
|
|
|
@ -1,35 +0,0 @@
|
||||||
! Binary Min Heap
|
|
||||||
! Copyright 2007 Ryan Murphy
|
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
|
||||||
|
|
||||||
USING: heap test kernel ;
|
|
||||||
|
|
||||||
{ 1 2 3 4 5 6 } [ 0 left 0 right 1 left 1 right 2 left 2 right ] unit-test
|
|
||||||
{ t } [ 5 3 [comp] ] unit-test
|
|
||||||
{ V{ } } [ <heap> ] unit-test
|
|
||||||
|
|
||||||
{ V{ -6 -4 2 1 5 3 2 4 3 7 6 8 3 4 4 6 5 5 } } [ <heap> { 3 5 4 6 7 8 2 4 3 5 6 1 3 2 4 5 -6 -4 } over add-many ] unit-test
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ V{ "hire" "hose" } } [ V{ "hi" "ho" } V{ "re" "se" } aggregate2 ] unit-test
|
|
||||||
{ V{ "hire" "hose" " it" } } [ V{ "hi" "ho" } V{ "re" "se" "it" } aggregate2 ] unit-test
|
|
||||||
{ V{ "tracks" "snacks" "crack " } } [ V{ "track" "snack" "crack" } V{ "s" "s" } aggregate2 ] unit-test
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ V{ " top " "left right" } } [ V{ "left" } V{ "right" } V{ "top" } aggregate3 ] unit-test
|
|
||||||
|
|
||||||
{ V{ " top "
|
|
||||||
" dog "
|
|
||||||
"left right"
|
|
||||||
"over on "
|
|
||||||
" man " } } [ V{ "left" "over" } V{ "right" "on " "man " } V{ "top" "dog" } aggregate3 ] unit-test
|
|
||||||
|
|
||||||
{ V{ " -6 "
|
|
||||||
" -4 2 "
|
|
||||||
" 1 5 3 2 "
|
|
||||||
" 4 3 7 6 8 3 4 4"
|
|
||||||
"6 5 5 " } } [ 0 <heap> { 3 5 4 6 7 8 2 4 3 5 6 1 3 2 4 5 -6 -4 } over add-many (print-heap) ] unit-test
|
|
||||||
|
|
||||||
{ V{ 5 6 6 7 8 } } [ <heap> { 3 5 4 6 5 7 6 8 } over add-many dup bump dup bump dup bump ] unit-test
|
|
Loading…
Reference in New Issue