2016-12-04 83 views
1

在我看來,hashset之間的唯一真正區別在於它們沒有密鑰。還有其他重要的區別嗎?set和hash之間的區別?

+6

那麼,集沒有__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 

聯合將兩個散列組合成一個新的散列,也是一個O(n)操作。

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

我對你在最後一行文本中對「哈希」的引用感到困惑。 –

相關問題