【问题标题】:Which data structure should I use for a hash without values?对于没有值的哈希,我应该使用哪种数据结构?
【发布时间】:2011-08-11 03:43:01
【问题描述】:

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

遍历数组会产生线性检查时间。哈希的检查时间是恒定的,但感觉效率很低,因为我不会使用哈希的值部分。

【问题讨论】:

  • @Mark:我认为应该有一个结构比使用哈希严格更好,可能具有相同的时间复杂度但空间复杂度更好。
  • @Mark:它是静态的,所以我永远不会改变它。 ~1000 个元素,但我也对渐近复杂性感兴趣。
  • 如果元素的数量永远不会改变,你为什么对渐近复杂性(事物如何扩展)感兴趣。
  • @ikegami:这个数字在程序中永远不会改变。渐近复杂度可能无关紧要,但我很好奇。

标签: perl data-structures hash


【解决方案1】:

使用哈希,但不要使用值。真的没有更好的办法了。

【讨论】:

  • 对于 Perl 或一般数据结构是这样吗?
  • 对于 Perl;我敢肯定,至少有些语言会为此目的提供更加定制的类型。
  • 对于像 Java 这样的语言,您将使用 HashSet。但是,在 Perl 中,您不能使用这些值,或者存储该值出现了多少次(如果它可能出现多次)。
【解决方案2】:

可以遍历数组:

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} ) {
    ...
}

您可以实现二进制搜索和列表排序器,但这是最常用的两种方法。

【讨论】:

  • 是的,这些是我在问题中提到的方法。我想知道是否有更好的方法。
【解决方案3】:

您可能会发现常见问题解答的这一部分很有用:

How can I tell whether a certain element is contained in a list or array?

【讨论】:

  • 我已经读过了,除了遍历数组或检查哈希(甚至遍历哈希!)之外,它似乎没有任何建议。
【解决方案4】:

使用散列来测试集合成员的内存开销是最小的,并且大大超过了通过数组重复顺序搜索的成本。有很多方法可以制作一组成员样式哈希:

my %set = map {$_ => 1} ...;

my %set; $set{$_}++ for ...;

my %set; @set{...} = (1) x num_of_items;

每一个都允许您直接在条件中使用哈希查找,而无需任何额外的语法。

如果您的哈希值很大,并且您担心内存使用情况,您可以将undef 存储为每个键的值。但在这种情况下,您必须在条件句中使用 exists $set{...}

【讨论】:

  • 在现代 perls 中,整数或引用与 undef 一样便宜
【解决方案5】:

散列应该没问题。您可以使用 undef 作为值并使用 exists($h{$k}),或者您可以使用 1 并使用 $h{$k}

Judy::HS 应该更高效一些,但也没有该结构的无价值版本。

【讨论】:

    【解决方案6】:

    HashTable 是最好的选择。

    注意:-正如你所说的它是一个集合,我希望没有重复的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多