我只是想知道在一维数组上使用一维哈希(即只有键,没有值 - 我们不关心它们)的效率。
我想为此目的使用哈希的主要原因是我可以使用exists函数来查看“条目”是否已经存在。哈希也非常适合不重复密钥吗?对于数组,我需要设置我自己的涉及grep的检查,我认为这会更慢。
然后将对此哈希/数组进行迭代以进行某些操作。
我很想听到有关此事的任何见解,并提前感谢!
答案 0 :(得分:7)
exists $hash{ $key }
是一个很好的短表达,清晰易用。显然
!!grep { $_ eq $key } @array
不是很短,但是
$key ~~ @array # smart match
甚至更短。所以从5.10开始,它就像语法一样容易将智能匹配测试为exists
。
因此,根据数组和散列之间的性能差异进行猜测,我可以想象智能匹配对于一小部分项目执行速度会更快,但哈希到目前为止的性能优于数组查找大项目清单。
但是,无论如何,你应该Benchmark表现。
这就是原因。在Strawberry perl上,即使列表大小为1,哈希查找也优于字符串匹配:
array_lookup 577701/s -- -46%
hash_lookup 1068376/s 85% --
列表中有2个项目:
array_lookup 464684/s -- -57%
hash_lookup 1068376/s 130% --
有20个项目:
array_lookup 181554/s -- -83%
hash_lookup 1068376/s 488% --
我会使用哈希。
答案 1 :(得分:5)
是。如果要检查数组中是否存在项目,则必须遍历每个项目。在哈希表中,您只需查找密钥即可。这对于大数据集来说更快。
答案 2 :(得分:5)
在数学意义上,散列键是sets,数组是tuples。例如,元组('apple', 'banana')
和('banana', 'apple')
是不同的实体,而集合{'apple', 'banana'}
和{'banana', 'apple'}
是相同的。
当你需要元组和元组时,你应该使用集合。
如果您需要执行设置操作,您可能希望使用Set::Object,而不是每次都从头开始编写操作。
如果您要使用哈希键来表示集合,则将值设置为undef
而不是1
可以减少内存占用,如果您的集合很大,这可能会很重要。
答案 3 :(得分:4)
这绝对是Perl的标准技术。我自己的脚本充满了这样的代码:
my @elements = (...);
my %is_element = map { $_ => 1 } @elements;
Stack Overflow上有很多例子,例如: here和here。
在哈希is approximately O(1)中查找密钥。