自动化工具 基于哈希的快速比对算法

xi0w · 2014年06月16日 · 最后由 chengyu 回复于 2014年06月16日 · 1365 次阅读
本帖已被设为精华帖!

最近在群里对于 ETL 自动化测试的讨论很激烈,其中提到了返回大量数据比对的效率问题,这里介绍一种基于哈希的快速的比对算法。

题目:两个数组@A@B,找出其中相同的和不同的元素分别存入数组@OnlyA, @OnlyB, @Same中。

算法说明:利用哈希自带的判断 key 是否存在方法进行快速查找

  1. @A中的数组元素作为哈希的 Key,以个数作为 Value,存入哈希%hash 中
  2. 遍历@B,判断@B中的各元素是否在%hash 中存在,若存在则%hash 的 Value 减 1,并且将%hash 中不存在的值存入@OnlyB
  3. 遍历%hash,当 value > 0 时,为仅存在于@A中的元素,当 value = 0 时,表示为@A@B共有的元素,value < 0 时,为@B中仅有的元素

算法实现: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;
}
共收到 1 条回复 时间 点赞

1000 个赞

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册