I'm looking for a data structure which should preferably perform equal O(1)? for any number of elements when adding/removing/retrieving elements.
Here are some additional guidelines,
- retrieving elements should not involve slow
keys()
- elements must be always unique and defined
- element order is not significant
- addition or removal of element should not involve iteration over other elements
- gaps in retrieved list of elements are tolerable and can be represented with
undef
value
Please suggest better solution than,
sub uniqArrayFactory {
my $members = [];
my $seen = {};
my $gaps = [];
return sub {
my (%arg) = @_;
return $members if $arg{members};
my $m;
if (defined ($m = $arg{del})) {
return if !$seen->{$m};
${ $seen->{$m} } = undef;
push @$gaps, delete($seen->{$m});
}
elsif (defined ($m = $arg{add})) {
return if $seen->{$m};
if (@$gaps) {
$seen->{$m} = pop @$gaps;
${ $seen->{$m} } = $m;
}
else {
push @$members, $m;
$seen->{$m} = \( $members->[-1] );
}
}
return $m;
};
}
UPDATE (usage)
my $fa = uniqArrayFactory();
$fa->(add => 10);
$fa->(del => 10);
my $members = $fa->(mebers => 1);