免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 取并集
12
最近访问板块 发新帖
楼主: mcshell
打印 上一主题 下一主题

取并集 [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
11 [报告]
发表于 2012-11-29 23:23 |只看该作者
这不是个图吗

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
12 [报告]
发表于 2012-11-30 00:53 |只看该作者
本帖最后由 yinyuemi 于 2012-11-30 01:56 编辑

回复 6# kk861123

还有一种情况如下,
  1. 1 2
  2. 2 3
  3. 5 6
  4. 1 5
复制代码
结果应该是
  1. 1 2 3 5 6
复制代码
  1. #!/usr/bin/perl
  2. use strict;
  3. use Data::Dumper;

  4. my %hash1;  # for storing data
  5. my %hash2;  # for tracking data
  6. my $index = 0;
  7. while(<DATA>){
  8.     chomp;
  9.     my %hash3; # for alignment of data
  10.     $index++;  # always updating the key of hash1
  11.     my @data = split;
  12.     map{$hash3{$hash1{$_}} = 1 if exists $hash1{$_}}@data;
  13.     if (scalar %hash3){
  14.                 map{
  15.                         push @{$hash2{$index}},@{$hash2{$_}};
  16.                         delete $hash2{$_};
  17.                 }keys %hash3;
  18.                 push @{$hash2{$index}},(@data); # update the tracking data
  19.                 map{$hash1{$_} = $index}@{$hash2{$index}}; # update the storing data
  20.     }else{
  21.         map{$hash1{$_} = $index}@data; # update the storing data
  22.         @{$hash2{$index}} = (@data); # update the tracking data
  23.     }
  24. };
  25. my %output;
  26. map{push @{$output{$hash1{$_}}},$_}keys %hash1;
  27. print Dumper \%output;

  28. __DATA__
  29. a b
  30. b c
  31. d
  32. b e
  33. a f
  34. 1 2
  35. 2 3
  36. 3 2
  37. 4 7 8
  38. 5 7
  39. 6
  40. 7 4 5 8
  41. 8 4 7
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
13 [报告]
发表于 2012-11-30 05:57 |只看该作者
这:
  1. #!/usr/bin/perl
  2. my %h;
  3. sub merge {
  4.     my ( @a, $ok, %t ) = @_;
  5.     for my $k ( keys %h ) {
  6.         $k =~ /$_/ and $ok++ and last for @a;
  7.         next unless $ok;
  8.         last if $k eq "@a";
  9.         my @k = grep { !$t{$_}++ } @{ $h{$k} }, @a;
  10.         delete @h{ $k, "@a" };
  11.         $h{"@k"} = [@k];
  12.         last;
  13.     }
  14.     $h{"@a"} = [@a] unless $ok;
  15. }

  16. merge split while <DATA>;
  17. merge @{ $h{$_} } for keys %h;
  18. print $_, $/ for keys %h;
  19. __DATA__
  20. a b
  21. b c
  22. d
  23. b e
  24. a f
  25. 1 2
  26. 2 3
  27. 3 2
  28. 4 7 8
  29. 5 7
  30. 6
  31. 7 4 5 8
  32. 8 4 7
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
14 [报告]
发表于 2012-11-30 09:03 |只看该作者

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
15 [报告]
发表于 2012-11-30 17:57 |只看该作者
本帖最后由 rubyish 于 2012-11-30 13:59 编辑

某一段:
  1. #!/usr/bin/perl
  2. my ( %h, %g );
  3. while (<DATA>) {
  4.     my @a = split;
  5.     map { push @{$h{$_}}, @a } @a;
  6. }
  7. for my $k ( keys %h ) {
  8.     next if $g{$k};
  9.     my %t;
  10.     my @a = grep { !$t{$_}++ } map { $a = $_; map { $b = $_;
  11.                         map { @{$h{$_}} } @{$h{$b}} } @{$h{$a}} } @{$h{$k}};
  12.     @g{@a} = (1) x @a;
  13.     print join(' ', @a), $/;
  14. }
  15. __DATA__
  16. a b
  17. b c
  18. d
  19. b e
  20. a f
  21. 1 2
  22. 2 3
  23. 3 2
  24. 4 7 8
  25. 5 7
  26. 6
  27. 7 4 5 8
  28. 8 4 7
复制代码

论坛徽章:
0
16 [报告]
发表于 2012-12-12 17:27 |只看该作者
rubyish 发表于 2012-11-30 17:57
某一段:


楼上兄弟,你的代码,我没看懂,能解释下吗?

论坛徽章:
1
CU大牛徽章
日期:2013-03-14 14:08:55
17 [报告]
发表于 2012-12-12 22:27 |只看该作者
回复 6# kk861123

我写的,差距怎么那么大呢,貌似脑子里没有一点数据结构的用法。。。。。。。。。学习中
  1. open FILE, "<test.data" or die "cannot open test.data";
  2. my @lines = <FILE>;
  3. close FILE;

  4. for my $line (@lines)
  5. {
  6.     chomp $line;
  7.     my @nums = split ' ', $line;
  8.     my $sign = 0;

  9.     for my $collection (@collections)
  10.     {   
  11.         for my $num (@nums)
  12.         {   
  13.             if (grep /^$num$/, @$collection)
  14.             {   
  15.                 $sign = 1;
  16.                 last;
  17.             }   
  18.         }   
  19.         if ($sign == 1)
  20.         {   
  21.             push @$collection, grep {
  22.                 my $num = $_;
  23.                 !grep /^$num$/, @$collection;
  24.             } @nums;
  25.             last;
  26.         }   
  27.     }   
  28.     if ($sign == 0)
  29.     {
  30.         push @collections, \@nums;
  31.     }
  32. }

  33. for (@collections)
  34. {
  35.     print join " ", sort @$_;
  36.     print "\n";
  37. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP