你可能想改變這個工作了經典二進制搜索,怎麼樣試着問了Oracle在每次迭代中比較數組,而不是2個不同勢指標只是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相同,但是最好再問兩次或更多。注意一個元素從來沒有被比較過兩次,除非oracle存在,所以如果它存在一次甚至k次,其中k很小 - o(logn),那麼我們很好。
你可以去你最喜歡的編碼環境,並嘗試編碼它,每次做比較,數一數。試試這個和天真的,並比較結果,如果我沒有錯,天真應該比這兩倍。
請注意,我並不太在意索引,你需要做一些思考,以確保我沒有錯過索引或沒有重複索引意外。
'2 * log_2(N)'和'log_2(n)+ O(log(N))'都是'O(log(N))'。隱藏的常量可以用來改變日誌的基礎。你確定這些是解決方案標準嗎? – phs 2012-01-30 02:35:49
好的。複雜性是相同的,即O(log(N))。你是對的。然而,這個問題希望我找到一個只需要log_2(n)+ o(logn)比較的算法。這在天真二進制搜索中比2 * log_2(n)的比較少得多,每次問兩次。我很抱歉,我沒有把這個問題弄清楚。 – 2012-01-30 02:48:35
請注意,如果其中一個答案是謊言,你需要問三次才能發現正確的答案。 – OleGG 2012-01-30 03:10:57