2016-12-04 7 views
1

hashsetの間の唯一の違いは、セットにはキーがないということです。他の重要な違いはありますか?セットとハッシュの違いは?

+6

Nahには、__values__はありません。彼らはキーのみを持っています:)(内部的には、ルビーセットはハッシュで実装されています) –

+0

これは、多くの違いを意味します...もっと具体的にしてください。 – Gabriel

答えて

2

すべてのハッシュがセットであるわけではありませんが、ハッシュをセットとして使用できます。

セットは

  • 番号なしの値であるコレクションを...ある
  • ユニーク
キーのみとハッシュが一致し

、そのセットは、多くの場合、唯一のキーを持つハッシュとして実装されているので、 。キーはセット内の値として使用されるため、キーを素早く参照して反復することができます。

Perlでは、リストをハッシュに入れて重複排除し、それをセットとして処理するのが一般的です。

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

RubyのSetクラスはハッシュを囲む薄いラッパーです。たとえば、Set#addとなります。

# File set.rb, line 312 
def add(o) 
    @hash[o] = true 
    self 
end 

何かがセットに含まれているかどうかを確認したい場合は、そのハッシュにO(1)ルックアップがあるかどうかを確認してください。

# File set.rb, line 214 
def include?(o) 
    @hash[o] 
end 

交差点や共用体などのほとんどの設定操作は非常に高速です。交差点は、あるハッシュのキーが他のハッシュ内にあるかどうか、つまりO(n)操作(キー衝突を除いて)があるかどうかをチェックするだけです。これはRubyの仕組みです。

def intersect?(set) 
    set.is_a?(Set) or raise ArgumentError, "value must be a set" 
    if size < set.size 
    any? { |o| set.include?(o) } 
    else 
    set.any? { |o| include?(o) } 
    end 
end 

ユニオンは、両方のハッシュを1つの新しいハッシュとO(n)操作に結合します。

def |(enum) 
    dup.merge(enum) 
end 
+0

私はあなたの最後のテキスト行に '両方のハッシュ 'の参照を混同しました。 –

関連する問題