2012-03-25 2 views
1

Ruby에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? Array1에는 숫자가 거의 없습니다. Array2에는 정렬되지 않은 숫자가 들어 있습니다. Array1의 각 요소가 표시되는 빈도는 Array2입니다.Array1의 요소가 Array2에있는 횟수를 찾는 방법

예 :

  • 카운터마다 요소를 증가 Array2
  • 반복 Array1
  • 의 각 요소를 따기 :
    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} 
    

    가보다 이렇게 더 좋은 최적의 방법이 있나요 일치

예제는 숫자가 적지 만 매우 큰 배열 집합에 대해이 작업을 수행하는 가장 좋은 방법을 찾고 싶습니다.

+0

그것은 가장 당신이 얻을 수있는가 존재하는 정렬 알고리즘의 순서에의 효율성 있도록 정렬 알고리즘과 유사처럼 날 것으로 보인다. Mergesort 원리를 사용하면 http://en.wikipedia.org/wiki/Sorting_algorithm이'nlogn'이 될 수 있습니다. – uday

+0

@uDaY : 실제로 'O (n)'에서 그렇게 할 수 있습니다. –

답변

1

당신은 array2의 항목을 계산하는 group_by를 사용할 수 있습니다

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에서 키를 사용하여 하위 해시를 추출 할 수 있습니다 (하지만이 정말 필요하다 생각하지 않는다) :

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 

하여 위치를 증가. 복잡성 : O (n)은

+0

'group_by'는 매우 유사한 개념을 사용합니다. 단지 배열이 아닌 해시 테이블에 항목을 저장합니다 (해쉬 테이블에 쓰는 것도'O (1)'입니다). –

+0

다른 많은 해석 된 프로그래밍 언어와 비슷하다. 루비는 배열을 불변 크기를 가진 인스턴스로 취급하지 않지만 고전적인 배열과리스트 사이의 병합과 비슷하다. – robustus

+0

@robustus : 여기에도 항목을 초기화해야하기 때문에 "길이 10의 배열 선언"은 'a = [0] * 10'과 같이 해석 할 수 있습니다. 이는 합리적인 것으로 보이고 고전적인 벡터 데이터를 생성합니다 구조체에 'O (1)'액세스 권한이 있습니다. –

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} 
+0

OP는 두 번째 배열을 통과하는 별도의 통과를 피하려고했습니다. –

관련 문제