我正在使用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
所以...这是我加速值搜索的最佳尝试,但只有在我可以正则表达密钥的第一个数组的情况下,它才能适用于我的情况。
答案 0 :(得分:4)
你有正确的想法。对于反向散列,您希望每个值都是原始散列中相应键的数组。像这样:
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" ]
答案 1 :(得分:1)
你也可以这样计算逆:
hash.each_with_object({}) { |(k,v),h| (h[v] ||= []) << k }
#=> {2=>["Aatater", "Xaazerx"], 3=>["Bbabber"], 1=>["Caackersc"]}
答案 2 :(得分:-1)
如果遇到性能问题,可以考虑使用redis。