从Perl中的哈希中获取最高值的密钥最简单的方法是什么?

前端之家收集整理的这篇文章主要介绍了从Perl中的哈希中获取最高值的密钥最简单的方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从Perl中的哈希中获取最高值的密钥最简单的方法是什么?

解决方法

解决方案与排序:
(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%                --

如你所见,如果内存不是很大的问题,内部数组的版本是最快的,紧随其后的是每个迭代器,并在一个遥远的第三个…排序

猜你在找的Perl相关文章