my %node = (); sub idx { my $n = shift; my $index = 1; while (exists $node{$index}) { if (sin($n) < sin($node{$index})) { $index = $index*2; } else { $index = $index*2+1; } } $node{$index} = $n; return $index; } foreach my $n (1..10_000) { my $a = idx($n); print "$n $a\n"; }