数学で同じです。さまざまな方法で機能を利用できます。
まず、値のリストがあれば、それらの最大値と最小値を見つけて、最大値と最小値を持つリストの要素にそれぞれ対応するインデックスを選択できます。これは下記のusing_only_max_min
関数で実装されています。この方法では、極値ごとに2回、極値を見つけるために1回、対応する指標を見つけるためにもう1回、各極値の2つのパスを作成します。
また、値のリストがあれば、リスト内の極値に対応するインデックスを見つけて、それらのいずれかの極値に対応する値を選択して極値の値を取得することができます。これは、下記のusing_by_functions
ルーチンで実装されています。
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use List::AllUtils qw(max min max_by min_by);
my @n = (1, 3, 5, 8, 8, 3, 2, 4, 4, 6);
print Dumper using_only_max_min(\@n);
print Dumper using_by_functions(\@n);
sub using_only_max_min {
my $n = shift;
my $max = max @$n;
my @argmax = grep $n->[$_] == $max, 0 .. $#$n;
my $min = min @$n;
my @argmin = grep $n->[$_] == $min, 0 .. $#$n;
return {
max => $max,
argmax => \@argmax,
min => $min,
argmin => \@argmin,
};
}
sub using_by_functions {
my $n = shift;
my @argmax = max_by { $n->[$_] } 0 .. $#$n;
my $max = $n->[$argmax[0]];
my @argmin = min_by { $n->[$_] } 0 .. $#$n;
my $min = $n->[$argmin[0]];
return {
max => $max,
argmax => \@argmax,
min => $min,
argmin => \@argmin,
};
}
出力:
$VAR1 = {
'argmin' => [
0
],
'max' => 8,
'min' => 1,
'argmax' => [
3,
4
]
};
$VAR1 = {
'argmax' => [
3,
4
],
'min' => 1,
'max' => 8,
'argmin' => [
0
]
};
あなたはまた、任意のライブラリを使用せずにこれを行うには、一度に2つの極値を見つけることができます。以下の関数は、max
とmin
の2つのエントリを含むハッシュリファレンスを返します。その最初の値の極値の値であり、第2の値が極値に対応するインデックスのリストであり、リストにそれらの点の各々:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @n = (1, 3, 5, 8, 8, 3, 2, 4, 4, 6);
print Dumper find_extrema(\@n, sub { $_[0] <=> $_[1]});
sub find_extrema {
my ($n, $cmp) = @_;
my ($max, $min) = ([$n->[0], [0]], [$n->[0], [0]]);
for my $i (1 .. $#$n) {
my $v = $n->[$i];
my $r = $cmp->($v, $max->[0]);
if ($r >= 0) {
$r ? $max = [$v, [$i]] : push @{ $max->[-1] }, $i;
next;
}
my $s = $cmp->($v, $min->[0]);
if ($s <= 0) {
$s ? $min = [$v, [$i]] : push @{ $min->[-1] }, $i;
}
}
return {
max => $max,
min => $min,
};
}
出力:
$VAR1 = {
'min' => [
1,
[
0
]
],
'max' => [
8,
[
3,
4
]
]
};
35ポイント移動しますすでに100kを表示しています。あなたはすぐにあなたの方法を来ているマグカップを持っている! :) – simbabque
私はこの関数を再利用できることを望んでいたので、なぜそれをサブに入れましたか?私は最初に%hashを読んでこれに戻ってくるつもりです。これまでのご意見ありがとうございます! – AlexAMP
@イムバンク:まだそれは何ですか? – Borodin