Javascript排序。分配失败进程内存不足错误

时间:2013-09-06 00:00:46

标签: javascript memory-management out-of-memory quicksort

我的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);

基本上我正在尝试实现排序算法, 我非常感谢你的帮助。

1 个答案:

答案 0 :(得分: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:循环

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

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