2013-04-30 1 views
0

해쉬 해시가 있습니다. 모든 "마스터 키"를 서로 비교해야합니다 (숫자입니다). foreach 루프가 perl을 사용하는 것보다 크다

foreach my $masterkey1 (keys %HOH){ 
foreach my $masterkey2 (keys %HOH){ 
     if ($masterkey1 > $masterkey2){ 
      ... do some stuff... 
     } 
    } 
} 

그러나 메모리 사용을 줄이기 위해 두 번째 foreach 루프와 if 문을 결합 할 수는있다 : 여기에 내 코드입니다.

어쩌면 뭔가

같은
foreach my $masterkey1 (keys %HOH){ 
    foreach my $masterkey2 (keys %HOH < $masterkey1){ 
     ... do some stuff... 
    } 
} 
  • 감사합니다 :)

답변

2
foreach my $masterkey1 (keys %HOH){ 
    foreach my $masterkey2 (grep { $_ < $masterkey1 } keys %HOH){ 
     ... do some stuff... 
    } 
} 

나는이 더 효율적입니다 확실하지 않다. 내부 루프는 키를 두 번 통과해야합니다 : 하나는 $masterkey1보다 작은 모든 키를 찾은 다음 실제로 "할 일"을해야합니다.

베스트 별도의 변수에 키 목록을 저장하는 것입니다 : 키

@keys = keys %HOH; 
foreach my $masterkey1 (@keys) { 
    foreach my $masterkey2 (@keys) { 
     if ($masterkey1 > $masterkey2) { 
      # do some stuff 
     } 
    } 
} 
1

복사 분류 : 이제 목록이 정렬되어

my @keys = sort { $a <=> $b } keys %HOH; 

, 당신은 각각의 키를 잡을 수 목록의 끝과 그 이전의 모든 내용과 비교해보십시오.

while (my $masterkey1 = pop @keys) { 
    foreach my $masterkey2 (@keys) { 
     # do some stuff with $masterkey1 and $masterkey2 
    } 
} 
+0

우수 솔루션. – ikegami

+0

실제로 내부 루프는 작은 키 위에 있어야합니다. 결정된. – ikegami

+0

개선해 주셔서 감사합니다! – Narveson

1

아마도 하 고 싶지 않을 것입니다. 귀하의 키 목록을 통해 스캐닝 한 두 개의 중첩 루프. 실행에 걸리는 시간은 최상위 해시에있는 키 수와 함께 기하 급수적으로 증가합니다. 해시가 상대적으로 작은 경우가 아니라면 중요한 문제가 발생할 수 있습니다.

실제로 달성하고자하는 것을 말하지 않았지만 더 큰 값을 비교하고 있으므로 sort으로 시작하는 것이 좋습니다. 나는 그 게시 된 코드와 기능적으로 동일의 당신에게 줄 수있는 최선은 다음과 같습니다,

my @masterkeys = sort { $a <=> $b } keys %HOH; 
for my $outer (1 .. $#masterkeys) { 
    for my $inner (0 .. $outer - 1) { 
    # We already know $masterkeys[$outer] > $masterkeys[$inner], 
    # so no need to test that 
    ... do some stuff ... 
    } 
} 

이 적어도 당신의 게시 된 코드보다 좀 더 효율적으로 될 것입니다,하지만 당신은 당신이 실제로 달성하려는 사항을 알려주십시오 경우 , 나는 여전히 많은 개선이있을 것이라고 생각한다.

편집 :이 답변에 당 영업 이익의 코멘트 ". 나는 masterkeys의 모든 비교하고 내가 일반적인 얼마나 많은 키를 계산합니다 "

여기에 두 가지의 공통 키를 찾는 방법

my %count; 
$count{$_}++ for keys %hash1; 
$count{$_}++ for keys %hash2; 
my @keys_in_common = grep { $count{$_} == 2 } keys %count; 

두 해시 키들의 총 수에 따라 선형 적으로 증가이 처리에 필요한 시간 때문에 매우 큰 데이터 세트를 효율적 남는다 해시.

+1

'sort {$ a <=> $ b} keys % HoH' – Zaid

+0

감사합니다. Zaid와 Ikegami, asciibetical 대신에 내 정렬 숫자를 작성했습니다. 나는 항상 그걸 잊어 버리는 것 같아. –

+0

매우 큰 데이터 세트 임 사용하므로 코드가 효율적이라는 것이 매우 중요합니다. – user2335015

관련 문제