2016-10-14 1 views
-1

스택 크기 오류를 극복하기 위해 코드를 다시 작성하려고합니다. "RangeError : 최대 호출 스택 크기를 초과했습니다." 노드를 사용하여 JavaScript에서 스택을 사용하여 DFS를 실행하려고합니다.노드를 사용하여 깊이 우선 검색을 수행하면 RangeError : 최대 호출 스택 크기가 초과되었습니다.

settimeout에 대해 많이 들었지만 내 경우에는이를 구현하는 방법을 모르겠습니다. 어떤 충고라도 잘 될 것입니다.

var Stack = function() { 
    this.items = []; 
}; 
Stack.prototype.push = function(obj) { 
    this.items.push(obj); 
}; 
Stack.prototype.pop = function() { 
    return this.items.pop(); 
}; 
Stack.prototype.isEmpty = function() { 
    return this.items.length === 0; 
}; 
Stack.prototype.isExplored = function(n){ 
    return this.items.indexOf(n) !== -1; 
} 
Stack.prototype.emptyOut = function() { 
    this.items = []; 
    return this.items.length === 0; 

}; 

var stack = new Stack(); 
var adjList=[]; 
for(var i= 1; i<15557;i++){ 
    adjList.push([i]) 
} 
adjList.push([0]) 

function DFS(graph, s){ 
    stack.push(s); 
    for(var i = 0 ; i < graph[s].length; i++){ 
     var v = graph[s][i]; 
     if(!stack.isExplored(v)){   
      DFS(graph, v); 
     }      
    } 
} 
DFS(adjList, 0) 
console.log("done", stack); 
+0

나는 무엇을해야할지 모른다. 그러나 DFS를 재귀 적으로 15557 번 호출한다. 이것은 스택이 처리하기에는 너무 많은 양이다. – ASDFGerte

+0

내 데이터 집합에 노드가 15557 개 이상있는 경우에는 동의합니다. setTimeout이 문제를 해결할 수 있는지 또는 다른 해결책을 알고 있는지 궁금합니다. –

답변

0

당신이 반복적 인 접근 방식으로 전환 고려 유무 : 실패

을 Heres 코드?

var Stack = function() { 
 
    this.items = []; 
 
}; 
 
Stack.prototype.push = function(obj) { 
 
    this.items.push(obj); 
 
}; 
 
Stack.prototype.pop = function() { 
 
    return this.items.pop(); 
 
}; 
 
Stack.prototype.isEmpty = function() { 
 
    return this.items.length === 0; 
 
}; 
 
Stack.prototype.isExplored = function(n) { 
 
    return this.items.indexOf(n) !== -1; 
 
} 
 
Stack.prototype.emptyOut = function() { 
 
    this.items = []; 
 
    return this.items.length === 0; 
 
}; 
 

 
var stack = new Stack(); 
 
var adjList = []; 
 
for (var i = 1; i < 15557; i++) { 
 
    adjList.push([i]); 
 
} 
 
adjList.push([0]) 
 

 
function DFS(graph, v) { 
 
    var queue = [v]; 
 
    while (queue.length) { 
 
    v = queue.pop(); 
 
    if (stack.isExplored(v)) 
 
     continue; 
 
    stack.push(v); 
 
    for (var i = graph[v].length - 1; i >= 0; i--) { 
 
     queue.push(graph[v][i]); 
 
    } 
 
    } 
 
} 
 
DFS(adjList, 0); 
 
console.log("done", stack);

한계는 현재 노드의 처리에 보유 된 메모리의 양이다.