2012-08-11 4 views
-2

노드 사이의 가장 가까운 거리를 찾고 싶습니다. 나는에서 가장 가까운 거리를 찾으려는 노드 2 노드 1에서 5의 가장 가까운 거리노드 사이의 가장 가까운 거리 찾기

노드, 배, 예를 들어 Y

 
1, 3, 5 
2, 6, 9 
3, 13, 15 
4, 16, 20 
5, 30, 50 

됩니다 여기

내 샘플 데이터입니다 모든 노드는 노드 2,3,4,5와 같다.

어떻게 이것을 펄에서 구현할 수 있습니까? 여기

는 내가 지금까지 무엇을 가지고 :

use strict; 
use warnings; 
use Data::Dumper; 

open(IN , "<" , "sample.txt") or die "Can't open this file."; 

my @two_dimentional_array; 
while (my $line=<IN>) 
{ 
    my @arr_line=split (" *, *" , $line); 
     my @one_dimentional_array; 
     push @one_dimentional_array , @arr_line; 
     push @two_dimentional_array, [@arr_line]; 
} 

for(my $i=0 ; $i<=$#two_dimentional_array ; $i++) 
{ 
    my ($n_1 , $X_1 , $y_1)[email protected]{$two_dimentional_array[$i]}; 
    for (my $j=0 ; $j<=$#two_dimentional_array ; $j++) 
    { 
     my ($n_2 , $X_2 , $y_2)[email protected]{$two_dimentional_array[$j]}; 

     chomp($y_1); 
     chomp($y_2); 
     if($n_1 != $n_2) 
     { 
      my $distance=sqrt(($X_2-$X_1)**2 + ($y_2-$y_1)**2); 
      print "Distance ".$distance." from node ".$n_1." to node ".$n_2."\n"; 
     } 
    } 
} 
#print Dumper(\@two_dimentional_array); 

답변

1
#!/usr/bin/perl 

use strict; 
use warnings; 

my (@data, @temp, @result); 

sub calc { 
    my ($a, $b) = @_; 
    my $dat = 0; 
    $dat += ($a->[$_] - $b->[$_]) ** 2 for (1,2); 
    return sqrt $dat; 
} 

while (<DATA>) { 
    push @data, [split /,?\s+/]; 
} 

for my $x (@data) { 
    for my $y (@data) { 
     push @temp, [calc($x, $y), $x, $y] if ($x->[0] > $y->[0]); 
    } 
} 

@result = sort { $a->[0] <=> $b->[0]; } @temp; 
printf "%-18s => [%s], [%s]\n", $_->[0], 
    join(', ', @{$_->[1]}), join(', ', @{$_->[2]}) for @result; 

__DATA__ 
1, 3, 5 
2, 6, 9 
3, 13, 15 
4, 16, 20 
5, 30, 50 

출력 :

5     => [2, 6, 9], [1, 3, 5] 
5.8309518948453 => [4, 16, 20], [3, 13, 15] 
9.21954445729289 => [3, 13, 15], [2, 6, 9] 
14.142135623731 => [3, 13, 15], [1, 3, 5] 
14.8660687473185 => [4, 16, 20], [2, 6, 9] 
19.8494332412792 => [4, 16, 20], [1, 3, 5] 
33.1058907144937 => [5, 30, 50], [4, 16, 20] 
38.9101529166874 => [5, 30, 50], [3, 13, 15] 
47.5078940808788 => [5, 30, 50], [2, 6, 9] 
52.4785670536077 => [5, 30, 50], [1, 3, 5] 
+0

그때 내가 그것을 impliment 수있는 방법을 해시를 사용하고자하는 선생님? –

+0

@FaisalHashmi : 해시를 왜 사용 하시겠습니까? – Borodin

1

이 코드는 떨어져 최소 거리 인 첫 번째 쌍을 찾을 수 있습니다.

use strict; 
use warnings; 

# @data contains (node number, x, y) from the file 
# 
my @data; 

open my $fh, '<', 'sample.data' or die $!; 

while (<$fh>) { 
    my @node = /\d+/g; 
    push @data, \@node if @node; 
} 

# @min contains (first node number, second node number, distance) 
# for the most recently-found minimum distance 
# 
my @min; 

for my $node1 (0 .. $#data-1) { 
    for my $node2 ($node1+1 .. $#data-1) { 
    my $dist; 
    $dist += ($data[$node2][$_] - $data[$node1][$_]) ** 2 for 1, 2; 
    $dist = sqrt $dist; 
    @min = ($data[$node1][0], $data[$node2][0], $dist) unless @min and $min[2] <= $dist; 
    } 
} 

printf "%d to %d = %f\n", @min; 

출력

1 to 2 = 5.000000 
관련 문제