में रैखिक खोज दक्षता यह सवाल एक रेखीय खोज सन्निहित भंडारण में एक पूर्व क्रमबद्ध सरणी के लिए एक द्विआधारी खोज की दक्षता बनाम की दक्षता के बारे में है ...द्विआधारी खोज दक्षता बनाम fortran
मैं एक है फोर्टन में लिखा गया आवेदन (77!)। कोड के मेरे हिस्से के लिए एक लगातार ऑपरेशन इंडेक्स को एक सरणी में ढूंढना है जैसे कि gx(i) <= xin < gx(i+1)
। बयान लेबल और goto
के लिए खेद है - - मैं वर्तमान में एक binary search
के रूप में इस प्रकार से क्रियान्वित किया मैं टिप्पणी की है बराबर statments fortran 90 का उपयोग करके किया जाएगा क्या ...
i=1
ih=nx/2
201 continue !do while (.true.)
if((xin.le.gx(i)).and.(xin.gt.gx(i+1)))then !found what we want
ilow=i+1; ihigh=i
s1=(gx(ihigh)-xin)/(gx(ihigh)-gx(ilow))
s2=1.0-s1
return
endif
if(i.ge.ih)then
goto 202 !exit
endif
if(xin.le.(gx(ih))then !xin is in second half of array
i=ih
ih=nx-(nx-ih)/2
else !xin is in first half of array
i=i+1
ih=i+(ih-i)/2
endif
goto 201 !enddo
बहरहाल, आज, मैं पढ़ रहा था विकिपीडिया पर द्विआधारी खोज के बारे में है और मैं इस पार आया:
Binary search can interact poorly with the memory hierarchy
(i.e. caching), because of its random-access nature. For
in-memory searching, if the span to be searched is small, a
linear search may have superior performance simply because
it exhibits better locality of reference.
मैं पूरी तरह से इस बयान समझ में नहीं आता - मेरी धारणा इसलिए यदि हम शुरू करते हैं, कि कैश फ़ेच एक समय में बड़े (ish) मात्रा में इकट्ठे हुए थे था सरणी की शुरुआत में, मैंने सोचा कि अधिकांश सरणी पहले से ही कैश में होगी (कम से कम उतनी ही होगी जितनी होगी एक रैखिक खोज के लिए), इसलिए मुझे नहीं लगता था कि इससे कोई फर्क नहीं पड़ता।
तो मेरा सवाल यह है कि क्या यह बताने का कोई तरीका है कि कौन सा एल्गोरिदम बेहतर प्रदर्शन करेगा (रैखिक या बाइनरी खोज?) क्या कोई सरणी आकार सीमा है? मैं वर्तमान में लगभग 100 तत्वों के आकार के सरणी का उपयोग कर रहा हूं ...
इसके लिए धन्यवाद। यह बहुत जानकारीपूर्ण है। मैं इसे "सटीक तोड़ने के बिंदु से भी मापने की जरूरत है" से लेता हूं कि इन चीजों से निपटने के लिए अंगूठे का कोई नियम नहीं है (जब बाइनरी खोज के साथ रैखिक रूप से बनाम खोजा जाए)? – mgilson
बिल्कुल। यह सीपीयू पर भी निर्भर करता है। बड़ी सूचियों (या कई छोटी सूचियों!) के लिए, यह निश्चित रूप से कैश आकार पर निर्भर करता है। मैं सिर्फ एक माइक्रो-बेंचमार्क स्थापित करता हूं और एन तत्वों पर बाइनरी खोज बनाम रैखिक खोज मापता हूं। – usr
इसके अलावा आधुनिक एमएमयू रैम से डेटा को प्रीफेच करने के लिए प्रवृत्त होंगे यदि वे आपको अनुक्रम में एन, एन + 1, एन + 2 वें तत्व तक पहुंचते हुए देखते हैं, लेकिन यह नहीं बता सकते कि आप क्या कर रहे हैं यदि आप एक यादृच्छिक पैटर्न में पहुंचते हैं बाइनरी खोज आउटपुट। – SecurityMatt