2017-05-11 6 views
1

プログラムの要件は、n/2回にわたって発生する数値を配列に出力することです。解のアルゴリズムの実行時間がn log(n)であることを確認します。特定の数値が配列の半分以上を占めるかどうかを調べるためのn log(n)ランタイムを持つ解とは何か

[2、1、3、2] = Noの結果 [1、5 2、5、5] = 5

私の現在のソリューションない:これに関しては

int answer = -1; 
    int[] a = {2, 4, 2, 5, 1}; 
    int[] occurances = {0, 0, 0, 0, 0, 0}; 

    for(int i = 0; i < a.length; i++){ 
     occurances[a[i]]++; 
    } 

    for(int i = 0; i < occurances.length; i++){ 
     if(occurances[i] > ((double)a.length)/2){ 
      answer = i; 
     } 
    } 

    System.out.println(answer); 

、私のソリューションの実行時間は何ですか?私はそれが一度だけ配列を通過するので、それがn log(n)だとは思わない。

n log(n)でない場合、n log(n)を持つ解は何ですか? もしそうなら、それはなぜn長(n)ですか?

+0

int [] a = {-2、-2、-2、-3};は何を返すべきですか? –

+2

(* O(N)*)をソートしてスキャンします(* O(N)*)。 Still * O(N log(N))*。 「ダブル」へのキャストは無意味です。理論的には – EJP

+0

-2である。すべての例が正の数しか与えなかったので、正の整数であると仮定して、基本的な問題を解決するのに十分なだけ与えました。 – Xenorosth

答えて

2

解は配列の最大値に依存するので、疑似多項式、つまりO(n + MAX)です。MAXは配列の中で最も高い値です。

  • ソート配列
  • 値は、複数のアレイの半分以上を占めている場合、それは次のとおりです。より多くのあなたがこのアルゴリズムに従うことができ、アレイの半分以上を占めている価値があるかどうかを確認するために

    ソートされた配列の中央のセルを占有しようとします(Pigeonhole principle参照)。下のステップで使用する

  • 中間要素を含む範囲の下位インデックスと上位インデックスを検索する
  • 中間要素の上位インデックスと下位インデックスの差を比較する配列の長さの半分まで
  • インデックスの差が長さの半分を超える場合、中央の要素は半分以上の時間に含まれます。それ以外の場合、答えは「いいえ」です。

別の方法としては、ハッシュテーブルでカウントを使用することです:

  • 要素に要素をマップするハッシュテーブルを構築Oでカウント(N)
  • ハッシュテーブルを歩き、そして取ります
+0

これは私がランタイムだと思ったことを確認しました。私はそれを最終的に学生の束に説明しようとしていますが、私はソートしていないと確信していました。そして、それを再び通過するとO(n log n)になります。私はそれがまだO(n log n + n)であると思ったが、それでもn log nだけである。 – Xenorosth

+0

@ Xenorosth O(n)償却時間で行うことができます(ツリーセットのステップは不要です)。 O(n + n * long n)は、O(n log n)と同じO(n * log n + 1)と同じです。 – dasblinkenlight

+1

Heckでは、ソートされたデータのシーケンシャルスキャンを実行して各値のカウントを検索し、カウントがハーフアレイサイズに達した場合に停止することもできます。それは依然として_O(n log n)_です。しかし私はバイナリ検索が好きです。 ---しかし、あなたが指摘したように、 'HashMap'の解決法は、それが_O(n)_であるため、さらに優れています。おそらくそれをもう少し強調する必要があります。 – Andreas

関連する問題