我有一个数组,其中包含大数字和小数字。我是从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应该只是大数字(10924534-10874126),数组2应该是较小的数字(68157-178)。顺便说一下,数组没有排序。用户不会输入阈值,因此应该巧妙地确定。
你能帮助我吗?
答案 0 :(得分:6)
一旦达到阈值,您只需要有效地分割两个:
my (@hi, @lo);
push @{ $_ >= $threshold ? \@hi, \@lo }, $_ for @Array;
它应该比每个元素两次调用grep
或map
回调快得多。
对不起,这不是一个完整的答案。
答案 1 :(得分: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,远远好于您的平均值或中位数!!