math.binpack: faster by storing only items, not weights.
parent
c675694619
commit
921e995ed9
|
@ -5,18 +5,18 @@ USING: kernel tools.test sequences ;
|
|||
|
||||
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
|
||||
|
||||
{
|
||||
{
|
||||
{ "violet" "orange" }
|
||||
{ "indigo" "green" }
|
||||
{ "yellow" "blue" "red" }
|
||||
V{ "violet" "orange" }
|
||||
V{ "indigo" "green" }
|
||||
V{ "yellow" "blue" "red" }
|
||||
}
|
||||
} [
|
||||
{ "red" "orange" "yellow" "green" "blue" "indigo" "violet" }
|
||||
|
|
|
@ -15,15 +15,14 @@ TUPLE: bin items total ;
|
|||
: smallest-bin ( bins -- bin )
|
||||
[ total>> ] infimum-by ; inline
|
||||
|
||||
: add-to-bin ( item bin -- )
|
||||
[ items>> push ]
|
||||
[ [ second ] dip [ + ] change-total drop ] 2bi ;
|
||||
: add-to-bin ( item weight bin -- )
|
||||
[ + ] change-total items>> push ;
|
||||
|
||||
:: (binpack) ( alist #bins -- bins )
|
||||
alist sort-values <reversed> :> items
|
||||
#bins [ <bin> ] replicate :> bins
|
||||
items [ bins smallest-bin add-to-bin ] each
|
||||
bins [ items>> keys ] map ;
|
||||
items [ bins smallest-bin add-to-bin ] assoc-each
|
||||
bins [ items>> ] map ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
|
|
Loading…
Reference in New Issue