실험보고 요구 사항 분석을 위해 하나 개의 주제를 선택합니다. 내용은 다음과 같습니다
- 연습 주제
- 문제 설명
- 알고리즘 설명
- 시간과 공간의 복잡성 알고리즘 분석 (분석 과정이)
- 감정과 경험 (수확 및 의심의 연습이 요약)
세 가지 질문의 총의 연습, 나는 첫 번째 질문을 분석하기로 결정했습니다.
1. 연습 질문 질문 :
입력 형식 :
입력 공통 산신 : 첫 번째 라인은 n의 값이며, n은 정수 두 번째 행이며, 세 번째 행은 X 값이다.
출력 형식 :
여기서 첨자 X 출력 (0 ~ N-1) 및 비교의 수. x가 존재하지 않는 경우, 출력 1과 비교의 수.
문제의 설명 :
그것은 이분법을 지정된 방법을 사용하여 찾으려는 데이터를 찾을 수 및 출력 인덱스의 수를 비교하는 비 내림차순으로 목록에 단순히
이진 기본 개념은 X는 = A [N / 2] X가 발견 알고리즘이 중단되는 경우 [N / 2] ×을 비교하기 위해, 두 개의 거의 동일한 부분으로 분할되어 N 개의 엘리먼트를 찾는 것이다. 만약 X <a [n / 2],만큼 상기 어레이의 좌측 절반 x, 대한 검색을 계속하는 경우 x> A [N / 2] x의 오른쪽 절반만큼 상기 어레이의 검색. 이러한 검색은 계속하고있다
3. 알고리즘 설명
3.1 간격 카운터의 초기 값을 찾아, 왼쪽, 오른쪽, N-1, 0,
좌우 때 3.2 이하, 연산의 다음 사이클을 실행
- 중간 값은, 좌우의 중간 값이다;
- 사이클 카운터 + 1의 수를 기록.
- 기록 중간 키 (X)의 설정 위치는, 탐색이 성공적 동일하면 중립 위치로 복귀 중간, 비교;
- 동일하지 않은 경우, 이전에 중간 위치에 의해 기록 시트는 두 개의 서브 - 테이블. 키 (X)의 기록의 중간 위치보다 작은 경우, 그렇지 않으면 바로 중간 + 1 촬영 좌측 중 1로한다.
3.3주기는 지침 간격이 다음 조회 실패, 비어 0을 반환 찾으려면 끝납니다.
코드 설명 :
INT Binsearch ( INT 배열 [], INT의 N, INT의 X) { INT 왼쪽 = 0 ; int로 오른쪽 = N - 1 ; INT의 카운터 = 0 ; 반면 (좌회전 <= 우측) { INT 중간 = (좌측 + 우측) / 2 ; 카운터 ++ ; 경우 (X == 배열 [중간]) { COUT << 중간 << ENDL; COUT << 카운터; 반환 중간; } 경우 (x> 배열 [중간]) { 좌측 = 중간 + 1 ; } 다른 권리 = 중간 - 1 ; } COUT << " -1 " << ENDL; COUT << 카운터; 반환 - 1 ; }
4. 시간 및 공간 분석 알고리즘의 복잡성
시간 복잡도 : N 원소의 합계가 일단 각 섹션은 N의 크기이며, N / 2, N / 4 ..., N / 2 ^ (K) (다음으로, 소자의 나머지 수의 동작), k는주기이고, 수. > = 1 찰나 N / 2 ^ K 때문에, 심지어 만약 N / 2 ^ (K) = 1을 얻을 수있다 K = log2n, 그 시간 복잡도 O를 나타낼 수있다 ((N 대수 용 기체 (2) 기준)) = O (logn)
공간 복잡도 : 모든 작업을 완료 할 수 배열 때문에되도록 O의 공간 복잡도 (1)
5. 감정과 경험 (수확 및 의심의 연습 요약)
수확은 내가 바이너리 서치 알고리즘에 더 익숙하다
일부 코드에 관심을 지불 할 필요가 작은 세부 사항이 있습니다 :
- 함수, 함수의 값을 반환 할 수 없습니다
- 같은주의해야한다 변수 레코드의 수와 같은 일부 변수의 이름을 찾아 최고의 카운터는 플래그 부울 클래스를 계산