का उपयोग कर मैं वर्तमान में एक समाधान है, लेकिन मुझे लगता है यह रूप में कुशल नहीं है के रूप में यह इस समस्या का हो सकता है दो क्रमबद्ध सरणियों में मिलान मूल्यों का सूचकांक लगता है, इसलिए मैं अगर वहाँ के लिए एक तेज तरीका है देखना चाहता हूँ इस।लिए सबसे कारगर तरीका सी ++
मैं दो सरणियों (std :: उदाहरण के लिए वैक्टर) है। दोनों सरणी में केवल अद्वितीय पूर्णांक मान होते हैं जो क्रमबद्ध होते हैं लेकिन मूल्य में भिन्न होते हैं, यानी: 1,4,12,13 ... मैं जो पूछना चाहता हूं वह है कि मैं इंडेक्स को उन सरणी में से एक में ढूंढ सकता हूं जहां मूल्य समान हैं। उदाहरण के लिए, array1 में 1,4,12,13 मान हैं और array2 के मूल्य 2,12,14,16 हैं। पहला मिलान मूल्य सूचकांक array2 में 1 है। सरणी में इंडेक्स महत्वपूर्ण है क्योंकि मेरे पास अन्य एरे हैं जिनमें डेटा है जो इस इंडेक्स का उपयोग करेगा जो "मैचों" का उपयोग करेगा।
मैं सरणियों का उपयोग कर तक ही सीमित नहीं रहा हूँ, नक्शे के लिए संभव हो रहे हैं। मैं केवल एक बार दो सरणी की तुलना कर रहा हूं। पहले मिलान पास के बाद उन्हें फिर से उपयोग नहीं किया जाएगा। किसी भी सरणी में बड़ी संख्या में मूल्य (300,000+) हो सकते हैं, लेकिन हमेशा समान संख्या में मूल्य नहीं होते हैं (जो चीजों को अधिक आसान बनाते हैं)
खराब मामला एक रैखिक खोज ओ (एन^2 है))। मानचित्र का उपयोग करने से मुझे बेहतर ओ (लॉग एन) मिल जाएगा, लेकिन मैं अभी भी एक सरणी को मूल्य, सूचकांक जोड़े के मानचित्र में परिवर्तित कर दूंगा।
मैं वर्तमान में किसी भी कंटेनर प्रकार रूपांतरण नहीं कर करना है यह क्या है। दो सरणी के छोटे से ऊपर लूप। बड़े सरणी (array2) के वर्तमान तत्व के साथ छोटे सरणी (array1) के वर्तमान तत्व की तुलना करें। यदि array1 तत्व मान सरणी 2 तत्व मान से बड़ा है, तो सरणी 1 तत्व मान (जबकि लूप) से बड़ा नहीं है, तब तक सरणी 2 के लिए अनुक्रमणिका को बढ़ाएं। फिर, यदि array1 तत्व मान array2 तत्व से छोटा है, तो अगले लूप पुनरावृत्ति पर जाएं और फिर से शुरू करें। अन्यथा वे बराबर होना चाहिए और मेरे पास मिलान सूचकांक के सरणी के लिए मेरी अनुक्रमणिका है।
तो यह पाश में, मैं सबसे अच्छा हे (एन) यदि सभी मूल्यों मैच में और बदतर हे (2n) यदि कोई भी मैच में हूँ। तो मैं सोच रहा हूं कि वहां कुछ तेज है या नहीं? यह सुनिश्चित करना मुश्किल है कि कितने बार दो सरणी मिलेंगे, लेकिन मैं जिस तरह से अधिकतर सरणीओं की तरफ झुकता हूं, वैसे ही अधिकतर मैच नहीं होंगे।
मुझे आशा है कि मैं इस समस्या काफी अच्छी तरह से समझाया और मैं किसी भी प्रतिक्रिया या इस सुधारने की युक्तियों की सराहना करते हैं।
कोड उदाहरण:
std::vector<int> array1 = {4,6,12,34};
std::vector<int> array2 = {1,3,6,34,40};
for(unsigned int i=0, z=0; i < array1.size(); i++)
{
int value1 = array1[i];
while(value1 > array2[z] && z < array2.size())
z++;
if (z >= array2.size())
break; // reached end of array2
if (value1 < array2[z])
continue;
// we have a match, i and z indices have same value
}
परिणाम array1 = [1,3] के लिए और array2 = [2,3]
आपका कोड कहां है? – Christophe
वर्तमान समाधान – scottiedoo
का जोड़ा गया कोड कोड मैं उत्सुक हूं, संदर्भ क्या है जहां आपको इस एल्गोरिदम की आवश्यकता है? – user2079303