我正在使用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
答案 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)
所以我选择哈希。