Ruby Hash#has#key?`和#Array#index的性能`

Ruby Hash#has#key?`和#Array#index的性能`,ruby,arrays,performance,hash,Ruby,Arrays,Performance,Hash,我经常检查特定值是否在大数组中。我可以通过Array#index来实现这一点。为了提高效率,我创建了数组值的散列,并调用hashᜯhaveŠhave棼key?: 方法1 arr = ["a","b","c","d"] arr.index("c") 方法2 h = {"a"=> true, "b"=> true, "c"=> true, "d"=> true} h.has_key?("c") 但我注意到,如果一个键不在给定的哈希中,ruby会抛出一个异常。我想知

我经常检查特定值是否在大数组中。我可以通过
Array#index
来实现这一点。为了提高效率,我创建了数组值的散列,并调用
hashᜯhaveŠhave棼key?

  • 方法1

    arr = ["a","b","c","d"]
    arr.index("c")
    
  • 方法2

    h = {"a"=> true, "b"=> true, "c"=> true, "d"=> true}
    h.has_key?("c")
    
但我注意到,如果一个键不在给定的哈希中,ruby会抛出一个异常。我想知道这两种方法的相对性能是什么。

要回答你的问题,“方法2”应该更快。现在,这是一个负载非常大的语句,部分取决于散列的性质(例如)

然而,对于您的特定用例,我认为数组和散列都是“用于此工作的错误工具”。通常,如果您使用散列来检查唯一集是否存在(提示),请使用
set

最后一个想法,可能有价值,也可能没有价值,这取决于你的例子有多做作。如果您存储的是一组有限的有序值(在您的示例中是a'-'d'),那么数组无疑是一种方法。为什么?因为您可以轻松地将字母表的值映射到数组索引(例如,a映射到0,b映射到1等等),在您的情况下,可以将字母转换为ascii并进行减法以获得它们所需的位置。这将给您一个O(1)查找时间。

要回答您的问题,“方法2”应该更快。现在,这是一个负载非常大的语句,部分取决于散列的性质(例如)

然而,对于您的特定用例,我认为数组和散列都是“用于此工作的错误工具”。通常,如果您使用散列来检查唯一集是否存在(提示),请使用
set


最后一个想法,可能有价值,也可能没有价值,这取决于你的例子有多做作。如果您存储的是一组有限的有序值(在您的示例中是a'-'d'),那么数组无疑是一种方法。为什么?因为您可以轻松地将字母表的值映射到数组索引(例如,a映射到0,b映射到1等等),在您的情况下,可以将字母转换为ascii并进行减法以获得它们所需的位置。这将给您一个O(1)查找时间。

Ruby在标准库中有一个构造,可以提供您想要的:使用
#include?
进行O(1)查找


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

Ruby在标准库中有一个构造,它为您提供了所需的:O(1)使用
\include?
进行查找


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

为什么不自己找出最适合您的情况的方法呢?不确定为什么您认为如果一个键不在散列中,ruby会抛出异常(除非您故意使用
h.fetch
h[“a”]
不会在示例代码中抛出异常;它只会返回
nil
奇怪…由于某种原因,当我第一次尝试它时,我得到了豁免。结果我忘了带钥匙的“?”,没有很好地注意错误。很抱歉你的观点不清楚。您的第二个方法是否会抛出错误?这部分内容不可复制。如果你的问题仅仅是性能问题,那么你应该去掉第一点。为什么不自己找出什么最适合你的情况呢?不确定为什么您认为如果一个键不在散列中,ruby会抛出异常(除非您故意使用
h.fetch
h[“a”]
不会在示例代码中抛出异常;它只会返回
nil
奇怪…由于某种原因,当我第一次尝试它时,我得到了豁免。结果我忘了带钥匙的“?”,没有很好地注意错误。很抱歉你的观点不清楚。您的第二个方法是否会抛出错误?这部分内容不可复制。如果您的问题只是性能问题,那么您应该删除第一点。仔细想想,集合绝对是理想的数据结构。所有的答案都说得差不多,但你会得到第一名的奖励!谢谢“[C]将字母转换为ascii码并进行减法以获得所需的位置”是一个丑陋的黑客行为。这不是红宝石色的。@sawa,那是什么意思?当您担心性能时,“丑陋的黑客”是标准的程序。考虑到这一点,集合肯定是理想的数据结构。所有的答案都说得差不多,但你会得到第一名的奖励!谢谢“[C]将字母转换为ascii码并进行减法以获得所需的位置”是一个丑陋的黑客行为。这不是红宝石色的。@sawa,那是什么意思?当您担心性能时,“丑陋的黑客”是标准程序。
require 'set'
arr = ["a","b","c","d"]
set = Set.new(arr)
set.include?("c")