균일 이진 검색
Uniform binary search균일한 바이너리 검색은 도널드 크누스가 발명한 고전적인 바이너리 검색 알고리즘의 최적화로서 크누스의 <컴퓨터 프로그래밍의 기술>에 수록되어 있다.각 반복에서 상한과 하한의 중간점을 차지하지 않고 룩업 테이블을 사용하여 단일 배열 인덱스를 업데이트하므로, Knuth의 MIX와 같은 아키텍처에 최적화되어 있다.
- 테이블 검색은 일반적으로 추가 및 이동보다 빠르며,
- 동일한 배열 또는 동일한 길이의 여러 배열에서 많은 검색이 수행됨
C 구현
균일한 이진 검색 알고리즘은 C에서 구현했을 때 다음과 같이 보인다.
#Define LOG_N 4 정태의 인트로 삼각주를 달다[LOG_N]; 공허하게 하다 make_make(인트로 N) { 인트로 힘 = 1; 인트로 i = 0; 하다 { 인트로 절반 = 힘; 힘 <<= 1; 삼각주를 달다[i] = (N + 절반) / 힘; } 하는 동안에 (삼각주를 달다[i++] != 0); } 인트로 숨김을 풀다(인트로 *a, 인트로 핵심을) { 인트로 i = 삼각주를 달다[0] - 1; /* 어레이의 중간 지점 */ 인트로 d = 0; 하는 동안에 (1) { 만일 (핵심을 == a[i]) { 돌아오다 i; } 다른 만일 (삼각주를 달다[d] == 0) { 돌아오다 -1; } 다른 { 만일 (핵심을 < a[i]) { i -= 삼각주를 달다[++d]; } 다른 { i += 삼각주를 달다[++d]; } } } } /* 사용 예: */ #N 10호 정의 인트로 본래의(공허하게 하다) { 인트로 a[N] = {1, 3, 5, 6, 7, 9, 14, 15, 17, 19}; make_make(N); 을 위해 (인트로 i = 0; i < 20; ++i) 활자화하다(%d이(가) %d 인덱스에 있음\n", i, 숨김을 풀다(a, i)); 돌아오다 0; }
참조
외부 링크
- 한 드 브뤼옌에 의한 파스칼에서의 크누스의 알고리즘 구현
- Adrianus Warmenhoven에 의한 Go에서 Knuth 알고리즘의 구현