免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4987 | 回复: 9
打印 上一主题 下一主题

hash中找出重复的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-23 13:17 |只看该作者 |倒序浏览
有一些文件数据以hash的格式存储,如下:
1=> 'abc'
2=> 'eee'
3=> 'abc'
4=> 'ddd'
5=> 'lkdiep'
6=> 'bki'
7=> 'ddd'
。。。
。。。
。。。

想取出重复的如: 4=> 'ddd' 和 7=> 'ddd'的键值。想请教各位高手用什么办法可以操作快一点,因为文件比较大。


谢谢了!

[ 本帖最后由 andylei 于 2009-2-23 13:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-23 13:58 |只看该作者
文件有多大
一般是排序然后比较相邻的行
或者以现在的value为key建立hash

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2009-02-23 13:59 |只看该作者

回复 #1 andylei 的帖子

扫描一遍文件,把 => 后面的作为 key,前面的做 value 构造 hash

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-02-23 14:00 |只看该作者
原帖由 DQP 于 2009-2-23 13:58 发表
文件有多大
一般是排序然后比较相邻的行

这也是个方法。先用 sort 处理下。

论坛徽章:
0
5 [报告]
发表于 2009-02-23 14:18 |只看该作者
谢谢大家的回复。

我自己想了个方法,刚刚试验过蛮快的。想法如下:

构造好hash后,
1) 使用grep 先将所有出现过一次以上的值都存入一个列表。

   my %count= ();
    my @crops = values %diffHash_1;
    my @duplicates = grep { ++$count{$_} > 1} @crops;

    print "@duplicates\n";

2)使用循环比较@duplicates 和hash里的值有出现2次及以上的就取出hash的键值。

测试了一下,3.1M(164900行数据)的文件用了3分多钟,在接受的范围内了。

如果哪位高手有更好的方法,请贴出来参考一下,万分感谢。

论坛徽章:
0
6 [报告]
发表于 2009-02-23 14:28 |只看该作者

回复 #5 andylei 的帖子

解决问题就是好的
看上去你的第一个hash是
不过你的%diffHash_1是以 =>前面为key 后面为value构建的
这个hash实际上并没有起到什么作用。
只用过一次 就是把其中的values全取出来。
有些浪费了。

论坛徽章:
0
7 [报告]
发表于 2009-02-23 14:36 |只看该作者
谢谢你的点评,是我没有描述清楚,因为在之前的需要做其他的工作所以才会有第一个diffHash_1的hash结构。

谢谢

论坛徽章:
0
8 [报告]
发表于 2009-02-23 14:42 |只看该作者
原来是这样啊
那个grep写得很有意思 我也拿去用用 谢谢

论坛徽章:
0
9 [报告]
发表于 2009-02-23 16:28 |只看该作者
@andylei
>构造好hash后,
>1) 使用grep 先将所有出现过一次以上的值都存入一个列表。
> my %count= ();
> my @crops = values %diffHash ...

you can put those keys with duplicated values directly in to @duplicates:
%count = ();
@duplicates = grep {++$count{$hash{$_}} > 1 } keys %hash;

论坛徽章:
0
10 [报告]
发表于 2009-02-27 11:21 |只看该作者
#! /usr/bin/perl -w


use strict;

my $reg = qr/=>/;
my @tmp = ();
my %hash = ();
my %dup = ();

open SRC, "<result.txt" or die "can not open file $!\n";

while(<SRC>){
    chomp;
    @tmp = split $reg;
    if(not defined $hash{$tmp[1]}){
        $hash{$tmp[1]} = $tmp[0];
    }
    else{
        if(not defined $dup{$tmp[1]}){
            $dup{$tmp[1]} = join ",", $hash{$tmp[1]}, $tmp[0];
        }
        else{
            $dup{$tmp[1]} = join ",", $dup{$tmp[1]}, $tmp[0];
        }
    }
}

foreach (keys %dup) {
    print join "=>$_\n", split(",", $dup{$_}), "\n";
}

close SRC;

我写的,请各位高手指正
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP