2012-12-27 53 views
9

शीर्षक के अनुसार, का रनटाइम java.util.Arrays में क्या है?java.util.Arrays में बराबर() के रनटाइम क्या है?

उदाहरण के लिए यदि यह दो int[] की तुलना कर रहा है, तो क्या यह सरणी में प्रत्येक तत्व के माध्यम से लूप करता है, इसलिए ओ (एन)? और जावा में equals() में सभी कक्षाओं के equals() के लिए, क्या हम मान सकते हैं कि रनटाइम हमेशा ओ (एन) है?

धन्यवाद।

+5

आप स्रोत की जांच क्यों नहीं करते ?? – PermGenError

+1

सामान्य मामले में, यह निर्दिष्ट नहीं है (क्योंकि एक वर्ग का अपना 'बराबर' हो सकता है)। हालांकि, यह एक गहरी तुलना है, इसलिए शायद ओ (एन) दो 'int [] ' –

+0

की तुलना करने के लिए डिफ़ॉल्ट रूप से आपका क्या मतलब है? –

उत्तर

8

शीर्षक कहा गया है, क्या java.util.Arrays में डिफ़ॉल्ट बराबर() के क्रम है (एक्स == y मान हमेशा सही है)?

डिफ़ॉल्ट बराबर ऑब्जेक्ट.equals का मतलब हो सकता है। Arrays.equals() आमतौर पर आप वास्तव में क्या चाहते हैं।

उदाहरण के लिए यदि यह दो int [] की तुलना कर रहा है, तो क्या यह सरणी में प्रत्येक तत्व के माध्यम से लूप करता है, इसलिए ओ (एन)?

हां, स्रोत बताता है कि यह क्या है।

और जावा में सभी डिफ़ॉल्ट बराबर() के लिए, क्या हम मान सकते हैं कि रनटाइम हमेशा ओ (एन) है?

कुछ संग्रह के लिए यह सही है, लेकिन ट्री संग्रह के लिए यह O (n n लॉग इन करें) हो सकता है। हैश मैप के लिए सबसे खराब मामला ओ (एन^2) गैर संग्रह के लिए n का कोई मतलब नहीं है।

+1

में डिफ़ॉल्ट बराबर नहीं है क्या यह Jray spec में परिभाषित किया गया है, जैसा कि Array.equals() को कार्यान्वित करने के तरीके के रूप में, या विशेष JVM लेखकों को कार्यान्वित किया गया है । यानी यह आईबीएम जेवीएम और दल्विक वीएम के बारे में भी सच होगा, या भविष्य में ओरेकल जेवीएम में यह बदलाव हो सकता है? –

+1

@ सैमुएल वाल्कर हालांकि मुझे संदेह है कि यह कल्पना का हिस्सा है, लंबे समय तक चलने वाले तरीकों का व्यवहार इस आधार पर बहुत कुछ नहीं बदलता है कि आप कभी नहीं जानते कि यह क्या हो सकता है। इस मामले में, यह कल्पना करना मुश्किल है कि आप इसे एक और तरीके से लागू क्यों करेंगे। आपको संदर्भ कार्यान्वयन दिया गया है। –

+0

वृक्ष के लिए यह ओ (एन लॉग एन) कैसे हो सकता है? क्या यह ओ (एन * एन लॉग एन) नहीं है? – soandos

11

स्रोत कोड से पकड़ा (स्रोत कोड 100 शब्दों के बराबर होती: पी):

/** 
* Returns <tt>true</tt> if the two specified arrays of ints are 
* <i>equal</i> to one another. Two arrays are considered equal if both 
* arrays contain the same number of elements, and all corresponding pairs 
* of elements in the two arrays are equal. In other words, two arrays 
* are equal if they contain the same elements in the same order. Also, 
* two array references are considered equal if both are <tt>null</tt>.<p> 
* 
* @param a one array to be tested for equality 
* @param a2 the other array to be tested for equality 
* @return <tt>true</tt> if the two arrays are equal 
*/ 
public static boolean equals(int[] a, int[] a2) { 
    if (a==a2) 
     return true; 
    if (a==null || a2==null) 
     return false; 

    int length = a.length; 
    if (a2.length != length) 
     return false; 

    for (int i=0; i<length; i++) 
     if (a[i] != a2[i]) 
      return false; 

    return true; 
} 
+2

यह डिफ़ॉल्ट बराबर नहीं है। – Henry

+0

क्षमा करें मेरा मतलब java.util.Array में बराबर है, ऑब्जेक्ट –

6

यह पहली चेकों लंबाई, और बराबर हैं, सभी तत्वों और कॉल पर लूप उन पर बराबर होती है।

तो, यदि आप व्यक्तिगत बराबर की लागत को अनदेखा करना चाहते हैं, तो हाँ, यह ओ (एन) होगा। लेकिन यदि प्रविष्टियां स्ट्रिंग्स हैं, उदाहरण के लिए, यह लंबे समय तक भी अधिक हो जाएगा क्योंकि स्ट्रिंग्स अधिक समय तक पहुंचते हैं, न कि जैसे ही वे अधिक होते हैं (क्योंकि तुलना स्वयं भी ओ (एम) होती है)।

0

javadoc states: दो सरणी बराबर हैं यदि उनमें एक ही तत्व समान तत्व होते हैं। तो यह स्पष्ट है कि यह एक ओ (एन) ऑपरेशन होने जा रहा है क्योंकि इसे सभी वस्तुओं पर लूप करने की आवश्यकता होगी (कम से कम अगर वे सभी बराबर हैं)।

default equals (यानी वस्तु # के बराबर होती है) एक हे है (1) आपरेशन, यह एक साधारण संदर्भ तुलना है:

के लिए किसी भी गैर-शून्य संदर्भ वेल्यू एक्स और वाई

, इस विधि अगर सच रिटर्न और केवल x और y अगर एक ही वस्तु का उल्लेख