`Hash#has_key?` 和 `Array#index` 的性能

Performance of `Hash#has_key?` and `Array#index`

我经常检查某个特定值是否在一个大数组中。我可以通过 Array#index 做到这一点。为了提高效率,我创建了数组值的散列并调用 Hash#has_key?:

但我注意到 ruby 如果某个键不在给定的哈希中,则会引发异常。我想知道这两种方法的相对性能如何。

要回答您的问题,"Method 2" 应该会更快。现在,这是一个负载很大的语句,部分取决于哈希的性质(例如 collisions when inserting)。

但是,对于您的特定用例,我认为数组和散列都是 "wrong tool for the job"。通常,如果您使用散列来检查唯一集是否存在(提示提示),请使用 set.

最后一个想法,它可能有价值也可能没有价值,具体取决于您的示例的设计程度。如果您要存储一些有限的有序值集(在您的示例中为 'a'-'d'),则数组 definitely 是可行的方法。为什么?因为您可以轻松地将字母表的值映射到数组索引(例如,a 映射到 0,b 映射到 1 等等),在您的情况下,通过将字母转换为 ascii 并减去它们所需的位置。这会给你一个 O(1) 查找时间。

Ruby 在标准库中有一个结构可以满足您的需求:使用 #include?.

的 O(1) 查找

Set class documentation

require 'set'
arr = ["a","b","c","d"]
set = Set.new(arr)
set.include?("c")

但是请注意,这仅在您不关心重复元素时才有效(但我假设情况是基于您的第二种方法,这也取决于该假设)。