perl – 排序与线性搜索查找最小值/最大值

前端之家收集整理的这篇文章主要介绍了perl – 排序与线性搜索查找最小值/最大值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近,我在perl中遇到了以下代码,它返回所有传递的参数中的最小数值.

return 0 + ( sort { $a <=> $b } grep { $_ == $_ } @_ )[0];

我通常使用简单的线性搜索来查找列表中的最小值/最大值,这对我来说似乎很简单且充分优化.以上代码是否比简单的线性搜索更好?在这种情况下与perl有什么关系?谢谢!

解决方法

O()没有说算法需要多长时间.例如,在其他条件相同的情况下,我总是在以下两个中选择算法2:

>算法1:O(2 * N 1000天)= O(N)
>算法2:O(5 * N 100 ms)= O(N log N)

O()指定当输入的大小增加时算法采用比例的时间. (好吧,它可以用于任何资源,而不仅仅是时间.)由于前面两个答案只是用O()来谈,所以它们没用.

如果你想知道哪种算法对于给定大小的输入更好的算法有多快,你需要对它们进行基准测试.

在这种情况下,看起来List::Util的分钟总是明显更好.

$perl x.pl 10
           Rate  sort LUmin
sort  1438165/s    --  -72%
LUmin 5210584/s  262%    --

$perl x.pl 100
           Rate  sort LUmin
sort   129073/s    --  -91%
LUmin 1485473/s 1051%    --

$perl x.pl 1000
          Rate  sort LUmin
sort    6382/s    --  -97%
LUmin 199698/s 3029%    --

码:

use strict;
use warnings;

use Benchmark  qw( cmpthese );
use List::Util qw( min );

my %tests = (
   'sort'  => 'my $x = ( sort { $a <=> $b } @n )[0];','LUmin' => 'my $x = min @n;',);

$_ = 'use strict; use warnings; our @n; ' . $_
   for values %tests;

local our @n = map rand,1..( $ARGV[0] // 10 );
cmpthese(-3,\%tests);

猜你在找的Perl相关文章