Как узнать, сколько раз элемент в Array1 присутствует в Array2 - PullRequest
1 голос
/ 25 марта 2012

Каков наилучший способ сделать это в Ruby? Array1 содержит несколько чисел Array2 содержит несортированные числа. Мы хотим выяснить, как часто каждый элемент Array1 отображается в Array2.

Пример:

Array1 = [0,1,2,3]

Array2 = [0,0,0,3,3,3,2,1,0,3,6,1,3]

Result = {"0"=>4, "1"=>2, "2"=>1, "3"=>5}

Есть ли лучший оптимальный способ сделать это, чем:

  • выбирая каждый элемент Array1
  • перебирает Array2
  • увеличивая счетчик каждый раз, когда элементы совпадают

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

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Вы можете использовать group_by для подсчета пунктов в array2:

irb(main):001:0> array1 = [0,1,2,3]
=> [0, 1, 2, 3]
irb(main):002:0> array2 = [0,0,0,3,3,3,2,1,0,3,6,1,3]
=> [0, 0, 0, 3, 3, 3, 2, 1, 0, 3, 6, 1, 3]
irb(main):003:0> h = Hash[array2.group_by { |x| x }.map { |k, v| [k, v.size] }]
=> {0=>4, 3=>5, 2=>1, 1=>2, 6=>1}

Если хотите, вы можете извлечь вспомогательный хеш с ключами из array1 (но я не думаю, что это действительно необходимо):

irb(main):004:0> h.select { |k,_| array1.include?(k) }
=> {0=>4, 3=>5, 2=>1, 1=>2}
0 голосов
/ 25 марта 2012
a = [0,1,2,3]
b = [0,0,0,3,3,3,2,1,0,3,6,1,3]

a.inject({}){|h,i| h[i] = b.count(i); h}
#=> {0=>4, 1=>2, 2=>1, 3=>5}

или

Hash[a.map{|i| [i,b.count(i)]}]
#=> {0=>4, 1=>2, 2=>1, 3=>5}
0 голосов
/ 25 марта 2012

Если числа в массиве не очень велики, вы можете создать массив с размером как наибольший элемент любого массива.Затем выполните итерацию массива один раз и увеличьте позицию на 1. т. Е.

Suppose the largest element in array 2 is 10
declare an array with length 10 i.e a[10] and initialize the array with 0
Now suppose you find 1 in array2 then increment a[1]
If you find 4 in array2 then increment a[4] and so on
Then again iterate over array1 once and match the corresponding element

Я не рассматривал язык как Ruby, но если у вас есть идея, то ее довольно легко реализовать на любом языке.Сложность: O (n)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...