perl是计算每个数组元素发生率的更好方法
我有两个数组,一个是根数组,它包含大量的元素。另一个是测试数组,所有元素都是根数组的子集。我想构造一个新数组,其大小等于根数组,它在特定位置的元素值表示测试数组中该元素的计数 以下代码在2个数组大小较小时运行良好。但我遇到的实际问题是,根数组大约有15000个元素,而测试的数组大约有14000个。perl是计算每个数组元素发生率的更好方法,perl,machine-learning,svm,Perl,Machine Learning,Svm,我有两个数组,一个是根数组,它包含大量的元素。另一个是测试数组,所有元素都是根数组的子集。我想构造一个新数组,其大小等于根数组,它在特定位置的元素值表示测试数组中该元素的计数 以下代码在2个数组大小较小时运行良好。但我遇到的实际问题是,根数组大约有15000个元素,而测试的数组大约有14000个。 我想知道有没有更好的算法。你们有什么建议吗? 更好的算法是使用散列来保持计数。对于示例阵列,它将如下所示。(并且将比您的解决方案运行得快得多) 输出为: 1 2 3
我想知道有没有更好的算法。你们有什么建议吗?
更好的算法是使用散列来保持计数。对于示例阵列,它将如下所示。(并且将比您的解决方案运行得快得多)
输出为:
1 2 3 4 5 6 7 8 10
2 1 1 0 0 0 0 0 0
@seen{@root}
是由@root
数组键入的哈希片。如果未找到任何@root
元素的项,则映射提供零
map{$\/'0'}
部分是说,如果$\
有一个计数,则将其传递给join
一个计数,否则将传递一个零。如果你自己不尝试编写一个解决方案,你将得不到满意的答案。这些值不是频率:它们是简单的计数。继续尝试一个解决方案,然后我们将很乐意为您提供改进代码的建议。解决方案可能会使用散列的散列来保存数据,其中“id”作为外部散列的键,列号作为内部散列的键。比如$seen{$id}{$col}++
。谢谢你的建议。我试了大约8个小时,终于成功了。但当数组数量和大小增加时,效果并不理想。希望与您讨论请不要使用坏的、实验性的~
操作符。很好!对于简单的计数,我还喜欢将For
循环压缩为一行:$seen{$}++For@aa
#!/usr/bin/perl
use strict;
use warnings;
my @root=qw(1 2 3 4 5 6 7 8 10);
my @aa=qw(1 1 2 3);
print join("\t", @root), "\n";
my %seen;
for my $data (@aa) {
$seen{$data}++;
}
print join("\t", map {$_ // '0'} @seen{@root}), "\n";
1 2 3 4 5 6 7 8 10
2 1 1 0 0 0 0 0 0