2012-03-25 14 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 

を位置をインクリメント私は、Rubyなどの言語と考えられていないが、あなたのアイデアを持っている場合、任意の言語で実装するのは非常に簡単です。 複雑さ:ほとんどのあなたが得ることができるでの効率が存在しているソートアルゴリズムのオーダーであるので、O(n)の

+0

'group_by'は非常に似たコンセプトを使用していますが、配列ではなくハッシュテーブルに項目を格納します(ハッシュテーブルへの書き込みも' O(1) 'です)。 –

+0

は、他の多くの解釈プログラミング言語によく似ています。rubyは、配列を不変のサイズのインスタンスとして扱いませんが、古典的な配列とリストの間のマージのように扱います。 – 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は、2番目の配列を通る別々のパスを避けたいと考えました。 –

関連する問題