免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3189 | 回复: 11

如何用perl实现求数组子集的问题呢 [复制链接]

论坛徽章:
0
发表于 2013-07-03 09:31 |显示全部楼层
例如有一个含有n个元素的数组,列举出其所有的子集,如果用perl快速实现呢? 高手们请出手

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2013-07-03 09:34 |显示全部楼层
子集是什么意思?
排列 还是组合?

论坛徽章:
0
发表于 2013-07-03 10:23 |显示全部楼层
回复 2# grshrd49
例如数组 1,2,3 求出其真子集{1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}


   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2013-07-03 16:04 |显示全部楼层
  1. perl -le '@a=(1,2,3,4,5);
  2. my %h;
  3. sub f{
  4.   my $r = shift;
  5.   $h{join " ",@$r}=1;
  6.   if($#$r > 0){
  7.     foreach my $index (0..$#$r){
  8.     my @subarr = @$r;
  9.     splice(@subarr,$index,1);
  10.     $h{join " ",@subarr}=1;f(\@subarr)
  11.     }
  12.   }
  13. };
  14. f(\@a);
  15. $,="\n";
  16. print (keys %h)
复制代码

论坛徽章:
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
发表于 2013-07-03 19:54 |显示全部楼层
本帖最后由 rubyish 于 2013-07-03 16:29 编辑

  1. #!/usr/bin/perl
  2. use 5.018;
  3. sub SS {
  4.     my @R = sub {
  5.         my ( $h, @t ) = @{ +shift };
  6.         $h ? map { $_, [ $h, @$_ ] } __SUB__->( \@t ) : [] }->(@_);
  7.     sort { @$a <=> @$b } @R[ 1 .. $#R ];
  8. }

  9. say "@$_" for SS [ 1 .. 5 ];
复制代码

论坛徽章:
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
发表于 2013-07-03 19:56 |显示全部楼层
假设传入的数组为 :  1 .. 5
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 1 2
  7. 1 3
  8. 2 3
  9. 1 4
  10. 2 4
  11. 3 4
  12. 1 5
  13. 2 5
  14. 3 5
  15. 4 5
  16. 1 2 3
  17. 1 2 4
  18. 1 3 4
  19. 2 3 4
  20. 1 2 5
  21. 1 3 5
  22. 2 3 5
  23. 1 4 5
  24. 2 4 5
  25. 3 4 5
  26. 1 2 3 4
  27. 1 2 3 5
  28. 1 2 4 5
  29. 1 3 4 5
  30. 2 3 4 5
  31. 1 2 3 4 5
复制代码

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2013-07-03 20:09 |显示全部楼层
回复 5# rubyish

perl果然是奇葩
map { $_, [ $h, @$_ ] } __SUB__->( $n - 1, \@t ) }->(@_); 中 __SUB__ 这个是啥意思呢?

论坛徽章:
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
发表于 2013-07-03 20:13 |显示全部楼层
回复 7# grshrd49


    itself, the sub

论坛徽章:
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
发表于 2013-07-03 21:36 |显示全部楼层
or~
  1. #!/usr/bin/perl
  2. use 5.018;
  3. sub SS {
  4.     my $h = shift;
  5.     $h ? map { $_, [ $h, @$_ ] } SS(@_) : [];
  6. }

  7. my @R = SS 1 .. 5;
  8. say "@$_" for sort { @$a <=> @$b } @R[ 1 .. $#R ];
复制代码
line9: or
  1. say "@$_" for  map $_->[1], sort { $a->[0] <=> $b->[0] }  map [ scalar @$_, $_ ], @R[ 1 .. $#R ];
复制代码

论坛徽章:
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
发表于 2013-07-05 02:05 |显示全部楼层
这也许是有更容易:
  1. #!/usr/bin/perl
  2. use 5.018;

  3. my @a = 'a' .. 'd';
  4. my $t = '%0' . @a . 'b';
  5. for ( 1 .. 2**@a - 1 ) {
  6.     my @b = split '', sprintf $t, $_;
  7.     say "@a[ grep $b[$_], 0 .. $#b ]";
  8. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP