#! perl -slw use strict; local $, = ' '; my( $A, $B, $C ) = ( {}, [], 0 ); sub query{ my $i = shift; return ( exists $A->{ $i } and 0 <= $A->{ $i } and $A->{ $i } < $C and $B->[ $A->{ $i } ] == $i ) ? 1 : 0; } sub insert{ my $i = shift; if( !query( $i ) ) { $B->[ $C ] = $i; $A->{ $i } = $C; $C++ } } sub del{ my $i = shift; if( query( $i ) ) { my $a = $A->{ $i }; my $b = $B->[ --$C ]; $B->[ $a ] = $b; $A->{ $b } = $a; } } sub clear{ $C = 0; } my @numbers = map{ int rand( 2**16 ) } 1 .. 10; print 'Query before insert'; printf "%5d : %s\n", $_, query( $_ ) for @numbers; insert $_ for @numbers; print "\nQuery after insert"; printf "%5d : %s\n", $_, query( $_ ) for @numbers; del $_ for @numbers[ 0..4 ]; ## Delete half print "\nQuery after deleting half"; printf "%5d : %s\n", $_, query( $_ ) for @numbers; del $_ for @numbers; ## Delete them all regardless if they still exists print "\nQuery after deleting the rest"; printf "%5d : %s\n", $_, query( $_ ) for @numbers;