免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
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

论坛徽章:
0
发表于 2018-12-21 23:48 |显示全部楼层
  1. use strict;
  2. use warnings;

  3. my @A = ([10000,25000,0],[35000,40000,0]);

  4. my $a = shift @A;
  5. my $match = 0;

  6. while (<DATA>) {
  7.         my @b = split /,/,$_;
  8.         if (($b[1] >= $a->[0]) && ($b[1] <= $a->[1])) {
  9.                 $a->[2] += $b[2];
  10.                 $match = 1;
  11.         } elsif ($match != 0) {
  12.                 print "$a->[0],$a->[1],$a->[2]" . "\n";
  13.                 $a = shift @A;
  14.                 $match = 0;
  15.         }
  16. }



  17. __DATA__
  18. 'xx',9000,1
  19. 'xx',10001,111
  20. 'xx',10002,222
  21. 'xx',15000,333
  22. 'xx',30000,444
  23. 'xx',32000,444
  24. 'xx',33000,444
  25. 'xx',36001,555
  26. 'xx',46001,555
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP