我应该将哪种数据结构用于没有值的哈希?

时间:2011-04-22 18:40:25

标签: perl data-structures hash

我需要检查一组标量中是否存在标量。存储这组标量的最佳方法是什么?

遍历数组会产生线性检查时间。散列的检查时间是不变的,但由于我不使用散列的值部分,因此效率低下。

6 个答案:

答案 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是最好的选择。

注意: - 正如你所说的那样,我希望没有重复的元素。