2010-12-01 93 views
3

“一维”散列在阵列的我只是想知道如何使用一个维散列的效率(即只键,没有价值观 - 我们不关心他们无论如何)在一个维数组。优势在Perl

我想用哈希用于这一目的的主要的原因是这样我就可以使用exists函数,看看是否一个“入门”已经存在。哈希也非常适合不重复键?对于数组,我需要设置自己的涉及grep的检查,我认为这会比较慢。

然后这个哈希/数组将迭代通过某些操作。

我很想听听提前对此有什么见解,并感谢!

回答

7
exists $hash{ $key } 

是一个不错的,简短的表达,清晰和易于使用。显然

!!grep { $_ eq $key } @array 

是不是很短,但

$key ~~ @array # smart match 

更短。所以从5.10开始,它就像句法上的一样易于测试智能匹配为exists。因此,从数组和哈希之间的性能差异猜测,我可以想象,聪明的匹配将执行更快的一小列项目,但哈希将到目前为止胜过数组查找与大项目列表。

然而,你无论如何都应该Benchmark性能。


这就是原因。草莓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%   -- 

我会使用散列。

+0

非常感谢智能匹配和基准测试的领导者,我想知道多大的'大'会是,并且这清楚地说明了! – Bharat 2010-12-01 17:53:54

5

是的。如果你想检查一个项目是否存在于一个数组中,你必须遍历每一个项目。在散列表中,您只需查找关键字即可。这对于大数据集来说更快。

4

这绝对是Perl中的一项标准技术。我自己的脚本充满了这样的代码:

my @elements = (...); 
my %is_element = map { $_ => 1 } @elements; 

有很多Stack Overflow的例子, herehere

仰望在哈希is approximately O(1)的关键。

+2

[`List :: MoreUtils :: uniq`](http://search.cpan.org/perldoc?List::MoreUtils#uniq) – Axeman 2010-12-01 13:24:17

5

在数学意义上,散列键是sets和阵列tuples。例如,元组('apple', 'banana')('banana', 'apple')是不同的实体,而集合{'apple', 'banana'}{'banana', 'apple'}是相同的。

当你需要元组时,你需要使用集合和元组。

如果您需要执行设置操作,您可能需要使用Set::Object,而不是每次都从头开始编写操作。

如果您打算使用散列键来表示集合,那么将值设置为undef而不是1可以减少内存占用量,这可能会影响您的集合很大。

+0

感谢设置模块的建议,这会让前段时间更容易一些。在这个模块中编写独特的检查很容易,因为我已经决定把东西逐个推送到哈希中,我肯定会使用undef。谢谢! – Bharat 2010-12-01 17:56:27