2009-12-08 3 views
2

다음과 같이 특정 방식으로 (트리 형태로) 정렬 된 데이터 집합이 있습니다. 기본적으로 키 = 값 쌍입니다. 마지막에 몇 가지 추가 값이 있습니다.이 값은 분기가 몇 명의 자식과 일부 정크 값을 갖고 있는지 알려줍니다.행을 구문 분석하고 키에 해당하는 값을 선택하면

11=1 123 2 
11=1>1=45 234 1 
11=1>1=45>9=16 345 1 
11=1>1=45>9=16>2=34 222 1 
11=1>1=45>9=16>2=34>7=0 2234 1 
11=1>1=45>9=16>2=34>7=0>8=0 22345 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138 22234 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0 5566 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0 664 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10 443 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 445 0 
11=1>1=47 4453 1 
11=1>1=47>9=16 887 1 
11=1>1=47>9=16>2=34 67 1 
11=1>1=47>9=16>2=340>7=0 98 1 
11=1>1=47>9=16>2=34>7=0>8=0 654 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138 5789 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0 9870 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0 3216 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 66678 0 

내 문제는 위의 데이터에서 적절한 값을 만족시키는 적절한 분기를 얻는 것입니다.이 값은 입력으로 제공됩니다. 가정 , 상기 데이터 스택의 검색 내 입력 값은 : 키 -> 값의 상기 소정의리스트, 함수 반환해야위한

5=0 
4=0 
6=10 
3=11 
11=1 
1=45 
0=138 
9=16 
2=34 
7=0 
8=0 

11 = 1> 1 = 45> (9) = 16> 2 = 34> 7 = 0> 8 = 0> 0 = 138> 5 = 0> 4 = 0> 6 = 10> 3 = 11. 마찬가지로, 키들의 다른 세트가 부여되는 또 다른 입력 파일에 대한 :

5=0 
4=0 
6=10 
3=11 
11=1 
1=45 
9=16 
2=34 
7=0 
8=0 

돌려 함수 (11) = 1> 1 = 45> (9) = 16> 2 = 34> (7) = 0> 8 = 0 1 경기를 승리로 이끌어 냈습니다. 마지막 줄이 아니야. 그것도 내 입력 키에 주어진 모든 값과 일치하지만, 정확한 일치 만 원합니다.

또한 주어진 배열에서 얼마나 많은 노드를 선택했는지 알고 싶습니다. (>로 구분).

이러한 종류의 시나리오를 구현하는 가장 좋은 방법은 무엇입니까?

+0

입력 형식을 확장 할 수 있습니까? –

+0

입력란의 ** 부분 집합 **을 트리의 루트에있는 경로와 일치 시키려면 문제가 있습니까? 또한 입력 내용이 1 = 45이고 마지막 줄에 1 = 47 만 포함되어 있기 때문에 트리의 마지막 줄이 두 번째 키의 모든 값과 어떻게 일치합니까? – sundar

+0

또한 '나무'는 항상이 예에서와 같이 될 것입니까? 루트 하위의 두 자녀는 서로 다르며 다른 모든 값은 두 하위 트리 사이에서 동일합니다. 보다 효율적인 알고리즘을 얻으려면 해당 속성을 악용 할 수 있습니다. – sundar

답변

1
use strict; 
use warnings; 

my $tree; 
while (<DATA>) { 
    my @data = split /\>/, (/^([^ ]*)/)[0]; 
    my $ptr = \$tree; 
    for my $key (@data) { 
     $ptr = \$$ptr->{$key}; 
    } 
} 

my @inputs = (
    [qw(5=0 4=0 6=10 3=11 11=1 1=45 0=138 9=16 2=34 7=0 8=0)], 
    [qw(5=0 4=0 6=10 3=11 11=1 1=45 9=16 2=34 7=0 8=0)] 
); 

sub getKey { 
    my ($lu, $node) = @_; 
    exists $lu->{$_} and return $_ for keys %$node; 
} 

for my $input (@inputs) { 
    my %lu; 
    @lu{@$input} =(); 
    my @result; 
    my $node = $tree; 
    while (%lu) { 
     my $key = getKey(\%lu, $node); 
     if ($key) { 
      $node = $node->{$key}; 
      push @result, $key; 
      delete $lu{$key}; 
     } 
     else { 
      last; 
     } 
    } 
    print join('>', @result), "\n"; 
} 

__DATA__ 
11=1 123 2 
11=1>1=45 234 1 
11=1>1=45>9=16 345 1 
11=1>1=45>9=16>2=34 222 1 
11=1>1=45>9=16>2=34>7=0 2234 1 
11=1>1=45>9=16>2=34>7=0>8=0 22345 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138 22234 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0 5566 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0 664 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10 443 1 
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 445 0 
11=1>1=47 4453 1 
11=1>1=47>9=16 887 1 
11=1>1=47>9=16>2=34 67 1 
11=1>1=47>9=16>2=340>7=0 98 1 
11=1>1=47>9=16>2=34>7=0>8=0 654 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138 5789 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0 9870 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0 3216 1 
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 66678 0 
관련 문제