gpt4 book ai didi

perl - 从 Perl 中的散列中获取具有最高值的键的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-03 11:45:29 25 4
gpt4 key购买 nike

从 Perl 中的散列中获取具有最高值的键的最简单方法是什么?

最佳答案

而排序的解决方案:

(sort {$hash{$a} <=> $hash{$b}} keys %hash)[0]

在其他一些答案中发现非常优雅,但它的表现并不像看起来那么好。首先,排序会转换 O(n) search 搜索操作变成 O(n log n)一。其次,排序解有 n log n哈希查找。哈希查找对于某些操作非常有用,但是当使用整个哈希时,查找会比使用 each 慢。 , keys , 或 values遍历数据结构。这是因为迭代器不需要计算键的哈希值,也不需要重复遍历 bin 来查找值。并且开销不是恒定的,而是随着哈希变大而增加。

以下是一些更快的解决方案:
use strict;
use warnings;

my %hash = (
small => 1,
medium => 5,
largest => 10,
large => 8,
tiny => 0.1,
);

这是使用 each 的解决方案迭代器(一个 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% --

正如你所看到的,如果内存不是什么大问题,内部数组的版本是最快的,紧随其后的是 each迭代器,在遥远的第三个...... sort

关于perl - 从 Perl 中的散列中获取具有最高值的键的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com