perl是计算每个数组元素发生率的更好方法

perl是计算每个数组元素发生率的更好方法,perl,machine-learning,svm,Perl,Machine Learning,Svm,我有两个数组,一个是根数组,它包含大量的元素。另一个是测试数组,所有元素都是根数组的子集。我想构造一个新数组,其大小等于根数组,它在特定位置的元素值表示测试数组中该元素的计数 以下代码在2个数组大小较小时运行良好。但我遇到的实际问题是,根数组大约有15000个元素,而测试的数组大约有14000个。 我想知道有没有更好的算法。你们有什么建议吗? 更好的算法是使用散列来保持计数。对于示例阵列,它将如下所示。(并且将比您的解决方案运行得快得多) 输出为: 1 2 3

我有两个数组,一个是根数组,它包含大量的元素。另一个是测试数组,所有元素都是根数组的子集。我想构造一个新数组,其大小等于根数组,它在特定位置的元素值表示测试数组中该元素的计数

以下代码在2个数组大小较小时运行良好。但我遇到的实际问题是,根数组大约有15000个元素,而测试的数组大约有14000个。
我想知道有没有更好的算法。你们有什么建议吗?


更好的算法是使用散列来保持计数。对于示例阵列,它将如下所示。(并且将比您的解决方案运行得快得多)

输出为:

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