我经常检查特定值是否在大数组中。我可以通过Array#index
执行此操作。为了提高效率,我创建了一个数组值的哈希值并调用Hash#has_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会抛出异常。我想知道这两种方法的相对表现是什么。
答案 0 :(得分:2)
要回答您的问题,"方法2"应该更快。现在,这是一个非常有用的语句,部分取决于哈希的本质(例如collisions when inserting)。
但是,对于您的特定用例,我认为数组和哈希都是"错误的工作工具"。通常,如果您使用哈希检查唯一集合存在(提示提示),请使用set
。
最后一个想法,取决于你的例子是多么做作,可能有也可能没有价值。如果您要存储一些有限的有序值(在您的示例中是' - ' d'在您的示例中),数组肯定是的方式去。为什么?因为您可以轻松地将字母表的值映射到数组索引(例如,映射到0,b映射到1等等),在您的情况下,将字母转换为ascii并减去它们以获得所需的位置。这会给你一个O(1)查询时间。
答案 1 :(得分:2)
Ruby在标准库中有一个构造,可以为您提供所需的内容:使用#include?
进行O(1)查找。
require 'set'
arr = ["a","b","c","d"]
set = Set.new(arr)
set.include?("c")
但是请注意,这只适用于您不关心重复元素的情况(但我假设情况基于您的第二种方法,这也取决于该假设)。