#arrays #ruby
#массивы #ruby
Вопрос:
Учитывая:
a = ["thing1", "thing2", "thing3", "thing4", "thing5", "thing6"]
b = ["thing3", "thing4", "thing5"]
Я ищу наиболее эффективный способ получить это:
result #=> [0, 0, 1, 1, 1, 0]
Должен быть способ лучше, чем O (n ^ 2).
a.map{|v| b.include?(v) ? 1 : 0}
Комментарии:
1. Ключевым моментом здесь является индексирование b (преобразование его в хэш, чтобы вы получили O (1) запросов) перед циклом над A. Это занимает O (N) времени
Ответ №1:
c = b.to_h{|e| [e, true]}
a.map{|e| c[e] ? 1 : 0}
Комментарии:
1. или с активной поддержкой,
c = b.index_by(amp;:itself)
2. Я заметил, что вы всегда любите использовать новые методы или новые возможности существующих методов, что хорошо, поскольку это имеет образовательную ценность. Здесь Array#to_h было разрешено иметь необязательный блок в Ruby версии 2.6.
3. Привет, сава, я просмотрел твой профиль, где ты сказал, что скоро собираешься выпустить gem, связанный с веб-сервером. Могу ли я, когда это будет?
4. @Rajagopalan То, что у меня есть под связанной страницей, я предоставил allI now, и этот профиль старый и не обновлялся. Извините.
5. @sawa Могу я узнать, где находится ссылка на работу вашего веб-сервиса?
Ответ №2:
require 'set'
bs = b.to_set
#=> #<Set: {"thing3", "thing4", "thing5"}>
a.map { |s| bs.include?(s) ? 1 : 0 }
#=> [0, 0, 1, 1, 1, 0]
Наборы реализованы с хэшем под обложкой, поэтому поиск по наборам аналогичен поиску по хэшу с точки зрения скорости выполнения.