我需要检查一组标量中是否存在标量。存储这组标量的最佳方法是什么?
遍历数组会产生线性检查时间。散列的检查时间是不变的,但由于我不使用散列的值部分,因此效率低下。
答案 0 :(得分:9)
使用哈希值,但不要使用值。真的没有更好的方法。
答案 1 :(得分:5)
使用哈希来测试集合成员资格的内存开销很小,并且大大超过了通过数组重复顺序搜索的成本。有很多方法可以创建一个集合成员资格样式哈希:
my %set = map {$_ => 1} ...;
my %set; $set{$_}++ for ...;
my %set; @set{...} = (1) x num_of_items;
这些中的每一个都允许您直接在条件中使用哈希查找,而无需任何其他语法。
如果您的哈希值很大,并且您担心内存使用情况,则可以将undef
存储为每个键的值。但在这种情况下,您必须在条件中使用exists $set{...}
。
答案 2 :(得分:5)
哈希应该没问题。您可以使用undef作为值并使用exists($h{$k})
,也可以使用1
并使用$h{$k}
。
Judy::HS应该更有效率,但也没有该结构的无价值版本。
答案 3 :(得分:1)
您可能会发现常见问题解答的这一部分很有用:
How can I tell whether a certain element is contained in a list or array?
答案 4 :(得分:0)
可以完成对数组的迭代:
my @arr = ( $list, $of, $scalars );
push @arr, $any, $other, $ones;
看起来很昂贵,但除非你有一个庞大的清单,否则不会那么昂贵:
grep { $_ eq $what_youre_looking_for } @arr;
哈希方法也有效:
my %hash = ( $list => 1, $of => 1, $scalars => 1 );
$hash{$another} = 1;
if ( exists $hash{$what_youre_looking_for} ) {
...
}
您可以实现二进制搜索和列表排序,但这是最常用的两种方法。
答案 5 :(得分:0)
HashTable是最好的选择。
注意: - 正如你所说的那样,我希望没有重复的元素。