最近在群里对于 ETL 自动化测试的讨论很激烈,其中提到了返回大量数据比对的效率问题,这里介绍一种基于哈希的快速的比对算法。
题目:两个数组@A, @B,找出其中相同的和不同的元素分别存入数组@OnlyA, @OnlyB, @Same中。
算法说明:利用哈希自带的判断 key 是否存在方法进行快速查找
算法实现:Perl 版 (Java 可以用 hashmap 或 hashtable)
use strict;
use warnings;
use Data::Dumper;
main();
sub main {
my @A = ('123', '321', '123', '213', '312');
my @B = ('123', 'abc', '321', 'bca', 'cba','abc');
my %hash;
my @OnlyA;
my @OnlyB;
my @Same;
foreach (@A) {
chomp;
$hash{$_} += 1;
}
my %count = %hash;
foreach(@B) {
chomp;
if (exists($hash{$_}) && $hash{$_} > 0){
$hash{$_} -= 1;
}else {
push @OnlyB,$_;
}
}
my $countA;
foreach (keys %hash) {
my $tmp = $_;
if ($hash{$_} >= 0) {
#Only A
for(1..$hash{$_}) {
push @OnlyA, $tmp;
}
#Same
for(1..($count{$_} - $hash{$_})) {
push @Same, $tmp;
}
} else {
push @OnlyB, $tmp;
}
}
print "Only A:\n";
print Dumper @OnlyA;
print "Only B:\n";
print Dumper @OnlyB;
print "Same:\n";
print Dumper @Same;
}