1

Javascript コードで「FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory」というエラーが表示されます。このコードを実行するにはどうすればよいですか? Python とまったく同じことを行っていて、Python でも動作するため、コードに欠陥は見られませんが、Javascript ではメモリ エラーが発生します。以下は私のコードです。

   var sample_arr = [-1, 5, 7, 4, 0, 1, -5]
   function My_Partition(container, first_index, last_index) {
       var x = container[last_index];
       var i = first_index - 1;

       for (var elem = 0; elem < container.length-1; elem++) {
               if (container[elem] <= x) {
               i += 1;
               var temp_1 = container[i];
               container[i] = container[elem];
               container[elem] = temp_1;
           }
       }
       var temp_2 = container[i+1];
       container[i+1] = container[last_index];
       container[last_index] = temp_2;

       return i+1;
   }


   function My_Quick_Sort(container, first_index, last_index) {
       if (first_index < last_index) {
           var mid = My_Partition(container, first_index, last_index);
           My_Quick_Sort(container, first_index, mid-1);
           My_Quick_Sort(container, mid+1, last_index);
       }
   }
   My_Quick_Sort(sample_arr, 0, sample_arr.length-1);
   console.log("Sorted Array:", sample_arr);

基本的に、ソート アルゴリズムを実装しようとしています。ご協力をお願いします。

4

1 に答える 1

1

それはかなり壮観なクラッシュです。

では、これはある種の宿題/演習のように見えるので、質問に答えるのではなく、質問の背後にある質問に答えましょう: 「このような問題を解決するにはどうすればよいですか?」通常、最善の方法は、理論を考え出し、それをテストする方法を見つけることです。

理論 1: スタック オーバーフロー

通常、メモリが不足している場合、1 つの明白な推測はスタック オーバーフローです。それを試してテストするために、関数が呼び出される回数に制限を設定できるかどうかを確認し、それをJSFiddleで実行します。

   var sample_arr = [-1, 5, 7, 4, 0, 1, -5];
   var stop_running = 0;
   function My_Partition(container, first_index, last_index) {
       if (stop_running++ > 100) return;
       ...
   }


   function My_Quick_Sort(container, first_index, last_index) {
       if (stop_running++ > 100) return;
       ...
   }
   My_Quick_Sort(sample_arr, 0, sample_arr.length-1);
   console.log("Sorted Array:", sample_arr);

おっとっと!これはまだクラッシュします。2 つの関数を呼び出す回数を制限したため、スタック オーバーフローではないと思います。

理論 2: ループ

別の理論を試してみましょう。おそらく、何が起こっているかは無限ループです。代わりにループ呼び出しをログに記録しましょう(JSFiddle をクリックします)。

100 回以上の反復でループにスタックしていることに注意してください。これは、単純なソートには多すぎます。この時点で、console.log 呼び出しを追加して、ローカル変数を出力することをお勧めします。console.log(elem)、または console.log(container.length)、あるいはその両方を試してください。

于 2013-09-06T00:26:45.667 に答える