in reply to Data structure challenge

Are you getting at $#array = U; ?

use Benchmark::Timer; $T = new Benchmark::Timer; $T->start( 'autoviv' ); $auto[ $_ ] = 1 for map{ 10**$_ } 0 .. 7; $T->stop( 'autoviv' ); $#pre = 10**7; $T->start( 'prealloc' ); $pre[ $_ ] = 1 for map{ 10**$_ } 0 .. 7; $T->stop( 'prealloc' ); $T->report; 1 trial of autoviv (93.750ms total) 1 trial of prealloc (15.625ms total)

That still doesn't acheive O(1) as the number of links in the list is still N, though it is somewhat quicker than autoviv.

That said, when initialising 16 MB of scalar to spaces only takes 36 milliseconds, this is one of those cases where big O notation hides reality I think.

use Benchmark::Timer; $T = new Benchmark::Timer; $T->start( 'scalar'), $x = ' ' x 2**24, $T->stop( 'scalar' ) for 1 .. +10; $T->report; 10 trials of scalar (359.375ms total), 35.938ms/trial

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail