解决方法
而解决方案与排序:
(sort {$hash{$a} <=> $hash{$b}} keys %hash)[0]
在其他一些答案中发现,相当优雅,它的表现并不如此。首先,排序将O(n)搜索搜索操作转换为O(n log n)。其次,排序解决方案具有n个日志n哈希查找。散列查找对于某些操作非常好,但是当使用整个散列时,查找将比使用每个,键或值迭代数据结构慢。这是因为迭代器不需要计算密钥的哈希值,也不需要重复地通过bin来查找值。而且开销不是恒定的,而是随着散列变大而增加。
以下是一些更快的解决方案:
use strict; use warnings; my %hash = ( small => 1,medium => 5,largest => 10,large => 8,tiny => 0.1,);
这是一个使用每个迭代器的解决方案(O(1)操作完成n次):
sub largest_value (\%) { my $hash = shift; keys %$hash; # reset the each iterator my ($large_key,$large_val) = each %$hash; while (my ($key,$val) = each %$hash) { if ($val > $large_val) { $large_val = $val; $large_key = $key; } } $large_key } print largest_value %hash; # prints 'largest'
或者更快的版本来交换内存的速度(它制作了哈希的副本):
sub largest_value_mem (\%) { my $hash = shift; my ($key,@keys) = keys %$hash; my ($big,@vals) = values %$hash; for (0 .. $#keys) { if ($vals[$_] > $big) { $big = $vals[$_]; $key = $keys[$_]; } } $key } print largest_value_mem %hash; # prints 'largest'
以下是各种散列大小的性能:
10 keys: Rate largest_with_sort largest_value largest_value_mem largest_with_sort 111565/s -- -8% -13% largest_value 121743/s 9% -- -5% largest_value_mem 127783/s 15% 5% -- 50 keys: Rate largest_with_sort largest_value largest_value_mem largest_with_sort 24912/s -- -37% -40% largest_value 39361/s 58% -- -6% largest_value_mem 41810/s 68% 6% -- 100 keys: Rate largest_with_sort largest_value largest_value_mem largest_with_sort 9894/s -- -50% -56% largest_value 19680/s 99% -- -12% largest_value_mem 22371/s 126% 14% -- 1,000 keys: Rate largest_with_sort largest_value largest_value_mem largest_with_sort 668/s -- -69% -71% largest_value 2183/s 227% -- -7% largest_value_mem 2341/s 250% 7% -- 10,000 keys: Rate largest_with_sort largest_value largest_value_mem largest_with_sort 46.5/s -- -79% -81% largest_value 216/s 365% -- -11% largest_value_mem 242/s 421% 12% --
如你所见,如果内存不是很大的问题,内部数组的版本是最快的,紧随其后的是每个迭代器,并在一个遥远的第三个…排序