0

大きな数と小さな数を含む配列があります。WireSharkからログを実行した後に取得しました。

配列は次のようになります(バイト送信の場合):

@Array=qw(10912980
10924534
10913356
10910304
10920426
10900658
10911266
10912088
10928972
10914718
10920770
10897774
10934258
10882186
10874126
8531
8217
3876
8147
8019
68157
3432
3350
3338
3280
3280
7845
7869
3072
3002
2828
8397
1328
1280
1240
1194
1193
1192
1194
6440
1148
1218
4236
1161
1100
1102
1148
1172
6305
1010
5437
3534
4623
4669
3617
4234
959
1121
1121
1075
3122
3076
1020
3030
628
2938
2938
1611
1611
1541
1541
1541
1541
1541
1541
1541
1541
1541
1541
1541
1541
583
370
178)

これらの配列を注意深く見ると、人間の目には明らかなことが1つあります。本当に大きな数と小さな数があります。配列を2つの異なる配列に分割したいと思います。それには、しきい値を設定する必要があります。配列1は大きい番号(10924534-10874126)のみであり、配列2は小さい番号(68157-178)である必要があります。ところで、配列はソートされていません。ユーザーはしきい値を入力しないため、賢明に決定する必要があります。

手伝って頂けますか?

4

2 に答える 2

6

しきい値を取得したら、必要なのは2つを効率的に分割することだけです。

my (@hi, @lo);
push @{ $_ >= $threshold ? \@hi, \@lo }, $_ for @Array;

grep要素ごとに2回またはmapコールバックを呼び出すよりもはるかに高速である必要があります。

申し訳ありませんが、これは完全な答えではありません。

于 2012-09-19T21:41:38.673 に答える
4

速くて醜い解決策:

# threshold
my $t = 0;
$t += log $_ foreach @Array;
$t = exp ($t / @Array);
print "My threshold=$t\n";

my @hi = grep { $_ >  $t } @Array;
my @lo = grep { $_ <= $t } @Array;

あなたのデータでは、選択されたしきい値は10017であり、これはあなたの場合の平均または中央値よりもはるかに優れています。

于 2012-09-19T21:51:34.610 に答える