당신은 시도에 대해 대신 배열의 2 개 diffrent 인덱스를 비교하기 위해 각각의 반복에서 오라클을 요청하는 방법이 작동하려면 고전 이진 검색을 변경할 수 있습니다 단지 1, 뭔가 같은 :
assume Oracle(x,y) returns "x>=y?", assume every division is returning floor integer.
LyingOracleSearch(A,n,toFind)
1. if (n==0) return not found
2. if (A[0]==toFind) return found
3. if (Oracle(A[n/4],toFind) and Oracle(toFind,A[3n/4]) then
4. return LyingOracleSearch(A[(n/4)...(3n/4)],3n/4-n/4,toFind)
5. if (Oracle(A[n/4],toFind) and !Oracle(toFind,A[3n/4]) then
6. return LyingOracleSearch(A[0...(n/4)],n/4,toFind)
7. if (!Oracle(A[n/4],toFind) and Oracle(toFind,A[3n/4]) then
8. return LyingOracleSearch(A[(3n/4)...n],n-3n/4,toFind)
9. return LyingOracleSearch(A,n,toFind); \\orcale lied!
나는 그것이 손톱이라고 생각한다. 틀릴 수도있다.
복잡성은 원래의 BS와 같지만 오라클에 두 번 이상 묻는 것이 좋습니다. 엘리먼트가 오라클이 거짓말을하지 않으면 두 번 비교되지 않는다는 것에주의하십시오. 따라서 k가 작은 -o (logn) 인 경우 한 번 또는 심지어 k 번 거짓이면 우린 괜찮습니다.
좋아하는 코딩 환경으로 이동하여 비교할 때마다 코드화 해보십시오. 이것과 순진한 것을 모두 시도해보고 결과를 비교해보십시오. 실수가 아니라면, 순진한 사람은 이것보다 두 배를 비교해야합니다.
주목해라. 내가 인덱스에 너무주의를 기울이지 않았다면, 인덱스를 놓치지 않았거나 실수로 인덱스를 반복하지 않았는지 확인하기 위해 몇 가지 생각을해야 할 것이다.
'2 * log_2 (N)'및'log_2 (n) + O (log (N))'은 모두 O (log (N))'입니다. 숨겨진 상수를 사용하여 로그 기반을 변경할 수 있습니다. 솔루션 기준이 맞습니까? – phs
확인. 복잡도는 O (log (N))와 동일합니다. 당신 말이 맞아요. 그러나 문제는 단지 log_2 (n) + o (logn)의 비용 만 들게하는 알고리즘을 찾길 바란다. 이것은 순진한 이진 검색에서 2 * log_2 (n) 비교보다 적습니다. 매번 두 번 묻습니다. 나는 그 질문을 충분히 명확히하지 않아서 유감입니다. –
답 중 하나가 거짓이면 정답을 탐지하기 위해 세 번 질문해야합니다. – OleGG