를 사용하여 배열에서 요소의 발생 횟수를 계산 다음과 같은 메시지내가 주어 졌어 재귀
이
A
을 나누어v
배열A
발생 횟수를 카운트 재귀 함수 만들기 매번 두 개의 서브 어레이로 나뉜다.
BinarySearch
을 사용하는 것보다 더 좋은 방법은 무엇입니까? 나는 다음과 같은 기능을 만들어 :이 작동
int count(int *A, int low, int high, int v) { if(low > high) return 0; int total = 0, mid = (low + high)/2; if(A[mid] == v) total++; return count(A, low, mid - 1, v) + total + count(A, mid + 1, high, v); }
를, 그래서이 부분에 대한 검증이 필요하지 않습니다.
배열 A
이 정렬되어 있는지 여부는 알 수 없으므로 배열 A
의 왼쪽 절반과 오른쪽 절반을 모두 검색해야합니다. 하지만 필자가 작성한 함수의 시간 복잡성을 찾아야합니다. 다음은 내가 생각한 것입니다 :
모든 변수 지정은 O(1)
이므로 고려해야 할 부분은 count(A, low, mid - 1, v) + total + count(A, mid + 1, high, v)
입니다.
T(n) = T(n/2) + O(1) + T(n/2) = 2T(n/2) + O(1)
,
우리가 우리를 제공하기 위해 마스터 정리를 사용할 수 있습니다 우리가 2
의 하위 문제의 크기 2
부분으로 배열을 분할하고 있기 때문에, 나는 다음과 같은 재발 관계를 만들었습니다 T(n) = O(n)
. 내 질문 : 변수 할당은 O(1)
으로 일정하고 count
함수의 각 부분은 T(n/2)
이 유효하다고 가정하고 있습니까?
배열의 모든 n
요소를 확인해야하기 때문에 전체 시간 복잡도는 O(n)
입니다.
당신은 O (n)보다 잘 할 수 없습니다. 이진 검색은 재귀에 대한 이해를 테스트하기를 원하기 때문에 더 효율적이기 때문에가 아닙니다. – immibis