簡體   English   中英

我應該將哪種數據結構用於沒有值的哈希?

[英]Which data structure should I use for a hash without values?

我需要檢查一組標量中是否存在標量。 存儲這組標量的最佳方法是什么?

遍歷數組會產生線性檢查時間。 散列的檢查時間是不變的,但是由於我不使用散列的值部分,因此感覺效率低下。

使用哈希值,但不要使用值。 真的沒有更好的方法。

使用哈希來測試集合成員資格的內存開銷很小,並且大大超過了通過數組重復順序搜索的成本。 有很多方法可以創建一個集合成員資格樣式哈希:

my %set = map {$_ => 1} ...;

my %set; $set{$_}++ for ...;

my %set; @set{...} = (1) x num_of_items;

這些中的每一個都允許您直接在條件中使用哈希查找,而無需任何其他語法。

如果您的哈希值很大,並且您擔心內存使用情況,則可以將undef存儲為每個鍵的值。 但在這種情況下,你必須在條件中使用exists $set{...}

哈希應該沒問題。 您可以使用undef作為值並使用exists($h{$k})或者您可以使用1並使用$h{$k}

Judy :: HS應該更有效率,但也沒有該結構的無價值版本。

您可能會發現FAQ的這一部分很有用:

如何判斷某個元素是否包含在列表或數組中?

迭代數組可以完成:

my @arr = ( $list, $of, $scalars );
push @arr, $any, $other, $ones;

通過查看是昂貴的,但除非你有一個龐大的列表,否則不是那么昂貴:

grep { $_ eq $what_youre_looking_for } @arr;

哈希方法也有效:

my %hash = ( $list => 1, $of => 1, $scalars => 1 );
$hash{$another} = 1;

if ( exists $hash{$what_youre_looking_for} ) {
    ...
}

您可以實現二進制搜索和列表排序,但這些是最常用的兩種方法。

HashTable是最好的選擇。

注意: - 正如你所說的那樣,我希望沒有重復的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM