2012-10-30 116 views
1

我在閱讀有序文件,必須按小時,按分鐘或按秒發生次數。如果要求,我必須打印出現0次(標準化輸出)的時間或跳過它們(非標準化輸出)。輸出必須顯然是有序的。迭代Perl數組的最有效方法是什麼?

我首先想到了使用數組。當輸出是非標準化的,我做的大致等價的:

@array[10] = 100; 
@array[10000] = 10000; 

並打印結果:

foreach (@array) { 
    print if defined; 
} 

是否有減少迭代只在陣列中定義的元素的方法嗎?在前面的例子中,這意味着只做兩次迭代,而不是使用$#array。然後我還需要一種方法來了解循環中當前的數組索引。這樣的事情存在嗎?

我想越來越多地使用散列代替。使用散列可以解決我的問題,並且不需要將hh:mm:ss時間轉換爲索引,反之亦然。

或者你有更好的解決方案來建議這個簡單的問題?

+3

哈希確實是你在這種情況下所需要的。 – Benoit

+1

當「鍵」或「索引」範圍與有意義元素的數量(即稀疏結構)相比相對較大時,散列更適合。如果有意義元素的數量相對於指數範圍(密集結構)而言較高,並且計算指標的成本較低,則數組可以更省時,因爲它避免了哈希算法的開銷。 – DavidO

+0

問題是,我想,爲什麼你首先使用數組?索引是你數據的一部分嗎?如果不是,爲什麼要打擾他們呢? – TLP

回答

6

是的,使用散列。如果您的鍵排序正確,您可以遍歷散列鍵的有序數組。

+0

我使用數組解決了一個解決方案。散列的好處並不明顯,因爲我的數據一般在一天內分佈很好。特別是在每小時製作統計數據時。使用散列,我不需要排序鍵,因爲它們表示時間值。我只需要隨時間迭代並打印相應的散列值。散列會根據情況節省一些內存。也許它也會更快(對於這個問題),但我不得不測試。 –

+0

您的數據是否有規律間隔或不規則?如果不規則,最終會留下浪費空間的空隙;在這個時期能夠說出'0事件'所需要的粒度越多,您將擁有的空間就越多。也許如果你舉幾個實例,它會更清晰。 –

2

您也可以記住只是對數字的數組:

#!/usr/bin/perl 
use warnings; 
use strict; 

my @ar = ([ 10, 100 ], 
      [ 100, 99 ], 
      [ 12, 1 ], 
      [ 13, 2 ], 
      [ 15, 1 ], 
     ); 

sub normalized { 
    my @ar = sort { $a->[0] <=> $b->[0] } @_; 
    map "@$_", @ar; 
} 

sub non_normalized { 
    my @ar = sort { $a->[0] <=> $b->[0] } @_; 
    unshift @ar, [0, 0] unless $ar[0][0] == 0; 
    my @return; 
    for my $i (0 .. $#ar) { 
     push @return, "@{ $ar[$i] }"; 
     push @return, $_ . $" . 0 for 1 + $ar[$i][0] .. $ar[$i + 1][0] - 1; 
    } 
    return @return; 
} 


print join "\n", normalized(@ar), q(); 
print "\n"; 
print join "\n", non_normalized(@ar), q(); 
相關問題