红宝石。使用大哈希查找慢速哈希值



我使用的哈希大小为1000万。。。

hash={'Aatater'=>2, 'Bbabber'=>3, 'Xaazerx'=>2, 'Caackersc'=>1}

搜索密钥的速度非常快。即使密钥存在于散列的末尾。。。

hash['Caackersc']=>1

但是,如果你搜索一个存在于散列深处的值,它将非常缓慢。

hash.key(1)=>"Caackersc"

所以。我第一次尝试在搜索价值时达到很高的速度。我想我会把杂碎倒过来。但这会导致重复的值被删除。

hash.invert{ 2=>'Xaazerx', 3=>'Bbabber', 1=>'Caackersc'}

所以我试着用丢失的数据来反转哈希。。。通过在每个新键之前发出一个索引号。

I_hash=Hash.new
hash.to_a.each_with_index{|h,i| i_hash[[i.to_s,h[1].to_s]]=h[0]}
{["0","2"]=>'Aatater', ["1","3"]=>'Bbabber', ["2","2"]=>' Xaazerx', ["3","1"]=>'Caackersc'}

所以。在这一点上,我可以用同样邪恶的快速搜索新钥匙。

i_hash[["1","3"]] => "Bbabber"

但是现在。。。我希望键的索引部分可以用正则表达式找到?

I_hash[/d/,"3"]=>fail, nil

所以。。。这是我加速值搜索的最佳尝试,但只有在我能正则表达式键的第一个数组的情况下,它才会起作用。

你的想法是对的。对于反向散列,您希望每个值都是原始散列中相应键的数组。类似这样的东西:

hash = { 'Aatater' => 2, 'Bbabber' => 3, 'Xaazerx' => 2, 'Caackersc' => 1 }
inv_hash = hash.keys.group_by {|k| hash[k] }
p inv_hash
# => { 2 => [ "Aatater", "Xaazerx" ],
#      3 => [ "Bbabber" ],
#      1 => [ "Caackersc" ] }
p inv_hash[2]
# => [ "Aatater", "Xaazerx" ]

您也可以像这样计算倒数:

hash.each_with_object({}) { |(k,v),h| (h[v] ||= []) << k }
  #=> {2=>["Aatater", "Xaazerx"], 3=>["Bbabber"], 1=>["Caackersc"]} 

如果遇到性能问题,可以考虑使用redis。

最新更新