Если бы это были только слова без {"over the"=>"under the"}
, тогда я думаю, что что-то вроде этого будет быстрее, чем сканирование строки снова и снова, как это делают большинство решений.
Сначала я преобразовать массив в чистом Hash
h=Hash.new
@dictionary.each {|ft| h[ft[:from]]=ft[:to]}
=> {"quick"=>"lazy", "over the"=>"under the", "jumps"=>"flies"}
затем сканировать строку слово за словом
@text.split(/ /).each{|w| h[w] || w}.join(" ")
=> "lazy brown fox flies over the lazy dog"
Также не страдает от множественной проблемы замещения.
h["brown"]="quick"
=> {"brown"=>"quick", "quick"=>"lazy", "over the"=>"under the", "jumps"=>"flies"}
@text.split(/ /).each{|w| h[w] || w}.join(" ")
=> "lazy quick fox flies over the lazy dog"
Я сделал несколько тестов, и мне пришлось добавить много больше пара замены, чем я думал, прежде чем выше решения есть быстрее, чем gsub!
.
require 'benchmark'
@dictionary = [{:to=>"lazy", :from=>"quick"}, {:to=>"flies", :from=>"jumps"}, {:from => "over the", :to => "under the"}]
@text = "quick brown fox jumps over the lazy dog" * 10000
Benchmark.bm do |benchmark|
benchmark.report do
h=Hash.new
@dictionary.each {|ft| h[ft[:from]]=ft[:to]}
[email protected](/ /).each{|w| h[w] || w}.join(' ')
end
benchmark.report do
@dictionary.each { |pair| @text.gsub!(/#{pair[:from]}/, pair[:to]) }
end
@dictionary+=[{:to=>"black", :from=>"brown"}, {:to=>"ox", :from=>"fox"}, {:to=>"hazy", :from=>"lazy"}, {:to=>"frog", :from=>"dog"}]
@[email protected]*15
benchmark.report do
h=Hash.new
@dictionary.each {|ft| h[ft[:from]]=ft[:to]}
[email protected](/ /).each{|w| h[w] || w}.join(' ')
end
benchmark.report do
@dictionary.each { |pair| @text.gsub!(/#{pair[:from]}/, pair[:to]) }
end
end
Результаты:
user system total real
0.890000 0.060000 0.950000 ( 0.962106)
0.200000 0.020000 0.220000 ( 0.217235)
0.980000 0.060000 1.040000 ( 1.042783)
0.980000 0.030000 1.010000 ( 1.011380)
gsub!
раствор в 4,5 раза быстрее, только три пары замены. На 105 пар замена split
решение, наконец, так же быстро, оно фактически только на 10% меньше, чем 105 пар замен, чем на три. gsub!
получил пять раз медленнее.
Не имеет смысла хранить словарь как хэш? '@dictionary = {'lazy' => 'quick', 'flies' => 'jumps', 'над' => 'под'}' – kejadlen