【发布时间】:2016-05-19 12:02:28
【问题描述】:
我正在寻找一个最好执行等于 O(1) 的数据结构?在添加/删除/检索元素时适用于任意数量的元素。
这里有一些额外的准则,
- 检索元素不应涉及缓慢
keys() - 元素必须始终唯一且已定义
- 元素顺序不重要
- 元素的添加或删除不应涉及对其他元素的迭代
- 检索到的元素列表中的间隙是可以容忍的,可以用
undef值表示
请提出比,更好的解决方案,
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;
};
}
更新(用法)
my $fa = uniqArrayFactory();
$fa->(add => 10);
$fa->(del => 10);
my $members = $fa->(mebers => 1);
【问题讨论】:
-
...我是密集的,还是你在描述哈希?
-
我敢肯定,你在 Perl 中写的东西不会比用 C 语言编写的内置
keys运算符更快。我认为你需要解释更多关于你正在做的事情会给你带来不可接受的表现。keys是一个微不足道的操作,它只是返回一个预先存在的 C 字符串列表,重新格式化为 Perl 标量 -
@Borodin 返回就绪数组 ref
$members比return [keys %$seen]更快。因此,如果$factory->(members => 1)的工厂必须非常快,那么keys并不是最快的解决方案。 -
keys() 距离 O(1) 很远,更不用说 jm666 写的了。在经常检索元素的情况下,我认为这是一个值得的内存/速度权衡。
-