केवल ओरेकल से सवाल पूछें: "x> = y है?" एक बार अपनी बाइनरी खोज के प्रत्येक पुनरावृत्ति पर। यदि आपको दो बार एक ही जवाब मिलता है, तो आप जानते हैं कि ओरेकल पहली बार झूठ नहीं बोलता था।
उदाहरण के लिए, आप x = 1 की खोज कर रहे हैं, और पहले परीक्षण जो आप y = a के खिलाफ परीक्षण करते हैं, और ऑरैकल x < ए का उत्तर देता है। दूसरे परीक्षण पर आप वाई = बी के खिलाफ परीक्षण करते हैं और ऑरकल जवाब x < बी। चूंकि आप बाइनरी खोज का उपयोग कर रहे हैं, और ऑरैकल ने कहा '<', और सरणी सॉर्ट की गई है, आप जानते हैं कि बी < ए। इसलिए, यदि x < बी, तो आप यह भी जानते हैं कि x < ए, और पहला उत्तर झूठ नहीं था। यदि दूसरा उत्तर झूठ है, और x> b, तो यह अभी भी सत्य है कि x < ए, क्योंकि ऑरैकल केवल एक बार झूठ बोल सकता है।
यह सच है भले ही उत्तर वापस वापस न आएं। उदाहरण के लिए आपको तीन उत्तरों मिलते हैं: x < ए, एक्स> = बी, एक्स < सी, आप जानते हैं कि सी < ए, आपकी द्विआधारी खोज से, और इसलिए यह सच होना चाहिए कि x < ए, और ऑरैकल नहीं था झूठ बोला जब उसने आपको बताया था।
तो क्या होता है जब ऑरैकल झूठ बोलता है? यदि झूठ x < y था, तो सत्य x> = y था। इसलिए, जब आप अपनी बाइनरी खोज जारी रखते हैं, उस बिंदु से, आपके द्वारा चेक की जाने वाली संख्याएं बहुत छोटी होंगी, और उत्तर हमेशा "> =" होगा, जब तक आप बाइनरी खोज के नीचे तक नहीं पहुंच जाते। उस समय, आपको एहसास हुआ कि अगर ऑरैकल झूठ बोला गया, तो उसने आखिरी बार झूठ बोला जब उसने आपको "> =" के अलावा कुछ और बताया। तो आप उस बिंदु पर अपनी बाइनरी खोज को पुनरारंभ करें जहां ऑरैकल ने आपको झूठ बोला और कहा "x < y"।
यह हमेशा < 2 लॉग_2 एन तुलना का उपयोग करेगा, लेकिन अगर खोज की शुरुआत में ऑरकल आपको झूठ बोलता है, तो आपको लगभग log_2 n काम दोहराना होगा, और इसलिए आपको log_2 n + o नहीं मिलता है (लॉग एन) उत्तर आप देख रहे थे। इस प्रकार, आपको एनएम द्वारा सुझाए गए विचार को शामिल करना चाहिए। अगर आपको एक ही जवाब मिलता है, तो पंक्ति में sqrt (लॉग n) बार कहें, तो आपको संदेह है कि ऑरैकल ने आपसे झूठ बोला होगा, और आप तुरंत सवाल पूछेंगे बाइनरी खोज के निचले हिस्से तक इंतजार करने के बजाए जवाब दोहराने शुरू होने से ठीक पहले पूछा गया। इस रणनीति के बाद, आप सबसे खराब मामले में एक प्रश्न लॉग n/sqrt (लॉग n) बार फिर से पूछेंगे, और आप हमेशा अधिकतर sqrt (लॉग n) बर्बाद काम के साथ झूठ पकड़ेंगे, जो चलने वाले समय को प्राप्त करता है खोज रहे हैं
'2 * log_2 (एन)' और 'log_2 (एन) + O (लॉग (एन))' दोनों 'ओ (लॉग (एन))' कर रहे हैं। लॉग बेस बदलने के लिए छिपी स्थिरता का उपयोग किया जा सकता है। क्या आप वाकई समाधान मानदंड थे? – phs
ठीक है। जटिलता वही है, जो ओ (लॉग (एन)) है। तुम सही हो। हालांकि, सवाल मुझे एक एल्गोरिदम खोजना चाहता है जिसकी लागत केवल लॉग_2 (एन) + ओ (लॉगन) तुलना है। यह बेवकूफ बाइनरी खोज में 2 * लॉग_2 (एन) तुलना से कम है, हर बार दो बार पूछना। मुझे खेद है कि मैं सवाल को स्पष्ट नहीं करता हूं। –
ध्यान दें कि यदि उत्तर में से कोई एक झूठ है तो आपको सही उत्तर का पता लगाने के लिए तीन बार पूछने की आवश्यकता है। – OleGG