如何找出Array1中Array1中元素的出现次数

时间:2012-03-25 18:49:53

标签: ruby algorithm

在Ruby中实现这一目标的最佳方法是什么? Array1包含少量数字Array2包含未分类的数字。我们想知道Array1Array2的每个元素出现的频率。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
  • 的每个元素
  • 迭代{{1}}
  • 每次元素匹配时递增计数器

示例只显示了一些数字,但我想找到一个非常大的数组的最佳方法。

3 个答案:

答案 0 :(得分:1)

您可以使用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}

答案 1 :(得分:0)

如果数组中的数字不是很大,那么你可以创建一个数组,其大小是任何数组的最大元素。然后迭代数组一次并将位置增加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)

答案 2 :(得分:0)

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}