Учитывая два массива, каков наиболее эффективный способ их двоичного перекрытия?

#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] 
  

Наборы реализованы с хэшем под обложкой, поэтому поиск по наборам аналогичен поиску по хэшу с точки зрения скорости выполнения.