忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12
最近访问板块 发新帖
楼主: Chinaaa123

如何可以提高hash遍历的效率 [复制链接]

论坛徽章:
0
发表于 2018-05-21 23:21 |显示全部楼层
回复 10# laputa73
感谢回复,有个问题再请教下:如果A文件 是由句柄读入,再push进入@A,改成下面这样就出不来结果,是不是哪里改错了呢? while(<IN>){
      chomp;
      push @A,(split/\t/,$_);
      my $a=shift @A;
}

      my $match=0;
      while (<DATA>){
          chomp;
          my @b= split /\t/,$_;
          if (($b[1] >= $a->[0]) && ($b[1] <= $a->[1])){
           my $sum+=$b[2];
          print OUT "$a->[0],$a->[1],$sum\n";
          $match=1;
      }
      elsif($match !=0){
          $a=shift @A;
          $match=0;
      }
  }

---FileA----------原始fileA只有两列,你写的时候@A=([10000,25000,0],[35000,40000,0])是这样,我理解的是第三列加了0是为了判断match么,不知是否理解有错?
10000   10005   0
10006   10010   0
10011   10017   0

---FileB----------
xx    10000   1
xx    10001   4
xx    10002   4
xx    10003   39
xx    10004   43
xx    10005   15
xx    10006   5
xx    10009   1
xx    10010   43
xx    10011   3
xx    10012   4
xx    10013   2
xx    10014   1
xx    10015   23
xx    10016   51
xx    10017   11
-----结果-----------最终结果如下,中间的累加步骤结果就不需要了,运行了你写的脚本,会出现中间的累加步骤
10000   10005   130
10006   10010   49
10011   10017   95








论坛徽章:
39
技术图书徽章
日期:2018-08-21 13:30:492015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2018-08-21 13:30:242016科比退役纪念章
日期:2018-03-07 11:23:33
发表于 2018-05-22 08:23 |显示全部楼层
回复 11# Chinaaa123


@A没在前面定义吧.而且,我用@A是为了方便,你直接在while 里面操作就行了
排序好的文件就和数组操作是差不多的
第三列放的是累加值.也是为了方便.

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2018-05-25 08:08 |显示全部楼层
对比两个散列,遍历其中一个,另外一个不用遍历,直接用 exists $hash_two->{$find_key} 来判断是否存在,如果存在,然后在对比,如果不存在,就 next ..

数值在 Hash 的 Key 中,会自动转换成 String, 对比时,如果不转换成 Int, 会出错,因为:

    '2' > '10'  &&  2 < 10
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP