2017-06-07 4 views
-2

問題ステートメント:考える二つの配列Bは( B、)機能COMPを書き込む(Clojureの中compSame( B ))は、2つの配列が「同一のを持っているかどうかをチェック同じ要素が複数存在します。 「同じ」とは、ここでは、の要素が、順序にかかわらずの要素であることを意味します。非効率なJavaScriptアルゴリズム、次のコードをより効率的にするにはどうすればよいですか?

マイソリューション:私はまだそう常に改善するために探しているだけでwookieだとして

function comp(array1, array2){ 

    var test; 

    if(array1.length <= 0 || array2.length <= 0 || array1 == null || array2 == null || array2.length != array1.length || array1==undefined || array2==undefined){ 
    return false; 
    }else{ 
    for(i=0; i<array2.length; i++){ 
     for(j=0; j<array1.length; j++){ 
     if(array2[i] === Math.pow(array1[j],2)){ 
      test = true; 
      break; 
     }else{ 
      test = false; 
     } 
     } 
     if(test==false) 
     return false; 
    } 

    if(test === true) 
     return true; 
    else 
     return false; 
    } 
} 

はまた、コードについての建設的な批判が理解されます。

試験例:最終的な結果については

var a1 = [80, 2, 65, 68]; 
var a2 = [6401, 4, 4225, 4624]; 

同様に真の場合は真が偽のために返されるために、私が望むすべてがあります。プログラムはすべてのテストケースを解決しますが、タイムアウトします。すなわち

+0

負の配列長? –

+0

すばらしいことは、 'array1 == null'をチェックする前に' array1.length'をチェックしていることです。後者が本当であれば前者を実行するとエラーが発生します。 –

+0

テスト用の配列と必要な結果を追加してください。 –

答えて

1

は私のコードは、私がマイナーな最適化として最初にすべての正方形を計算していないよ、とJavaScriptのように数字をソートするので、私は「カスタム」intSorterを使用

function comp(arr1, arr2) 
{ 
    // make sure the arrays are set and are of equal length (if not they obivously don't match) 
    if(arr1 == null || arr2 == null || arr1.length != arr2.length) 
     return false; 
    // sort arrays 
    var intSorter = function(a,b){return a-b;}; 
    arr1.sort(intSorter); 
    arr2.sort(intSorter); 
    for(var i=0;i<arr1.length;i++) 
    { 
     var v = arr1[i]; 
     // if square of value in arr1 does not equal the value in arr2, arrays don't match 
     if(v*v!=arr2[i]) 
      return false; 
    } 
    return true; 
} 
// test it! 
console.info(comp([2,6,3,8,4,5], [25,64,16,36,4,9])); 
console.info(comp([2,6,3,8,4,5], [25,64,17,36,4,9])); 
console.info(comp([2,6,3,8,4,5], [25,64,16,36,4,9,9])); 

プリント、真偽、偽

です文字列なので、4は36の後に終了します( '3'は '4'の前にあります)

test変数は必要ありません。関数結果を知っているときはいつもreturnを使用し、使用しないでくださいpow()はループを使用しているので小さい値にしていますが、私が行ったようにv*vよりも高価かもしれません。

+0

これがうまくいって余分な入力をいただきありがとうございます。 'sort()'はデフォルトで文字列としてソートされるので、compareFunctionを使用しなければならないことにも気づいていませんでした。 – Kyleds63

1

  1. スクエア最初の配列
  2. ソート最初の配列
  3. ソート二番目の配列。
  4. 他の配列の対応する要素と一致しない要素があれば、一致する要素はありません。
  5. それ以外の場合は、コードでは

にマッチ:

function comp(array1, array2){ 

    var test; 

    if(!array1 || !array2){ 
     return false; 
    } 

    if (array1.length != array2.length){ 
     return false; 
    } 

    // first squre the array 
    array1_squared = array1.map(function(val){ return Math.pow(val, 2); }); 

    // then sort both arrays 
    array1_squared.sort() 
    array2.sort() 

    // then compare 
    for (var i=0 ; i < array1_squared.length ; i+= 1){ 
     if (array1_squared[i] != array2[i]) { 
      return false; 
     } 
    } 

    return true; 
} 

詳細を、ので:

概念的に、私はこれが続くが簡単だと思います。 1つの違いは、私はループ外で四角いことをすることです。あなたはあなたのループの内側に四角形を描いています。これは長さの代わりに長さを2倍にしていることを意味します。これは、CPUサイクルの無駄になります。また、あなたの配列をループしている間にあなたの配列をループすることになります。これは長さ** 2のループ実行を与えます。これと比較すると、ソートはかなり速く、1回のループで実際の答えを得ることができます。ここで

+0

'array1_squared'を作成しましたが、それを使ったことはありません:) – DonovanM

+0

' array1.sort()をarray1_squared.sort()に変更しました。 – Kyleds63

+0

それをキャッチするためにありがとう! @ Dragorn421も重要な情報をキャッチしました。sortは数字ではなく文字列で動作します。それは問題かもしれません。彼のコードを試して、そうするかどうかを見てください:彼は本質的に同じアルゴリズムを本質的に使います。 –

関連する問題