“一维”散列在阵列的我只是想知道如何使用一个维散列的效率(即只键,没有价值观 - 我们不关心他们无论如何)在一个维数组。优势在Perl
我想用哈希用于这一目的的主要的原因是这样我就可以使用exists函数,看看是否一个“入门”已经存在。哈希也非常适合不重复键?对于数组,我需要设置自己的涉及grep的检查,我认为这会比较慢。
然后这个哈希/数组将迭代通过某些操作。
我很想听听提前对此有什么见解,并感谢!
“一维”散列在阵列的我只是想知道如何使用一个维散列的效率(即只键,没有价值观 - 我们不关心他们无论如何)在一个维数组。优势在Perl
我想用哈希用于这一目的的主要的原因是这样我就可以使用exists函数,看看是否一个“入门”已经存在。哈希也非常适合不重复键?对于数组,我需要设置自己的涉及grep的检查,我认为这会比较慢。
然后这个哈希/数组将迭代通过某些操作。
我很想听听提前对此有什么见解,并感谢!
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% --
我会使用散列。
是的。如果你想检查一个项目是否存在于一个数组中,你必须遍历每一个项目。在散列表中,您只需查找关键字即可。这对于大数据集来说更快。
这绝对是Perl中的一项标准技术。我自己的脚本充满了这样的代码:
my @elements = (...);
my %is_element = map { $_ => 1 } @elements;
有很多Stack Overflow的例子, here和here。
仰望在哈希is approximately O(1)的关键。
[`List :: MoreUtils :: uniq`](http://search.cpan.org/perldoc?List::MoreUtils#uniq) – Axeman 2010-12-01 13:24:17
在数学意义上,散列键是sets和阵列tuples。例如,元组('apple', 'banana')
和('banana', 'apple')
是不同的实体,而集合{'apple', 'banana'}
和{'banana', 'apple'}
是相同的。
当你需要元组时,你需要使用集合和元组。
如果您需要执行设置操作,您可能需要使用Set::Object,而不是每次都从头开始编写操作。
如果您打算使用散列键来表示集合,那么将值设置为undef
而不是1
可以减少内存占用量,这可能会影响您的集合很大。
感谢设置模块的建议,这会让前段时间更容易一些。在这个模块中编写独特的检查很容易,因为我已经决定把东西逐个推送到哈希中,我肯定会使用undef。谢谢! – Bharat 2010-12-01 17:56:27
非常感谢智能匹配和基准测试的领导者,我想知道多大的'大'会是,并且这清楚地说明了! – Bharat 2010-12-01 17:53:54