2010-12-01 96 views
3

「一維」散列在陣列的我只是想知道如何使用一個維散列的效率(即只鍵,沒有價值觀 - 我們不關心他們無論如何)在一個維數組。優勢在Perl

我想用哈希用於這一目的的主要的原因是這樣我就可以使用exists函數,看看是否一個「入門」已經存在。哈希也非常適合不重複鍵?對於數組,我需要設置自己的涉及grep的檢查,我認爲這會比較慢。

然後這個哈希/數組將迭代通過某些操作。

我很想聽聽提前對此有什麼見解,並感謝!

回答

7
exists $hash{ $key } 

是一個不錯的,簡短的表達,清晰和易於使用。顯然

!!grep { $_ eq $key } @array 

是不是很短,但

$key ~~ @array # smart match 

更短。所以從5.10開始,它就像句法上的一樣易於測試智能匹配爲exists。因此,從數組和哈希之間的性能差異猜測,我可以想象,聰明的匹配將執行更快的一小列項目,但哈希將到目前爲止勝過數組查找與大項目列表。

然而,你無論如何都應該Benchmark性能。


這就是原因。草莓perl的,甚至一個列表大小1,哈希查找優於字符串匹配:

array_lookup 577701/s   --   -46% 
hash_lookup 1068376/s   85%   -- 

與列表中的2項:

array_lookup 464684/s   --   -57% 
hash_lookup 1068376/s   130%   -- 

並與20個項目:

array_lookup 181554/s   --   -83% 
hash_lookup 1068376/s   488%   -- 

我會使用散列。

+0

非常感謝智能匹配和基準測試的領導者,我想知道多大的'大'會是,並且這清楚地說明了! – Bharat 2010-12-01 17:53:54

5

是的。如果你想檢查一個項目是否存在於一個數組中,你必須遍歷每一個項目。在散列表中,您只需查找關鍵字即可。這對於大數據集來說更快。

4

這絕對是Perl中的一項標準技術。我自己的腳本充滿了這樣的代碼:

my @elements = (...); 
my %is_element = map { $_ => 1 } @elements; 

有很多Stack Overflow的例子, herehere

仰望在哈希is approximately O(1)的關鍵。

+2

[`List :: MoreUtils :: uniq`](http://search.cpan.org/perldoc?List::MoreUtils#uniq) – Axeman 2010-12-01 13:24:17

5

在數學意義上,散列鍵是sets和陣列tuples。例如,元組('apple', 'banana')('banana', 'apple')是不同的實體,而集合{'apple', 'banana'}{'banana', 'apple'}是相同的。

當你需要元組時,你需要使用集合和元組。

如果您需要執行設置操作,您可能需要使用Set::Object,而不是每次都從頭開始編寫操作。

如果您打算使用散列鍵來表示集合,那麼將值設置爲undef而不是1可以減少內存佔用量,這可能會影響您的集合很大。

+0

感謝設置模塊的建議,這會讓前段時間更容易一些。在這個模塊中編寫獨特的檢查很容易,因爲我已經決定把東西逐個推送到哈希中,我肯定會使用undef。謝謝! – Bharat 2010-12-01 17:56:27