정확한 해결책을 묻지 않으므로 (원하는 경우 제공 할 수 있음) 나는 매우 간단하지만 잘 알려지지 않은 접근 방법에 대한 힌트를 제공 할 것입니다. 그런 문제.
결정적인 아이디어는 아마도 최악의 복잡성을이 함수에 함수를 수정하는 것입니다,하지만 예상 복잡성의이 수정 기능 findTarget2
부르 자, 쉽게 측정 할 수 있습니다 f(n)
하자, 이제
public static int findTarget2 (int[] a, int low, int high, int goal) {
if (low == high) return 0;
int len = high - low + 1; //length of the array range, i.e. input size
while (true) {
int target = selectTarget(a, low, high);
if (goal < target && target-low <= 3/4 * len)
return findTarget2(a, low, target-1, goal);
else if (goal > target && high-target <= 3/4 * len)
return findTarget2(a, target+1, high, goal);
else if (goal == target)
return a[target];
}
}
을 원래의 시간 복잡도이고 g(n)
은 findTarget2
함수의 시간 복잡도이며, n
은 입력 크기, 즉 high-low+1
과 같은 배열 범위의 길이입니다.
자, selectTarget
이 불량 실행으로 표시되는 경우 만 본인의 신체에 반품 전화가 발생하지 않는 경우에만 해당한다고 가정 해 봅시다.
잘못된 실행의 경우 findTarget2
은 기본적으로 동일한 입력에서 자체 호출을 수행하지만 원본 함수는 입력 크기를 1 이상 줄이므로 첫 번째 결과는 g(n) >= f(n)
입니다. 따라서 상한값 g(n)
의 경우 동일한 범위가 f(n)
에 적용됩니다. 다음
다음, g(n)
예상 시간 복잡도가 기록 될 수있다 :
예상 값을 사용하여 직선은 다음과 같이 쓸 수
EX[g(n)] <= EX[g(3/4 * n) + X * O(n)]
:
EX[g(n)] <= EX[g(3/4 * n)] + EX[X] * O(n)
X
랜덤 변수이고 return 호출이 발생할 때까지 while 루프 실행 횟수를 나타내며, 마지막으로 O(n)
은 findTarget2
함수에서 보낸 비 재귀 시간이며,입니다. 210, 왜냐하면 그 시간에 selectTarget
함수가 실행된다고 말하기 때문입니다.
지금 당신의 작업은 EX[X]
을 계산 한 다음도 f(n)
의 예상 시간 복잡도에 대한 상한이다 g(n)
의 최종 예상 시간 복잡도를 얻을 수 Master theorem를 사용할 수 있으므로의 복잡성의 상한이다 원래 함수.
감사합니다. 하나의 질문 : selectTarget() 정확히 무엇을합니까? 지정된 범위 사이의 임의의 값입니까? – Wazowski
@Wazowski 당신이 정의한 것은 다음과 같습니다 : "비 재귀 적 방법 인 selectTarget()은 선형 시간 복잡성을가집니다. 여기서 n은 high - low + 1이고 low ≤ target ≤ high 범위의 정수 목표를 반환합니다 selectTarget()의 출력 값은이 범위에서 균등하게 분포하므로, low = 0 및 high = n-1이면 모든 target = 0, 1, ..., n-1이 동일한 확률 1/n으로 발생합니다. " 똑같은 확률로 각 값을 반환하는 것이 중요합니다. – pkacprzak
나도 알아,하지만 난 그걸 반환하지 않는 범위 사이의 임의의 정수? – Wazowski