0

나는 주어진 배열의 모든 가능한 조합을 계산하기위한 다음과 같은 기능을 포함하는 프로그램이 있습니다 예를 들어효율적인 자바 스크립트 조합 기능

function combinations(arr, k) { 
var i, 
subI, 
sub, 
combinationsArray = [], 
next; 
for (i = 0; i < arr.length; i++) { 
    if (k === 1) { 
     combinationsArray.push([arr[i]]); 
    } else { 
     sub = combinations(arr.slice(i + 1, arr.length), k - 1); 
     for (subI = 0; subI < sub.length; subI++) { 
      next = sub[subI]; 
      next.unshift(arr[i]); 
      combinationsArray.push(next); 
     } 
    } 
} 
return combinationsArray; 
}; 

:

combinations([1,2,3],2); 

을 반환 :

나는 이것을 내 프로그램에서 특히 배열과 함께 많이 사용합니다. 매개 변수는 해당 배열에서 두 개의 가능한 모든 조합을 반환하는 12 개 개체의 매개 변수입니다. 66 가지 가능한 조합이 있습니다. 내 프로그램에서, 나는이 함수에 의해 반환 된 배열의 객체 요소의 속성 값을 많이 확인하고, 비교하고, 조건문을 실행해야한다. 그러나이 같은 조합 함수를 사용하는 함수를 호출하면 브라우저가 충돌한다. (firefox는 messege를 반환합니다 : "이 페이지의 스크립트가 사용 중이거나 응답을 멈췄을 수 있습니다. 이제 스크립트를 중단하거나 디버거에서 스크립트를 열거 나 스크립트를 계속 진행할 수 있습니다.") 항상 위의 조합 중 일부는 충돌로 인해 호출됩니다.

찾았 음 http://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/ 기능을 반복적으로 호출하는 코드의 효율성을 향상시키는 좋은 방법입니다 (예 : 조합 기능).

ncsonline의 메서드와 조합 함수를 효과적으로 통합하여 브라우저 충돌을 막을 수 있습니까?

+1

나는 setTimeout 메서드를 사용한다고 생각한다. 조합 함수 자체가 아니라 조합 함수를 호출하는 루프에 적용해야한다. 한 번 66 가지 조합을 만드는 것은 그만큼 집중해서는 안됩니다. 그러나 웹 작업자는이를 지원하는 모든 브라우저로 이동할 수있는 방법 일 수 있습니다. –

답변

2

코드를 별도의 스레드에서 실행하는 web workers을 사용하는 것이 좋습니다.

이렇게하면 집중적 인 계산으로 UI 스레드 (현재보고있는 UI 스레드)를 잠그지 않습니다.

0

배열을 만드는 이유는 무엇입니까? 모든 조합을 반복하고 루프 내부에서 작업을 수행 할 수 있습니까? 이렇게하면 로직 속도가 상당히 빨라지고 브라우저가 부과 한 한계에 부합하게됩니다.