免费注册 查看新帖 |

Chinaunix

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

新手perl问题求助 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2007-02-08 21:04 |显示全部楼层
楼主能不能把题目说得清楚一点,我比较有兴趣
@ARRAY 里面原来存的是什么...

[ 本帖最后由 xiaoshengcaicai 于 2007-2-8 21:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-02-08 21:07 |显示全部楼层
原帖由 福瑞哈哥 于 2007-2-8 18:33 发表
不用语言如何描述算法? 管他是真语言假语言总得有一种吧,perl还不错,语法简单,千万别用C玩算法。你可以去下载一本《Mastering Algorithms with Perl》,以前翻了一遍,还不错。


我认为大多数算法不用C的话,性能不高,算法效率狠低。。。

论坛徽章:
0
3 [报告]
发表于 2007-02-08 21:21 |显示全部楼层
现在有数组里的@array,经过如下转换:

$num=0;
while($num<=(@array/2)){
push @two_array, [@array[$num],@array[$num+1]];
     $num+=2;
}

里面的数据应该是:
a,b;
a,c;
b,e;
b,f;
c,e;
c,f;
b,c;
e,f;


@ARRAY里面是什么值?
$num=0;
while($num<=(@array/2)){
push @two_array, [@array[$num],@array[$num+1]];
     $num+=2;
}
这段算法是你写的?

论坛徽章:
0
4 [报告]
发表于 2007-02-08 21:35 |显示全部楼层
a,b;
a,c;
b,e;
b,f;
c,e;
c,f;
b,c;
e,f;

我对楼主题目的理解是:

有a,b,c,d,e,f 这些字母, a 到b, a到c有通路, b到e,b到f有通路,.....
现在要求任意2个字母之间的最短路径,并需要求出路径经过的字母

论坛徽章:
0
5 [报告]
发表于 2007-02-08 21:39 |显示全部楼层
任意两个字母之间一共有多少个不同的路线,每条路线经过了多少个字母:

最简单的方法就是先构造一个图, 用hash实现就可以,然后对所有的字母使用广度优先遍历

构造hash+ array ref的数据结构,用来存储路径

论坛徽章:
0
6 [报告]
发表于 2007-02-08 22:03 |显示全部楼层
哦。我有个问题
两个字母之间的通路, 中间的字母是不是不允许经过2次或以上

如果是这样的话,不需要用广度优先遍历,我刚才想到一个更好一点的算法

PS, 我也是菜鸟

[ 本帖最后由 xiaoshengcaicai 于 2007-2-8 22:08 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-02-08 22:39 |显示全部楼层


  1. #!perl
  2. use strict;

  3. use Data::Dumper;
  4. use constant MAX_DEPTH => 100;

  5. my @array = (
  6.     ['a','b'],
  7.     ['a','c'],
  8.     ['b','e'],
  9.     ['b','f'],
  10.     ['c','e'],
  11.     ['c','f'],
  12.     ['b','c'],
  13.     ['e','f'],
  14. );

  15. #make graph map
  16. my $map = {};
  17. for (@array) {
  18.     push @{ $map->{$_->[0]} }, $_->[1];
  19. }

  20. #print Dumper($map);

  21. #start
  22. my @result = ();
  23. my $depth = 1;
  24. my @start_array = ();

  25. for (keys %$map) {
  26.     push @start_array, { start => $_, end => $_, visited => { $_ => 1} };
  27. }

  28. while ( $depth <= MAX_DEPTH  and @start_array > 0) {
  29.     my @new_start_array = ();
  30.     for my $to_expand (@start_array) {
  31.         my $ra_can_expand = $map->{ $to_expand->{end} };
  32.         for my $can_expand (@$ra_can_expand) {
  33.             if (not $to_expand->{visited}->{$can_expand}) {
  34.                 my %tmp_visited = %{ $to_expand->{visited} };
  35.                 $tmp_visited{$can_expand} = 1;
  36.                 my $new = {
  37.                     start => $to_expand->{start},
  38.                     end => $can_expand,
  39.                     visited => \%tmp_visited,
  40.                 };
  41.                 push @new_start_array, $new;
  42.                 push @result, $new;
  43.             }
  44.         }
  45.     }
  46.    
  47.    
  48.     @start_array = @new_start_array;
  49.     $depth++;
  50. }

  51. print "the all result is \n";
  52. for my $one (@result) {
  53.     my $cost = ( keys %{ $one->{visited} } ) - 1;
  54.     print $one->{start} . '-' . $one->{end} . " cost $cost\n";
  55. }
复制代码

[ 本帖最后由 xiaoshengcaicai 于 2007-2-8 22:46 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-02-09 08:53 |显示全部楼层
TO 楼上,可以放BLOG里面提供下载

PS,你觉得我的算法是否可行?有什么问题吗,昨天随手写的, 没细想

论坛徽章:
0
9 [报告]
发表于 2007-02-09 09:08 |显示全部楼层
刚上传了一把
http://blog.chinaunix.net/u/26905/showart_245044.html

这本书我没看过 >_<

不能保证链接一直有效,因为这本书大了点.以后没空间我会删掉它
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP