1

我的 Javascript 代码出现“致命错误:CALL_AND_RETRY_0 分配失败 - 进程内存不足”的错误。我怎么能运行这段代码?我在代码中看不到任何缺陷,因为我所做的事情与在 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

这是一个相当壮观的崩溃。

因此,由于这看起来像是某种家庭作业/练习,而不是回答问题,让我们回答问题背后的问题:“我如何弄清楚如何解决这样的问题?” 最好的方法通常是提出一个理论,然后找到测试它的方法。

理论一:堆栈溢出

通常,如果内存不足,一个明显的猜测是堆栈溢出。为了尝试测试它,让我们看看我们是否可以对函数被调用的次数设置一个限制,并在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:循环

让我们尝试另一种理论。也许正在发生的是一个无限循环。让我们记录循环调用(单击 JSFiddle)

请注意,它在循环中停留了 100 多次迭代。这对于简单的排序来说太多了。此时,您可能想要添加一个 console.log 调用并打印出局部变量。试试 console.log(elem) 或 console.log(container.length),或者两者兼而有之。

于 2013-09-06T00:26:45.667 回答