math.binpack: faster by storing only items, not weights.

db4
John Benediktsson 2014-11-29 17:34:27 -08:00
parent c675694619
commit 921e995ed9
2 changed files with 10 additions and 11 deletions

View File

@ -5,18 +5,18 @@ USING: kernel tools.test sequences ;
IN: math.binpack IN: math.binpack
{ { { } } } [ { } 1 binpack ] unit-test { { V{ } } } [ { } 1 binpack ] unit-test
{ { { 3 } { 2 1 } } } [ { 1 2 3 } 2 binpack ] unit-test { { V{ 3 } V{ 2 1 } } } [ { 1 2 3 } 2 binpack ] unit-test
{ { { 1000 } { 100 60 30 7 } { 70 60 40 23 3 } } } { { V{ 1000 } V{ 100 60 30 7 } V{ 70 60 40 23 3 } } }
[ { 100 23 40 60 1000 30 60 07 70 03 } 3 binpack ] unit-test [ { 100 23 40 60 1000 30 60 07 70 03 } 3 binpack ] unit-test
{ {
{ {
{ "violet" "orange" } V{ "violet" "orange" }
{ "indigo" "green" } V{ "indigo" "green" }
{ "yellow" "blue" "red" } V{ "yellow" "blue" "red" }
} }
} [ } [
{ "red" "orange" "yellow" "green" "blue" "indigo" "violet" } { "red" "orange" "yellow" "green" "blue" "indigo" "violet" }

View File

@ -15,15 +15,14 @@ TUPLE: bin items total ;
: smallest-bin ( bins -- bin ) : smallest-bin ( bins -- bin )
[ total>> ] infimum-by ; inline [ total>> ] infimum-by ; inline
: add-to-bin ( item bin -- ) : add-to-bin ( item weight bin -- )
[ items>> push ] [ + ] change-total items>> push ;
[ [ second ] dip [ + ] change-total drop ] 2bi ;
:: (binpack) ( alist #bins -- bins ) :: (binpack) ( alist #bins -- bins )
alist sort-values <reversed> :> items alist sort-values <reversed> :> items
#bins [ <bin> ] replicate :> bins #bins [ <bin> ] replicate :> bins
items [ bins smallest-bin add-to-bin ] each items [ bins smallest-bin add-to-bin ] assoc-each
bins [ items>> keys ] map ; bins [ items>> ] map ;
PRIVATE> PRIVATE>