Вы можете ускорить вычисления следующим образом:
require 'set'
h = sentences.each_with_index.with_object({}) do |(str,i),h|
h[i] = str.split.to_set
end
#=> {0=>#<Set: {"jim", "likes", "mary"}>,
# 1=>#<Set: {"kate", "likes", "tom"}>,
# 2=>#<Set: {"tom", "does", "not", "like", "jim"}>}
keys = h.keys
#=> [0, 1, 2]
phrases.map do |p|
pa = p.split
keys.select { |j| pa.all? { |s| h[j].include?(s) } }
end
#=> [[2], [0, 1]]
Возвращаемое значение - не совсем возвращаемое значение, требуемое вопросом: [2, [0,1]]
. Тем не менее, я предлагаю создать все элементы этого массива, даже если они содержат только один элемент (например, [2]
). Это облегчит жизнь программисту в будущем. Однако, если требуется [2, [0,1]]
, в конце выполните простую настройку:
phrases.map do |p|
pa = p.split
keys.select { |j| pa.all? { |s| h[j].include?(s) } }
end.map { |e| e.size == 1 ? e.first : e }
#=> [2, [0, 1]]
Поскольку вычислительная сложность поиска по множеству близка к O (1) (постоянная), вычислительная сложность этого подхода близко к O (n 2 ), где n
- некоторая мера для размеров sentences
и phrases
.