Ruby Hashes vs. Arrays:查找项目的最快方法?

时间:2017-09-20 05:50:00

标签: ruby

我正在使用ruby将大型TXT文件加载到数组或哈希中。输入文件包含超过1'000'000个MD5哈希值,按字母顺序排序,没有重复。

Ruby中最快的方法是找出我的数组或哈希中是否存在某个哈希值?目前我使用数组并“包含?”。

def loadhashlist
@all_hash_values = Array.new
    f = File.readlines("inputmd5.txt").each do |row|
    @all_hash_values.push(row.gsub("\n",""))
    end
end

loadhashlist

def hashlookup(file)
md5 = file.getMd5
    if @all_hash_values.include? md5
    #code goes here
    end
end

3 个答案:

答案 0 :(得分:5)

是的,你可以使用一个数组,最多只能O(logN),但使用一个集合会更快更好。

require 'set'

hashes = Set.new
hashes << 'foo'
hashes << 'bar'
hashes.include?('bar') # => true

在ruby集中使用哈希表实现,因此查找是O(1)

答案 1 :(得分:1)

Array#include?是O(N)。

相反,由于数组已经排序,您可以使用Array#bsearch,即O(lgN)。

答案 2 :(得分:1)

没有检查ruby中的实现细节(如果你完全依赖它就必须进行基准测试)但是从我在CS课程中学到的内容可以归结为:

  • 数组:基于所用方法的O(n)或O(log n)

  • 哈希(假设md5是关键):O(1)

所以我选择哈希。