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
|
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" }
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue