На первый взгляд я вижу несколько оптимизаций:
В настоящее время вы разделяете каждое предложение для каждого запроса. Ваш пример данных имеет 3 предложения и 3 запроса. Это означает, что каждое предложение разделяется 3 раза (один раз для каждого запроса). Поскольку результат не зависит от запроса, вы должны сделать это заранее. Каждое предложение следует разбивать только один раз.
В настоящее время вы используете sentences.map
для итерации предложений, но не фиксируете результат. Вы используете его только для целей итерации и результаты pu sh до index_arr
. map
создает новый массив, который вы не используете, то есть вы жуете память, которую можно использовать в другом месте. Это можно изменить на each
, что гораздо эффективнее, если вы не используете возвращаемое значение.
Код query.split(' ').all? { |qur| sentence_arr.include?(qur) }
не совсем оптимальный, так как он начинает искать указанное c слово с начала sentence_arr
каждый раз. Проверка того, является ли определенная коллекция подмножеством или надмножеством другой коллекции, - это то, где Set
часто сияет.
Учитывая все вышесказанное, следует быть намного быстрее:
require 'set'
def text_queries(sentences, queries)
sentences = sentences.map { |sentence| Set.new(sentence.split(' ')) }
queries.map do |query|
query = Set.new(query.split(' '))
indexes = sentences.each_index.select { |index| sentences[index] >= query }
indexes << -1 if indexes.empty?
indexes
end
end
Примечание: Если вы решили вывести значения на консоль (как показано в вопросе):
puts indexes.join(' ')
Тогда Нет смысла использовать queries.map
, поскольку будет возвращен массив со значениями nil
(puts
всегда возвращает nil
). Измените map
на each
в этом сценарии.