मैं पाइथन में बाइनरी खोज का निर्माण करता हूं, लेकिन सवाल सामान्य रूप से बाइनरी खोज संरचना के साथ अधिक करना है।बाइनरी स्ट्रिंग खोज - न्यूनतम बिन चौड़ाई?
मान लीजिए कि मेरे पास लगभग एक हजार योग्य उम्मीदवार हैं जो मैं बाइनरी खोज का उपयोग करके खोज रहा हूं, सॉर्ट किए गए डेटासेट को विभाजित करने के क्लासिक दृष्टिकोण कर रहा हूं और इस प्रक्रिया को दोहराने के लिए योग्य सेट को कम करने के लिए इस प्रक्रिया को दोहराना चाहता हूं।
hi = len(names)
lo = 0
while lo < hi:
mid = (lo+hi)//2
midval = names[mid].lower()
if midval < query.lower():
lo = mid+1
elif midval > query.lower():
hi=mid
else:
return midval
return None
यहां से अनुकूलित किया गया यह कोड: https://stackoverflow.com/a/212413/215608 उम्मीदवारों सिर्फ नाम के तार, (प्रथम पिछले प्रारूप, उदाहरण के लिए "पीटर जैक्सन") मैं शुरू में वर्णानुक्रम सेट को सॉर्ट और फिर कुछ इस तरह का उपयोग कर द्विभाजन के साथ आगे बढ़ना कर रहे हैं
यहां बात है, उपरोक्त प्रक्रिया एक सटीक मिलान मानती है या कोई परिणाम नहीं। क्या होगा यदि क्वेरी केवल "पीटर" के लिए थी, लेकिन पिछले अंतिम नामों के साथ कई पालतू जानवर हैं? सभी पीटर्स को वापस करने के लिए, किसी को यह सुनिश्चित करना होगा कि विभाजित "डिब्बे" योग्य परिणामों को छोड़कर इतनी छोटी नहीं हो पाएंगे। सभी पीटर्सों को वापस करने के लिए बायसेक्शन प्रक्रिया को रेजेक्स/नियमित पुराने स्ट्रिंग मैच जैसे कुछ को समाप्त करना होगा और उसे रोकना होगा।
मैं इतना नहीं पूछ रहा हूं कि इसे के रूप में कैसे पूरा किया जाए इस प्रकार की खोज कहलाती है ... "बिन आकार" के लिए सीमित मानदंड के साथ बाइनरी खोज क्या है? कुछ जो सशर्त रूप से डेटासेट को विभाजित करता है, और मानदंड पूरा होने के बाद, यह सुनिश्चित करने के लिए स्ट्रिंग मिलान के किसी अन्य रूप पर वापस आ जाता है ताकि यह सुनिश्चित किया जा सके कि क्वेरी पर प्रभावी वाइल्डकार्ड प्रभावी रूप से हो सकता है (इसलिए "पीटर" की खोज " पीटर जैक्सन "और" पीटर एडवर्ड्स ")
उम्मीद है कि मैं स्पष्ट हूं कि मेरा क्या मतलब है। मुझे सामान्य डीबी परिदृश्य में एहसास है कि नाम अलग हो सकते हैं, यह सिर्फ अवधारणा के सबूत के रूप में है।
सबसे खराब मामले में यह सभी पेटर्स हो सकता है, है ना? – kdubs
वास्तव में, सबसे खराब परिदृश्य में (या मुझे इरादा कहना चाहिए?) सभी पीटर्स प्राप्त किए जाएंगे। – DeaconDesperado
तो ऐसा लगता है कि आपको बिन करना होगा जो आप खोज सकते हैं। मुझे लगता है कि जब तक आप एक मैच नहीं पाते हैं तब तक आप बाइनरी कर सकते हैं, और फिर अन्य सभी मैचों को खोजने के लिए दोनों दिशाओं में एक रैखिक खोज करें। सुनिश्चित नहीं है कि मैं इसे डिब्बे कहूंगा, लेकिन आपके पास एक डेटा बाइनरी पेड़ और रैखिक में व्यवस्थित होगा। – kdubs