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 应该只有大数字 (10924534-10874126),数组 2 应该是较小的数字 (68157-178)。顺便说一句,数组未排序。用户不会输入阈值,因此应该明智地确定。

你能帮助我吗?

4

2 回答 2

6

一旦你有了阈值,你所需要的就是有效地分割两者:

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

它应该比每个元素调用两次grep或回调要快得多。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 回答