2013-10-17 8 views
6

में डुप्लिकेट पंक्तियों की जांच करने के लिए कुशल एल्गोरिदम पूर्णांक के मैट्रिक्स एम को देखते हुए। जांचें कि मैट्रिक्स में दो पंक्तियां समान हैं या नहीं। इष्टतम दृष्टिकोण दें।मैट्रिक्स

Example: 
[{1, 2, 3}, 
{3, 4, 5}, 
{1, 2, 3}] 

उपरोक्त मैट्रिक्स में, पंक्तियां 1 और 3 समान हैं।

संभव समाधान:

Given a matrix, we can convert each row in a string (example using to_string() 
method of C++ and concatenating each element in a row to a string). We do this 
for every row of the matrix, and insert it in a table that is something like 
(map<string, int> in C++). And hence, duplicate row can be checked in O(mn) time 
for an mxn matrix. 

मैं इससे बेहतर कर सकते हैं? या, उपर्युक्त विधि में कोई दोष है?

+1

मुझे उम्मीद नहीं है कि आप ओ (एमएन) से बेहतर कर सकते हैं क्योंकि सबसे खराब मामले में प्रत्येक तत्व को पढ़ने की आवश्यकता होगी। – Matt

+1

यह कारण होगा कि @Matt ने कहा था। बस एक चेतावनी, जब आप तत्वों को जोड़ते हैं तो आपको कुछ डिलीमीटर लगाने की आवश्यकता होती है। अन्यथा '{1, 23}' और '{12, 3} 'को वही माना जाएगा। – justhalf

+0

@justhalf: इसे इंगित करने के लिए धन्यवाद। –

उत्तर

6

आपकी विधि काम करती है लेकिन आप इसकी जटिलता के साथ गलत हैं।

सबसे पहले, परीक्षण एक तत्व है अगर में एक std::map, जटिलता O(log(n) * f) है जहां n नक्शे में तत्वों की संख्या है और f समय किसी भी दो तत्वों डाला/नक्शे में खोजा गया की तुलना करने के लिए आवश्यक के लिए एक ऊपरी बाध्य है।

आपके मामले में, प्रत्येक स्ट्रिंग में लंबाई m है, इसलिए मानचित्र में किसी भी दो तत्वों की तुलना O(m) की तुलना में होती है।

तो अपने विधि की कुल जटिलता है:

नक्शे में n तार डालने के लिए O(n * log(n) * m)

हालांकि, आप इसे अपेक्षाकृत O(n * m) तक बढ़ा सकते हैं, जो कि मानचित्र के बजाए हैश तालिका का उपयोग करके असम्बद्ध रूप से इष्टतम (क्योंकि आपको सभी डेटा पढ़ना है) है। इसका कारण यह है कि हैश तालिका में O(1) एक सम्मिलन ऑपरेशन के लिए औसत जटिलता है और प्रत्येक इनपुट स्ट्रिंग के लिए हैश फ़ंक्शन की गणना केवल एक बार की जाती है।

C++ में आप इसके लिए unordered_set का उपयोग कर सकते हैं।

0

मैट्रिक्स के आकार के आधार पर, सब कुछ एक स्ट्रिंग में कनवर्ट करना समय और स्थान की एक बड़ी बड़ी बर्बादी की तरह लगता है।

प्रत्येक पंक्ति के लिए संभावित अद्वितीय हैश की गणना क्यों नहीं करें। उदाहरण के लिए, आप बिट-वार या सभी प्रविष्टियों की गणना कर सकते हैं, फिर उस हैश को एक पंक्ति में, पंक्ति के सूचकांक के साथ, एक बहुआयामी में सहेजें। जैसे ही आप प्रत्येक पंक्ति से गुजरते हैं, आप इसकी हैश की गणना करते हैं, फिर यह देखने के लिए जांचें कि क्या हैश पहले से मौजूद है या नहीं। यदि ऐसा होता है, तो अपनी पंक्ति की तुलना अन्य पंक्तियों से उसी हैश के साथ करें ताकि यह देखने के लिए कि वे बराबर हैं या नहीं।

इसमें बेहतर बिग-ओ जटिलता नहीं है, लेकिन यह लगभग निश्चित रूप से एक छोटा स्थिर है और कम जगह का उपयोग करता है।