免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3381 | 回复: 14
打印 上一主题 下一主题

遍历点的问题 [复制链接]

sinian126 该用户已被删除
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-03 16:14 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽
sinian126 该用户已被删除
2 [报告]
发表于 2013-05-03 20:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2013-05-03 20:21 |只看该作者
这是一个基本的关于图的算法。思路,
先将路径映射表转换成散列的散列,然后做一个遍历就 OK 了
sinian126 该用户已被删除
4 [报告]
发表于 2013-05-03 21:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2013-05-03 21:18 |只看该作者
#!perl

use 5.014;
use YAML qw(Dump);

my @lines = <DATA>;

say Dump(path_to_array(check_path('0', get_node_table(@lines))));

sub get_node_table {
  my @lines = @_;
  my $node_table = {};
  foreach my $line (@lines) {
    chomp $line;
    my ($node, $to) = split /\s+/, $line;
    if (exists $node_table->{$node}) {
      $node_table->{$node}{$to} = 1;
    }
    else {
      $node_table->{$node} = { $to => 1 };
    }
  }
  return $node_table;
}

sub check_path {
  my ($from, $node_table) = @_;
  my $path = { $from => 1 };
  my @nodes = ($from);
  foreach my $node (@nodes) {
    if (exists $node_table->{$node}) {
      my @sub_nodes = keys $node_table->{$node};
      push @nodes, @sub_nodes;
      my $location = $path->{$node};
      foreach my $sub_node (@sub_nodes) {
        $path->{$sub_node} = $location + 1;
      }
    }
  }
  return $path;
}

sub path_to_array {
  my $path = shift;
  my $path_list = {};
  while (my ($node, $depth) = each %$path) {
    # say "nodenode depthdepth";
    if (exists $path_list->{$depth}) {
      push @{$path_list->{$depth}}, $node;
    }
    else {
      $path_list->{$depth} = [$node];
    }
  }
  return $path_list;
}

__DATA__
0 1
0 2
1 3
1 4
2 4
2 5
3 6
4 7
4 8
5 8

论坛徽章:
0
6 [报告]
发表于 2013-05-03 22:41 |只看该作者
网络太慢了,更新个帖子也不行!
在这里更新吧!

输出结果:
  1. perl -w get_path.pl
  2. ---
  3. -
  4.   - 0
  5.   - 1
  6.   - 4
  7.   - 8
  8. -
  9.   - 0
  10.   - 1
  11.   - 4
  12.   - 7
  13. -
  14.   - 0
  15.   - 1
  16.   - 3
  17.   - 6
  18. -
  19.   - 0
  20.   - 2
  21.   - 4
  22.   - 8
  23. -
  24.   - 0
  25.   - 2
  26.   - 4
  27.   - 7
  28. -
  29.   - 0
  30.   - 2
  31.   - 5
  32.   - 8

  33. >Exit code: 0    Time: 0.547
复制代码
代码如下:
  1. #!perl

  2. use 5.014;
  3. use YAML qw(Dump);

  4. my @lines = <DATA>;

  5. say Dump(check_path('0', get_node_table(@lines)));

  6. sub get_node_table {
  7.   my @lines = @_;
  8.   my $node_table = {};
  9.   foreach my $line (@lines) {
  10.     chomp $line;
  11.     my ($node, $to) = split /\s+/, $line;
  12.     if (exists $node_table->{$node}) {
  13.       $node_table->{$node}{$to} = 1;
  14.     }
  15.     else {
  16.       $node_table->{$node} = { $to => 1 };
  17.     }
  18.   }
  19.   return $node_table;
  20. }

  21. sub check_path {
  22.   my ($from, $node_table) = @_;
  23.   my $max_depth = scalar keys $node_table;
  24.   my @path = ([$from]);
  25.   my @end_path;
  26.   FOREACH:
  27.   foreach (1 .. $max_depth) {
  28.     my @all_path = ();
  29.     my $add_mode = 0;
  30.     foreach my $node (@path) {
  31.       my $end_node = $node->[-1];
  32.       if (exists $node_table->{$end_node}) {
  33.         $add_mode++;
  34.         my @sub_nodes = keys $node_table->{$end_node};
  35.         my @new_path = concat_seq_nodes($node, @sub_nodes);
  36.         push @all_path, @new_path;
  37.       }
  38.       else {
  39.         push @end_path, $node;
  40.       }
  41.     }
  42.     last FOREACH if ($add_mode == 0);
  43.     @path = @all_path;
  44.   }
  45.   return [@end_path];
  46. }

  47. sub concat_seq_nodes {
  48.   my ($seq, @nodes) = @_;
  49.   my @path = ();
  50.   foreach my $node (@nodes) {
  51.     push @path, [@{$seq}, $node];
  52.   }
  53.   return @path;
  54. }

  55. __DATA__
  56. 0 1
  57. 0 2
  58. 1 3
  59. 1 4
  60. 2 4
  61. 2 5
  62. 3 6
  63. 4 7
  64. 4 8
  65. 5 8
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2013-05-04 02:33 |只看该作者
本帖最后由 jason680 于 2013-05-04 02:36 编辑

回复 1# sinian126

how about this ...

$ perl node.pl
$VAR1 = '0, 1, 3, 6';
$VAR2 = '0, 1, 4, 7';
$VAR3 = '0, 1, 4, 8';
$VAR4 = '0, 2, 4, 7';
$VAR5 = '0, 2, 4, 8';
$VAR6 = '0, 2, 5, 8';


$ cat node.pl
#! /usr/bin/env perl
use strict;
use warnings;
use Data::Dumper qw(Dumper);

my @aData;
while(<DATA>){
  chomp;
  my($sNode, $sNext) = split;
  push @{$aData[$sNode]}, $sNext;
}

print Dumper(node_tree(0));
#print Dumper(node_tree(1));

sub node_tree{
  my($sNode) = @_;
  my @aNode;
  if(!defined @{$aData[$sNode]}){
    return $sNode;
  }
  foreach(@{$aData[$sNode]}){
    foreach my $sNext(node_tree($_)){
      push @aNode, "$sNode, $sNext";
    }
  }
  return @aNode;
}

__DATA__
0 1
0 2
1 3
1 4
2 4
2 5
3 6
4 7
4 8
5 8

   

论坛徽章:
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
8 [报告]
发表于 2013-05-04 08:44 |只看该作者
{:3_188:}{:3_188:}
  1. #!/usr/bin/perl
  2. my %world;
  3. sub hello {
  4.     my ( $h, $k ) = @_;
  5.     return [$k] unless defined $h->{$k};
  6.     map [ $k, @$_ ], map hello( $h->{$k}, $_ ), keys %{ $h->{$k} };
  7. }
  8. map { /(\d)\D+(\d)/; $world{$1}{$2} = $world{$2} } reverse <DATA>;
  9. print join( ' - ', @$_ ) . $/ for hello \%world, 0;

  10. __DATA__
  11. 0 1
  12. 0 2
  13. 1 3
  14. 1 4
  15. 2 4
  16. 2 5
  17. 3 6
  18. 4 7
  19. 4 8
  20. 5 8
复制代码
  1. 0 - 1 - 4 - 8
  2. 0 - 1 - 4 - 7
  3. 0 - 1 - 3 - 6
  4. 0 - 2 - 4 - 8
  5. 0 - 2 - 4 - 7
  6. 0 - 2 - 5 - 8
复制代码
sinian126 该用户已被删除
9 [报告]
发表于 2013-05-04 11:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
sinian126 该用户已被删除
10 [报告]
发表于 2013-05-04 11:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP