免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: patagonia2
打印 上一主题 下一主题

[算法] 数据的合并问题 [复制链接]

论坛徽章:
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
11 [报告]
发表于 2015-12-01 21:57 |只看该作者
回复 8# patagonia2


    你这数据量也不大,直接循环就行了。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
12 [报告]
发表于 2015-12-02 00:01 |只看该作者
回复 1# patagonia2
将你的文件 A,B 各贴出 100 行.
另外, A,B 文件的第二列数值表示什么含义? 峰值, 谷值各是是多少?

   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
13 [报告]
发表于 2015-12-02 21:39 |只看该作者
来一发
  1. #!perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use List::Util qw{max min};

  6. sub main;
  7. sub load_a_data;
  8. sub find_the_nearest;

  9. main;

  10. sub main {
  11.     my $a_data_href = load_a_data();
  12.     my $max = max keys %{$a_data_href};
  13.     my $min = min keys %{$a_data_href};

  14.     # read file B
  15.     my $file = 'B.txt';
  16.     open my $fh, '<', $file or die "Unable to open file $file:$!$/";
  17.     while (defined (my $line = readline $fh) ) {
  18.         # body...
  19.         chomp $line;
  20.         $line =~ s{^\s+ | \s+$}{}gmix;
  21.         next if not $line;

  22.         my ($word, $num) = split /\s+/, $line;
  23.         my $words_aref = find_the_nearest($num, $a_data_href, $max, $min);
  24.         print "$word\t@{$words_aref}$/";
  25.         
  26.     }
  27.     close $fh;
  28. }

  29. sub load_a_data {
  30.     # body...
  31.     my %data = ();
  32.     my $file = 'A.txt';

  33.     open my $fh, '<', $file or die "Unable to open file $file:$!$/";
  34.     while (defined (my $line = readline $fh) ) {
  35.         # body...
  36.         chomp $line;
  37.         $line =~ s{^\s+ | \s+$}{}gmix;
  38.         next if not $line;

  39.         my ($word, $num) = split /\s+/, $line;

  40.         push @{ $data{$num} }, $word;
  41.     }

  42.     close $fh;

  43.     return \%data;
  44. }

  45. sub find_the_nearest {
  46.     # body...
  47.     my ($num, $a_data_href, $max, $min) = @_;
  48.     my $words_aref = [];

  49.     if (exists $a_data_href->{$num}) {
  50.         # if exactly matched
  51.         $words_aref = $a_data_href->{$num};
  52.     }
  53.     else {
  54.         if ($num < $min) {
  55.             # only need to look for numbers greater than $num
  56.             my $new_num = $num;
  57.             while (1) {
  58.                 $new_num += 1;
  59.                 if (exists $a_data_href->{$new_num}) {
  60.                     $words_aref = $a_data_href->{$new_num};
  61.                     last;
  62.                 }
  63.             }
  64.         }
  65.         elsif ($num > $max){
  66.             # only need to look for numbers smaller than $num
  67.             my $new_num = $num;
  68.             while (1) {
  69.                 $new_num -= 1;
  70.                 if (exists $a_data_href->{$new_num}) {
  71.                     $words_aref = $a_data_href->{$new_num};
  72.                     last;
  73.                 }
  74.             }
  75.         }
  76.         else {
  77.             # look for numbers both way
  78.             my $new_num_bigger  = $num;
  79.             my $new_num_smaller = $num;

  80.             while (1) {
  81.                 $new_num_bigger  += 1;
  82.                 $new_num_smaller -= 1;

  83.                 my @words = ();
  84.                 if (exists $a_data_href->{$new_num_bigger}) {
  85.                     push @words, @{ $a_data_href->{$new_num_bigger} };
  86.                 }

  87.                 if (exists $a_data_href->{$new_num_smaller}) {
  88.                     push @words, @{ $a_data_href->{$new_num_smaller} };
  89.                 }

  90.                 if (scalar @words) {
  91.                     $words_aref = \@words;
  92.                     last;
  93.                 }
  94.             }

  95.         }
  96.     }

  97.     return $words_aref;
  98. }


  99. __END__
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 赞一个!

查看全部评分

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
14 [报告]
发表于 2015-12-03 09:19 |只看该作者
回复 13# stanley_tam

谢谢大圣指导。

偶测试看看
   
   

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
15 [报告]
发表于 2015-12-03 09:22 |只看该作者
回复 12# sunzhiguolu


谢谢指导。
第二列数值 > 0

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
16 [报告]
发表于 2015-12-03 09:27 |只看该作者
回复 11# MMMIX

谢谢指导。

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
17 [报告]
发表于 2015-12-03 09:30 |只看该作者
回复 7# 523066680

大圣为什么删除代码
   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
18 [报告]
发表于 2015-12-03 11:36 |只看该作者
回复 13# stanley_tam


   
            while (1) {
                $new_num_bigger  += 1;
                $new_num_smaller -= 1;


方法简单而思路巧妙
确实非常巧妙,赞一个 [ ]

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
19 [报告]
发表于 2015-12-03 13:10 |只看该作者
多谢大神的赞 回复 18# substr函数


   

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
20 [报告]
发表于 2015-12-04 10:20 |只看该作者
回复 19# stanley_tam


呵呵,就是这个意思。
非常感谢大圣,程序没有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP