我们经常需要求一组数据的最小值和最大值, 我们也可以很容易的取到最小值或者最大值:
记录当前的最小值, 然后每个数和最小值比较, 以此得到最小值(最大值)。
这样理论上, 取得最小值需要n-1次比较, 最大值也需要n-1次比较, 如果我们同时需要最小值和最大值, 那么需要2n-2次比较, 也就是大约2n次比较。
那有没有更高效的办法呢?
我们可以这样:
俩俩比较数据, 然后小的和最小值比较, 大的和最大值比较, 这样对于每2个数据, 我们只需要比较3次。对于所有的数据我们只需要 3(n-2)/ 2, 也就是大概1.5n次。
虽然提升并不算特别大, 但是当数据量很大时, 节省的资源也是很可观的。
具体实现:
my @nums = (2,4,9,7,8,1,3,11,33,13,22,5);my $max;my $min;if (@nums % 2){ #奇数个$max = shift @nums;$min = $max;}else{ #偶数个$max = shift @nums;if($max < $nums[0]){$min = $max;$max = shift @nums;}else{$min = shift @nums;}}
my $biger;my $smaller;while(@nums > 0){if ($nums[0] > $nums[1]){$biger = shift @nums;$smaller = shift @nums;}else{$smaller = shift @nums;$biger = shift @nums;}$max = $max > $biger ? $max : $biger;$min = $min < $smaller ? $min : $smaller;}print "max:$max\nmin:$min\n";
文章转载自EasyPerl,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




