2017-11-11 2 views
-1

연구 시설에서 방금 새 수퍼 컴퓨터를 받았습니다. 한 번에 여러 가지 작업을 수행 할 수 있지만, 각 작업이 결과를 내기까지 걸리는 시간을 알고있는 경우에만 가능합니다.프로그램의 시간 복잡성 작업을 예약하는 자바 스크립트

이 슈퍼 시간 단위의 시간을 측정하고, 다음과 같이 동작한다 :

처리해야되는 작업 큐에 배치된다. 대기열의 맨 위에있는 작업에는 정확하게 1 시간 단위의 CPU 시간이 주어집니다. 완료되지 않은 경우 대기열 뒤쪽에 배치됩니다. 대기열의 작업 재조정은 특수 처리 장치에서 관리하므로 추가 CPU 시간이 필요하지 않습니다. 작업을 처리 대기열에 제출했으며 결과 준비가 완료 될 때까지 기다려야하는 시간을 확인하려고합니다.

taskQueue가 양의 정수 배열로 주어지면 taskQueue [i]는 결과를 제공하기 위해 대기열의 i 번째 작업에 남은 CPU 시간의 시간 단위 수를 나타내며 양의 정수 n은 사용자의 현재 색인으로 나타냅니다. taskQueue (0 기반)에서 작업을 완료 할 때까지 기다려야하는 시간 단위 수를 찾으십시오. 우리는 1 개 시간 단위로 큐 상태를 통과하면 작업 대기열은 = 3, 1, 2 및 N = 2 출력 태스킹 (작업 대기열, N) = 5 이어야 예

[3,1,2 '] -> [2', 2] -> [2,1 '] -> [1', 1] -> [1] 작업에 '으로 표시되어 있습니다. 작업 대기열은 = [1, 2, 3, 1, 2 및 N = 0, 출력 태스킹 (작업 대기열, N) = 1 입력/출력되어야 용

[기한] 4000ms (JS) [input] array.integer taskQueue

i 번째 정수는 결과를 제공하기 위해 대기열의 i 번째 작업에 남겨진 CPU 시간의 시간 단위 수를 나타냅니다.

보장 제약 : 1 ≤ taskQueue.length ≤ 105 1 ≤ 작업 대기열 [I] ≤ 109

는 는 는

[입력] 정수 N

작업 대기열에서 태스크의 인덱스 (0 계).

보장 된 제약 조건 : 0 ≤ n < taskQueue.length.

[출력]

당신이 당신의 작업이 완료 될 때까지 기다릴 필요가 시간 단위의 수

를 integer64.

function multitasking(taskQueue, n) { 
let queue = new Queue(taskQueue,n); 
while(queue.data.length) { 
    queue.runTask(); 
} 
return queue.count; 

}

function Queue(data,n) { 
this.data = [...data]; 
this.taskIndex = n; 
this.count = 0; 

this.requeue = function() { 
    let firstvalue = this.data[0];   
    if(this.taskIndex) { 
     this.taskIndex--; 
    } else if(!firstvalue) { 
     this.data = [];  
     return;        
    } else { 
     this.taskIndex = this.data.length-1; 
    } 
    if(firstvalue) { 
     this.data.push(firstvalue); 
    } 
    this.data.shift(); 
} 

this.runTask = function() { 
    this.data[0]--; 
    this.count++; 
    this.requeue(); 
}} 

이 대부분의 경우 잘 작동 :

내가 작성한 코드입니다. 그러나 시간 복잡성은 높습니다. 에 대한. 예.

멀티 태스킹 ([10000000001000000000], 1) 이것은 4000ms 미만으로는 해결되지 않습니다. 누구나 시간 복잡성을 줄일 수 있습니까?

답변

1

분석 대신 시뮬레이션을 실행하는 것처럼 보입니다. 이는 증분 연산자를 사용하여 queue.count을 하나씩 조정하는 것을 기반으로합니다. 남은 시간을 계산하는 데 걸리는 시간은 작업을 완료하는 데 걸리는 시간에 따라 증가합니다.

  1. 머리에서 n 번째 제로를 기반으로 작업을 넣어 작업 큐를 정상화 : 각 단계를 거치지 않고 남은 시간을 분석에

    내 첫번째 생각은 (안된, 코딩되지 않은) 다음과 같이했다. 이것은 (n) 시간 단위를 취하므로 총 시간을 (n)으로 설정하십시오. 정규화 된 대기열 끝에 1이 남은 작업 이전의 작업을 추가하지 마십시오.

  2. 작업에 필요한 것보다 적은 작업을 수행하는 데 필요한 최소 시간을 찾습니다.

  3. 2 단계에서 작업을 찾았 으면 총 시간에 작업 큐 길이를 곱한 시간을 더하고 큐의 모든 시간에서 작업 시간을 뺍니다. 대기열에서 발견 된 태스크를 제거하십시오.

  4. 언제든지 작업의 남은 시간이 하나 인 경우 합계에 하나를 더하고 반환하십시오.

  5. 작업이 2 단계에서 발견 된 경우, 귀하의 작업이 전체에 완료하고 결과를 반환하는 데 남은 시간 추가 2 단계

  6. 에서 반복합니다.


업데이트 :

두 번째 생각은 여전히 ​​큐를 '정상화'하는 것 - 어떤 것 n가 대기열에서 작업의 위치입니다 n 후 시간 단위, 같은 큐 모양 (0 일 수 있습니다)?

이제 라운드 로빈 방식으로 대기열에서 다른 작업을 실행하는 순서가 작업 완료 시간 계산에 영향을 줍니까? 그렇지 않다면 대기열의 나머지 부분을 대기열의 맨 위에 놓고 내림차순으로 정렬 할 수 있습니다.

순서가 중요하지 않은 경우 배열 끝에 서 정렬 된 대기열 항목을 처리하고 둘 이상의 누적 기 (예 : 총 소요 시간 및 대기열 반복 수 필요)를 유지하여 작업을 수행하여 큐의 배열 구조를 조작하거나 배열의 항목 값을 조작하지 않고 완료 할 수 있습니다.

더 자세한 세부 사항은 여전히 ​​처리해야하지만 이러한 종류의 분석을 수행하는 데 걸리는 시간은 각 작업의 남은 시간이 아닌 초기 대기열의 길이에 따라 달라집니다.