문제

정렬 된 정수와 대상 정수의 배열을 감안하여 목표 정수의 발생 수를 찾습니다.

바이너리 검색에는 시간 복잡성 $ o (\ lg n) $ 여기서 $ n$ 은 배열의 크기입니다. 예를 들어 배열 $ [1,2,3,3,4,5] $ 및 대상 $ 3,$ 알고리즘은 $ 2 $ 을 반환해야합니다..

질문 : $ o (\ lg n)? $ 이 달리 $ \ omega (\ lg n) $ 은 이론적 인 하한이었습니다.

도움이 되었습니까?

해결책

문제는 $ \ omega (\ log n) $ 대상 정수가 가장 한 번 나타나는 것으로 판명 되더라도 메모리에 액세스합니다. 적 지방을 사용하여 그것을 증명할 수 있습니다.

목표가 0이고 말합니다. 배열에 대한 첫 번째 액세스가 중심의 왼쪽에있는 경우 $ 1 $ 에 응답하고 왼쪽으로 요소를 $-2, -3, \ ldots $ . 첫 번째 액세스가 중심의 오른쪽에있는 경우 $ + 1 $ 에 답변하고, $ 2로 정신적으로 설정하십시오. , 3, \ ldots $

첫 번째 액세스가 센터의 오른쪽에 있으며, 위치 $ i $ 을 말하고 두 번째 액세스를 고려하십시오. 첫 번째 액세스 권한이있는 경우 이미 대답할지 이미 알고 있습니다. 그렇지 않으면 두 가지 경우가 있습니다. 액세스 된 위치 $ j $ $ I / 2 $ , $-1 $ (그리고 왼쪽 요소를 채우십시오). $ i / 2 $ , 답변 $ + 1/2 $ (및 채우기) $ i $

이런 식으로 계속해서 각 단계에서 표적 요소를 포함 할 수있는 위치의 수는 각 단계에서 가장 반으로 가장 잘 삭제됩니다. 마지막으로 하나의 요소 만 계속해서 쿼리하지 않고도 알고리즘을 알고리즘에 배열이 대상 요소가 포함되어 있는지 여부를 알 수 없습니다. $ \ log_2 n $ 단계를 수행 하여이 단계에 도달합니다.

전술 한 것은 실제로 정렬 된 배열을 검색하는 데 최적의 이진 검색이 최적 인 것을 보여줍니다.

다른 팁

$ n $ 가능한 답변이 있습니다.각 비교는 최대한의 정보를 제공합니다. $ \ lg n $ 정보의 비트가 답을 설명하기 위해 적어도 $ \LG N $ 비교.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top