2013-09-06 2 views
1

Javascript 코드에서 "치명적인 오류 : CALL_AND_RETRY_0 할당 실패 - 메모리 부족 프로세스"오류가 발생합니다. 어떻게하면이 코드를 실행할 수 있습니까? 파이썬에서와 똑같은 일을하고 파이썬에서 작동하기 때문에 코드에 결함이 없습니다.하지만 자바 스크립트에서는 메모리 오류가 발생합니다. 아래는 제 코드입니다. 자바 스크립트 정렬. 할당 오류 프로세스 메모리 부족 오류

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

기본적으로 내가 정렬 알고리즘, 내가 크게 도움을 주셔서 감사합니다 것 을 구현하기 위해 노력하고 있습니다.

+0

이 종류로 달성하려는 것은 무엇입니까? – PHPglue

+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) 또는 두 가지 모두를 사용해보십시오.

+0

오, 정말 고마워요. 나는 Javascript에 대해 아주 처음이며, 이런 종류의 오류는 본 적이 없다. 그래서 자바 스크립트는이 정렬을 처리 할 수 ​​없습니까? 같은 코드가 다른 많은 언어에서도 작동하기 때문에 Javascript 방식으로이 문제를 해결할 수 있을지 궁금합니다. 내가 뭘 놓치고 있니? 도와 드릴까요? 이것은 숙제가 아닙니다. 나는 단지 스스로 공부하고있다. 고마워요! –

+1

파이썬에서는 len()을 사용하고 있습니까? 파이썬에서 print() len()을 실행하고 자바 스크립트에서 console.log() container.length를 시도해보십시오. 너는 똑같은 번호를 알아야한다, 그렇지? 너? – Chris

+1

Console.log은 (는) 친구입니다. 이 버전을 살펴보고 콘솔을 살펴보십시오. http://jsfiddle.net/ry2XE/3/ – Chris