तो दो सरणियों (जैसे कि, A
N
तत्व है की लंबाई और B
M
तत्व) है समान हैं, तो सबसे अच्छा तरीका रैखिक एक की खोज एक और सरणी में सरणी के तत्वों प्रदर्शन करने के लिए किया जाएगा। बेशक, चूंकि सरणी को क्रमबद्ध किया जाता है, अगली खोज शुरू होनी चाहिए जहां पिछली खोज बंद हो गई है। यह "क्रमबद्ध सरणी विलय" एल्गोरिदम में उपयोग किया जाने वाला क्लासिक सिद्धांत है। O(N + M)
पर जटिलता।
लंबाई काफी अलग (जैसे कि, M << N
), तो एक और अधिक इष्टतम दृष्टिकोण छोटे सरणी के तत्वों के माध्यम से पुनरावृति और लंबे समय तक सरणी में इन मूल्यों को देखने के लिए द्विआधारी खोज का उपयोग किया जाएगा रहे हैं। उस मामले में जटिलता O(M * log N)
है।
आप O(M * log N)
देख सकते हैं की तुलना में बेहतर O(N + M)
अगर M
बहुत खराब अन्यथा N
की तुलना में छोटे, और है।
सरणी आकार में अंतर जो एक से दूसरे दृष्टिकोण से स्विच उत्प्रेरित करने चाहिए कुछ व्यावहारिक दृष्टिकोण पर निर्भर करता है। यदि आपके डेटा के साथ व्यावहारिक प्रयोगों के आधार पर चुना जाना चाहिए।
इन दो दृष्टिकोण (रेखीय और द्विआधारी खोज) एक एकल एल्गोरिथ्म में "मिश्रित" हो सकता है। आइए M <= N
मान लें। उस स्थिति में चलिए चरण मान S = [N/M]
चुनें।आप सरणी A
से पहले तत्व लेते हैं और स्ट्रैड चरण B
में उस तत्व के लिए रैखिक खोज चरण S
के साथ करते हैं, जिसका अर्थ है कि आप B[0], B[S], B[2*S], B[3*S], ...
तत्वों को जांचते हैं। एक बार जब आप इंडेक्स रेंज [S*i, S*(i+1)]
पाते हैं जिसमें संभावित रूप से वह तत्व शामिल होता है जिसे आप खोज रहे हैं, तो आप बाइनरी पर जाएं B
के उस सेगमेंट के अंदर खोज करें। किया हुआ। A
के अगले तत्व के लिए स्ट्रैडल रैखिक खोज शुरू होती है जहां पिछली खोज छोड़ी गई थी। (एक साइड नोट के रूप में, यह S
के मूल्य को 2 की शक्ति के बराबर चुनने का अर्थ हो सकता है)।
यह "मिश्रित" एल्गोरिदम अस्तित्व में दो क्रमबद्ध सरणी के लिए सबसे विषम रूप से इष्टतम खोज/मर्ज एल्गोरिदम है। हालांकि, अभ्यास में सरणी के सापेक्ष आकार के आधार पर बाइनरी या रैखिक खोज चुनने के साथ अधिक सरल दृष्टिकोण पूरी तरह से काम करता है।
+1 - एक छद्म कोड समाधान देने के लिए जिसे ओपी द्वारा वास्तविक कोड में अनुवादित किया जा सकता है। (आपको शायद यह भी वर्णन करना चाहिए कि किनारे/अंत मामलों में क्या होता है।) –
यह निश्चित रूप से विलय प्रकार के समान है। – Neil
@ स्टीफनसी: आप उन मामलों का मतलब है जहां एक सरणी समाप्त हो गई है, मुझे लगता है? यह मूल रूप से स्टॉप हालत है ... (मुझे यह भी लगता है कि प्रत्येक सरणी में एक तत्व दो बार प्रदर्शित होता है जिसे आप दो बार प्रिंट करना चाहते हैं) – amit