हैशसेट बनाम ट्रीसेट


495

मैंने हमेशा पेड़ों से प्यार किया है, यह अच्छा है O(n*log(n))और उनकी ख़ुशी। हालाँकि, मेरे द्वारा ज्ञात प्रत्येक सॉफ़्टवेयर इंजीनियर ने मुझसे स्पष्ट रूप से पूछा है कि मैं एक का उपयोग क्यों करूंगा TreeSet। एक CS बैकग्राउंड से, मुझे नहीं लगता कि यह सब बहुत मायने रखता है जो आप उपयोग करते हैं, और मुझे हैश फ़ंक्शंस और बकेट्स (मामले में Java) के साथ गड़बड़ करने की परवाह नहीं है ।

किन मामलों में मुझे एक HashSetसे अधिक का उपयोग करना चाहिए TreeSet?

जवाबों:


859

हैशसेट ट्रीसेट (ऐड, रिमूव और सम्‍मिलित जैसे अधिकांश परिचालनों के लिए निरंतर-समय बनाम लॉग-टाइम) की तुलना में बहुत तेज़ है, लेकिन ट्रीसेट जैसी कोई आदेश गारंटी नहीं देता है।

HashSet

  • कक्षा बुनियादी संचालन (जोड़ने, हटाने, शामिल और आकार) के लिए निरंतर समय प्रदर्शन प्रदान करता है।
  • यह गारंटी नहीं देता है कि तत्वों का क्रम समय के साथ स्थिर रहेगा
  • यात्रा का प्रदर्शन प्रारंभिक क्षमता और हैशसेट के लोड कारक पर निर्भर करता है ।
    • यह डिफ़ॉल्ट लोड फैक्टर को स्वीकार करने के लिए काफी सुरक्षित है, लेकिन आप एक प्रारंभिक क्षमता निर्दिष्ट करना चाहते हैं जो कि आकार से लगभग दोगुना हो, जिससे आप सेट बढ़ने की उम्मीद करते हैं।

TreeSet

  • बुनियादी कार्यों के लिए लॉग (एन) समय लागत की गारंटी देता है (जोड़ें, हटाएं और शामिल करें)
  • गारंटी देता है कि सेट के तत्वों को क्रमबद्ध किया जाएगा (आरोही, प्राकृतिक, या आपके द्वारा इसके निर्माता द्वारा निर्दिष्ट) (औजार SortedSet)
  • चलना प्रदर्शन के लिए किसी भी ट्यूनिंग मापदंडों की पेशकश नहीं करता है
  • प्रस्तावों कुछ आसान तरीकों का आदेश दिया सेट के साथ की तरह निपटने के लिए first(), last(), headSet(), और tailSet()आदि

महत्वपूर्ण बिंदु:

  • दोनों तत्वों के डुप्लिकेट-मुक्त संग्रह की गारंटी देते हैं
  • HashSet में तत्वों को जोड़ना आम तौर पर तेजी से होता है और फिर डुप्लिकेट-फ्री सॉर्ट किए गए ट्रैंगल के लिए संग्रह को ट्रीसेट में परिवर्तित करना।
  • इनमें से कोई भी कार्यान्वयन सिंक्रनाइज़ नहीं है। यदि कई थ्रेड्स सेट को समवर्ती रूप से एक्सेस करते हैं, और थ्रेड्स में से कम से कम एक सेट को संशोधित करता है, तो इसे बाहरी रूप से सिंक्रनाइज़ किया जाना चाहिए।
  • लिंक्डहाशसेट कुछ अर्थों में मध्यवर्ती है HashSetऔर TreeSet। एक हैश तालिका के रूप में कार्यान्वित एक लिंक की गई सूची के माध्यम से चल रहा है, हालांकि, यह प्रविष्टि-आदेशित पुनरावृत्ति प्रदान करता है जो ट्रीसेट द्वारा गारंटीकृत ट्रैवर्सल के समान नहीं है

इसलिए उपयोग का एक विकल्प पूरी तरह से आपकी आवश्यकताओं पर निर्भर करता है लेकिन मुझे लगता है कि अगर आपको एक ऑर्डर किए गए संग्रह की आवश्यकता है, तो भी आपको सेट बनाने के लिए हैशसेट पसंद करना चाहिए और फिर ट्रीसेट में परिवर्तित करना चाहिए।

  • जैसे SortedSet<String> s = new TreeSet<String>(hashSet);

38
यह केवल मुझे पता है कि पुष्टि "हैशसेट ट्रीसेट (निरंतर-समय बनाम लॉग-टाइम ...) की तुलना में बहुत तेज है" स्पष्ट रूप से गलत है? पहला यह कि यह समय-जटिलता के बारे में है, निरपेक्ष समय नहीं है, और ओ (1) ओ (एफ (एन)) की तुलना में बहुत अधिक मामलों में धीमा हो सकता है। दूसरा यह कि O (logN) "लगभग" O (1) है। मुझे आश्चर्य नहीं होगा यदि कई सामान्य मामलों के लिए एक ट्रीसेट ने एक हैशसेट से बेहतर प्रदर्शन किया।
लावेला

22
मैं सिर्फ इवेला की दूसरी टिप्पणी करना चाहता हूं। समय-जटिलता है नहीं समय चल रहा है के रूप में एक ही बात है, और हे (1) हमेशा हे की तुलना में बेहतर (2 ^ n) नहीं है। एक विकृत उदाहरण बिंदु को दिखाता है: हैश एल्गोरिथ्म का उपयोग करते हुए एक हैश सेट पर विचार करें जो 10 तत्वों के लिए बुलबुला सॉर्ट (ओ (एन ^ 2) एवीजी / सबसे खराब) के किसी भी सामान्य कार्यान्वयन को निष्पादित करने के लिए 1 ट्रिलियन मशीन निर्देश ले गया है। । बबल सॉर्ट हर बार जीतेगा। बिंदु एल्गोरिदम कक्षाएं अध्यापन हर किसी को समय-जटिलता का उपयोग कर अनुमानों के बारे में सोचना है, लेकिन असली दुनिया में निरंतर कारकों है फर्क अक्सर।
पीटर ओहलर्ट जुएल

17
शायद यह सिर्फ मेरे लिए है, लेकिन पहले सब कुछ एक हैशसेट में जोड़ने की सलाह नहीं है, और फिर इसे एक भयानक पेड़ को कवर किया? 1) हैशसेट में सम्मिलन केवल तभी तेज होता है जब आप अपने डेटासेट का आकार पहले से जानते हों, अन्यथा आप कई बार O (n) री-हैशिंग का भुगतान करते हैं। और 2) आप वैसे भी सेट करते समय ट्रीसेट प्रविष्टि के लिए भुगतान करते हैं। (एक प्रतिशोध के साथ, क्योंकि एक हैशसेट के माध्यम से चलना बहुत कुशल नहीं है)
टिंकरटैंक

5
यह सलाह इस तथ्य पर आधारित है कि एक सेट के लिए, आपको यह देखने के लिए जांचना चाहिए कि क्या आइटम जोड़ने से पहले एक डुप्लिकेट है; इसलिए यदि आप किसी पेड़ पर हैशसेट का उपयोग कर रहे हैं तो आप डुप्लिकेट को खत्म करने में समय बचाएंगे। हालांकि, गैर-डुप्लिकेट के लिए दूसरा सेट बनाने के लिए भुगतान करने की कीमत को देखते हुए, डुप्लिकेट का प्रतिशत इस कीमत को पार करने और इसे समय बचाने के लिए वास्तव में बहुत अच्छा होना चाहिए। और निश्चित रूप से, यह मध्यम और बड़े सेटों के लिए है क्योंकि एक छोटे से सेट के लिए, ट्रीसेट संभवतः एक हैशसेट की तुलना में तेज है।
सिल्वेनएल

5
@PeterOehlert: कृपया इसके लिए एक बेंचमार्क प्रदान करें। मैं आपकी बात समझता हूं, लेकिन दोनों सेटों के बीच का अंतर मुश्किल से छोटे संग्रह आकारों के साथ होता है। और जैसे ही सेट एक बिंदु पर बढ़ता है, जहां कार्यान्वयन मायने रखता है, लॉग (एन) एक समस्या बन रहा है। सामान्य तौर पर कई कैश मिस (जो कि आपके पास लगभग हर एक्सेस स्तर के लिए विशाल पेड़ों पर हैं) की तुलना में हैश फंक्शन (यहां तक ​​कि जटिल भी) आदेश पत्ती को खोजने / जोड़ने / संशोधित करने के लिए हैं। कम से कम जावा में इन दो सेटों के साथ मेरा अनुभव है।
बाउंसर

38

एक लाभ का अभी तक उल्लेख नहीं किया गया TreeSetहै कि इसकी अधिक "स्थानीयता" है, जो कहने के लिए शॉर्टहैंड है (1) यदि दो प्रविष्टियां क्रम में पास हैं, TreeSetतो डेटा संरचना में उन्हें एक दूसरे के पास रखता है, और इसलिए स्मृति में; और (2) यह प्लेसमेंट स्थानीयता के सिद्धांत का लाभ उठाता है, जो कहता है कि समान आवृत्ति वाले एप्लिकेशन द्वारा समान डेटा अक्सर एक्सेस किया जाता है।

यह एक के विपरीत है HashSet, जो सभी मेमोरी में प्रविष्टियों को फैलाता है, चाहे उनकी कुंजी कोई भी हो।

जब हार्ड ड्राइव से पढ़ने की विलंबता लागत कैश या रैम से पढ़ने की लागत का हजारों गुना होती है, और जब डेटा को वास्तव में स्थानीयता के साथ एक्सेस किया जाता है, तो TreeSetयह एक बेहतर विकल्प हो सकता है।


3
क्या आप यह प्रदर्शित कर सकते हैं कि यदि दो प्रविष्टियाँ पास में हैं, तो ट्रीस्सेट उन्हें डेटा संरचना में एक-दूसरे के पास रखता है, और इसलिए स्मृति में ?
डेविड सोरोको

6
जावा के लिए काफी अप्रासंगिक। सेट के तत्व वैसे भी ऑब्जेक्ट हैं और कहीं और इंगित करते हैं, इसलिए आप कुछ भी नहीं बचा रहे हैं।
एंड्रयू गैलास्च

आमतौर पर जावा में स्थानीयता की कमी के बारे में की गई अन्य टिप्पणियों के अलावा, OpenJDK का कार्यान्वयन TreeSet/ TreeMapस्थानीयता अनुकूलित नहीं है। हालांकि लाल-काले पेड़ का प्रतिनिधित्व करने के लिए आदेश 4 के बी-ट्री का उपयोग करना संभव है और इस प्रकार स्थानीयता और कैश प्रदर्शन में सुधार होता है, यही नहीं कार्यान्वयन कैसे काम करता है। इसके बजाय, प्रत्येक नोड अपने स्वयं के कुंजी, अपने स्वयं के मूल्य, अपने माता-पिता और अपने बाएं और दाएं बच्चे के नोड्स के लिए एक पॉइंटर को स्टोर करता है, जो कि TreeMap.Entry के लिए JDK 8 स्रोत कोड में स्पष्ट है ।
kbolino

25

HashSetतत्वों तक पहुँचने के लिए O (1) है, इसलिए यह निश्चित रूप से मायने रखता है। लेकिन सेट में वस्तुओं का क्रम बनाए रखना संभव नहीं है।

TreeSetयदि कोई आदेश बनाए रखना उपयोगी है (मूल्यों के संदर्भ में और प्रविष्टि आदेश नहीं) तो आपके लिए मायने रखता है। लेकिन, जैसा कि आपने नोट किया है, आप बुनियादी कार्यों के लिए एक तत्व: ओ (लॉग एन) का उपयोग करने के लिए धीमे समय के लिए ट्रेडिंग ऑर्डर कर रहे हैं।

के लिए javadocs सेTreeSet :

इस कार्यान्वयन बुनियादी कार्यों के लिए गारंटी लॉग (एन) समय लागत प्रदान करता है ( add, removeऔर contains)।


22

1. हाशसेट शून्य वस्तु की अनुमति देता है।

2.TreeSet अशक्त वस्तु की अनुमति नहीं देगा। यदि आप अशक्त मान जोड़ने का प्रयास करते हैं तो यह NullPointerException को फेंक देगा।

3.HashSet ट्रीसेट की तुलना में बहुत तेज है।

जैसे

 TreeSet<String> ts = new TreeSet<String>();
 ts.add(null); // throws NullPointerException

 HashSet<String> hs = new HashSet<String>();
 hs.add(null); // runs fine

3
ts.add (null) यह TreeSet के मामले में ठीक काम करेगा अगर null को TreeSet में पहली वस्तु के रूप में जोड़ा जाता है। और उसके बाद जोड़ा गया कोई भी ऑब्जेक्ट, तुलनित्र की तुलना विधि में NullPointerException देगा।
शोएब चिकते

2
आपको वास्तव में nullकिसी भी तरह से अपने सेट से नहीं जोड़ना चाहिए ।
शराबी

TreeSet<String> badassTreeSet = new TreeSet<String>(new Comparator<String>() { public int compare(String string1, String string2) { if (string1 == null) { return (string2 == null) ? 0 : -1; } else if (string2 == null) { return 1; } else { return string1.compareTo(string2); } } }); badassTreeSet.add("tree"); badassTreeSet.add("asdf"); badassTreeSet.add(null); badassTreeSet.add(null); badassTreeSet.add("set"); badassTreeSet.add("tree"); System.out.println(badassTreeSet);
दविद होर्वथ

21

यहाँ पर @shevchyk द्वारा मानचित्रों पर सुंदर दृश्य उत्तर देने पर मेरा विचार है:

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
   Property          HashSet             TreeSet           LinkedHashSet   
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
                no guarantee order  sorted according                       
   Order       will remain constant to the natural        insertion-order  
                    over time          ordering                            
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
 Add/remove           O(1)              O(log(n))             O(1)         
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
                                      NavigableSet                         
  Interfaces           Set                Set                  Set         
                                       SortedSet                           
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
                                       not allowed                         
  Null values        allowed        1st element only        allowed        
                                        in Java 7                          
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
                 Fail-fast behavior of an iterator cannot be guaranteed      
   Fail-fast   impossible to make any hard guarantees in the presence of     
   behavior              unsynchronized concurrent modification              
╠══════════════╬═══════════════════════════════════════════════════════════════╣
      Is                                                                     
 synchronized               implementation is not synchronized               
╚══════════════╩═══════════════════════════════════════════════════════════════╝

13

सबसे अधिक उपयोग करने का कारण यह HashSetहै कि संचालन ओ (लॉग एन) के बजाय ओ (1) औसत हैं। यदि सेट में मानक आइटम हैं, तो आप "हैश फ़ंक्शन के साथ खिलवाड़ नहीं करेंगे" जैसा कि आपके लिए किया गया है। यदि सेट में कस्टम कक्षाएं हैं, तो आपको hashCodeउपयोग करने के लिए लागू करना होगा HashSet(हालांकि प्रभावी जावा दिखाता है कि कैसे), लेकिन यदि आप उपयोग करते TreeSetहैं तो आपको इसे बनाना होगा Comparableया आपूर्ति करना होगा Comparator। यह एक समस्या हो सकती है यदि वर्ग के पास कोई विशेष आदेश नहीं है।

मैंने कभी-कभी उपयोग किया है TreeSet(या वास्तव मेंTreeMap बहुत छोटे सेट / नक्शे (<10 आइटम) के लिए ) का हालांकि मैंने यह देखने के लिए जांच नहीं की है कि ऐसा करने में कोई वास्तविक लाभ है या नहीं। बड़े सेटों के लिए अंतर काफी हो सकता है।

अब यदि आपको छांटे जाने की आवश्यकता है, तो TreeSetउचित है, हालांकि तब भी जब अद्यतन लगातार होते हैं और एक हल किए गए परिणाम की आवश्यकता होती है, तो कभी-कभी सामग्री को किसी सूची या सरणी में कॉपी करना और उन्हें क्रमबद्ध करना तेजी से हो सकता है।


इन बड़े तत्वों जैसे 10K या उससे अधिक के लिए कोई भी डेटा बिंदु
khahajeyan

11

यदि आप लगातार रिहर्सिंग (या टकराव, यदि आपका हैशटेट का आकार परिवर्तन नहीं कर सकते हैं) में परिणाम के लिए पर्याप्त तत्व नहीं डाल रहे हैं, तो निश्चित रूप से आपको निरंतर समय के उपयोग का लाभ देता है। लेकिन बहुत सारे विकास या सिकुड़न के साथ सेट पर, कार्यान्वयन के आधार पर आपको वास्तव में ट्रीसेट के साथ बेहतर प्रदर्शन मिल सकता है।

यदि स्मृति मेरी सेवा करती है, तो परिचालित समय O (1) के करीब हो सकता है। ओकासाकी की किताब में एक बेहतर व्याख्या होगी जो मैं खींच सकता हूं। (या उनकी प्रकाशन सूची देखें )


7

हैशसेट कार्यान्वयन निश्चित रूप से बहुत तेजी से कम ओवरहेड हैं क्योंकि कोई आदेश नहीं है। जावा में विभिन्न सेट कार्यान्वयन का एक अच्छा विश्लेषण http://java.sun.com/docs/books/tutorial/collections/implementations/set.html पर प्रदान किया गया है

वहां की चर्चा ट्री बनाम हैश प्रश्न के लिए एक दिलचस्प 'मध्यम आधार' दृष्टिकोण को भी इंगित करती है। Java एक LinkedHashSet प्रदान करता है, जो कि एक "सम्मिलन-उन्मुख" लिंक्ड सूची है, जो इसके माध्यम से चल रही है, यानी, लिंक की गई सूची में अंतिम तत्व भी हाल ही में हैश में डाला गया है। यह आपको किसी ट्रीसेट की बढ़ी हुई लागत के बिना एक अनियंत्रित हैश की अनियंत्रितता से बचने की अनुमति देता है।


4

TreeSet दो क्रमबद्ध संग्रह (दूसरे अभिनेता ट्री-मैप) में से एक है। यह एक रेड-ब्लैक ट्री संरचना का उपयोग करता है (लेकिन आप जानते थे कि), और गारंटी देता है कि तत्व प्राकृतिक क्रम के अनुसार आरोही क्रम में होंगे। वैकल्पिक रूप से, आप एक ऐसे कंस्ट्रक्टर के साथ ट्रीसेट का निर्माण कर सकते हैं, जो आपको एक तुलनीय या तुलनात्मक का उपयोग करके आदेश (जो तत्वों के वर्ग द्वारा परिभाषित आदेश पर निर्भर होने के बजाय) होना चाहिए, के लिए अपने स्वयं के नियम देता है।

और A LinkedHashSet , HashSet का एक ऑर्डर किया गया संस्करण है, जो सभी तत्वों में एक डबल -लिंक्ड सूची रखता है। जब आप पुनरावृति क्रम की परवाह करते हैं, तो हैशसेट के बजाय इस वर्ग का उपयोग करें। जब आप किसी HashSet के माध्यम से पुनरावृति करते हैं, तो आदेश अप्रत्याशित होता है, जबकि एक LinkedHashSet आपको उस क्रम में तत्वों के माध्यम से पुनरावृत्त करने देता है जिसमें वे सम्मिलित किए गए थे


3

तकनीकी विचारों, विशेष रूप से प्रदर्शन के आधार पर, बहुत सारे उत्तर दिए गए हैं। मेरे अनुसार, चुनाव TreeSetऔर HashSetमामलों के बीच का चुनाव ।

लेकिन मैं कहूंगा कि चुनाव को पहले वैचारिक विचारों से प्रेरित होना चाहिए ।

यदि, वस्तुओं के लिए आपकी हेरफेर करने की आवश्यकता है, तो एक प्राकृतिक आदेश का कोई मतलब नहीं है, फिर उपयोग न करें TreeSet
यह एक क्रमबद्ध सेट है, क्योंकि यह लागू होता है SortedSet। तो इसका मतलब है कि आपको फ़ंक्शन को ओवरराइड करने की आवश्यकता होगी 0 न केवल तब जब दो ऑब्जेक्ट एक ही छात्र का प्रतिनिधित्व करेंगे, बल्कि यह भी कि जब दो अलग-अलग छात्रों के पास एक ही ग्रेड है। दूसरे मामले के लिए,compareTo , जो कि रिटर्न फ़ंक्शन के अनुरूप होना चाहिए , क्योंकि छात्रों के बीच कोई प्राकृतिक आदेश नहीं है। आप उन्हें उनके औसत ग्रेड द्वारा ऑर्डर कर सकते हैं, ठीक है, लेकिन यह "प्राकृतिक ऑर्डरिंग" नहीं है। समारोहequals । उदाहरण के लिए यदि आपके पास छात्र नामक कक्षा की वस्तुओं का एक सेट है, तो मुझे नहीं लगता कि एTreeSetcompareToequalsगलत हो जाएगा (जब तक कि आप बाद के रिटर्न को सच करने का निर्णय नहीं लेते हैं जब दो अलग-अलग छात्रों के पास एक ही ग्रेड होता है, जो equalsफ़ंक्शन को एक भ्रामक अर्थ देगा, गलत अर्थ कहने के लिए नहीं।)
कृपया इस निरंतरता के बीच ध्यान दें equalsऔर compareToवैकल्पिक है, लेकिन दृढ़ता से। की सिफारिश की। अन्यथा इंटरफ़ेस का अनुबंधSet का टूट गया है, जिससे आपका कोड अन्य लोगों को गुमराह कर रहा है, इस प्रकार संभवतः अप्रत्याशित व्यवहार भी हो सकता है।

यह लिंक इस प्रश्न के बारे में जानकारी का एक अच्छा स्रोत हो सकता है।


3

जब आपके पास संतरे हो सकते हैं तो सेब क्यों है?

गंभीरता से दोस्तों और लड़कियों - यदि आपका संग्रह बड़ा है, पढ़ा है और समय के गजलों के लिए लिखा गया है, और आप सीपीयू चक्रों के लिए भुगतान कर रहे हैं, तो संग्रह का विकल्प केवल तभी प्रासंगिक है जब आप इसे बेहतर प्रदर्शन करने के लिए चाहते हैं। हालांकि, ज्यादातर मामलों में, यह वास्तव में मायने नहीं रखता है - कुछ मिलीसेकंड यहां और वहां मानवीय संदर्भों में किसी का ध्यान नहीं जाता है। यदि यह वास्तव में बहुत मायने रखता है, तो आप कोडांतरक या सी में कोड क्यों नहीं लिख रहे हैं? [क्यू एक और चर्चा]। तो बात यह है कि यदि आपने जो भी संग्रह चुना है, उसका उपयोग करके आप खुश हैं, और यह आपकी समस्या को हल करता है [भले ही यह विशेष रूप से कार्य के लिए सबसे अच्छा प्रकार का संग्रह नहीं है] खुद को बाहर निकालें। सॉफ्टवेयर निंदनीय है। अपना कोड ऑप्टिमाइज़ करें जहाँ आवश्यक हो। अंकल बॉब का कहना है कि प्रीमेच्योर ऑप्टिमाइज़ेशन सभी बुराई की जड़ है। चाचा बॉब ऐसा कहते हैं


1

संदेश संपादित करें ( पूर्ण पुनर्लेखन ) जब आदेश कोई मायने नहीं रखता है, तो वह है। दोनों को लॉग (n) देना चाहिए - यह देखने के लिए उपयोगी होगा कि क्या या तो अन्य की तुलना में पांच प्रतिशत अधिक तेज है। हैशसेट एक लूप में O (1) परीक्षण दे सकता है कि क्या यह पता चलता है।


-3
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class HashTreeSetCompare {

    //It is generally faster to add elements to the HashSet and then
    //convert the collection to a TreeSet for a duplicate-free sorted
    //Traversal.

    //really? 
    O(Hash + tree set) > O(tree set) ??
    Really???? Why?



    public static void main(String args[]) {

        int size = 80000;
        useHashThenTreeSet(size);
        useTreeSetOnly(size);

    }

    private static void useTreeSetOnly(int size) {

        System.out.println("useTreeSetOnly: ");
        long start = System.currentTimeMillis();
        Set<String> sortedSet = new TreeSet<String>();

        for (int i = 0; i < size; i++) {
            sortedSet.add(i + "");
        }

        //System.out.println(sortedSet);
        long end = System.currentTimeMillis();

        System.out.println("useTreeSetOnly: " + (end - start));
    }

    private static void useHashThenTreeSet(int size) {

        System.out.println("useHashThenTreeSet: ");
        long start = System.currentTimeMillis();
        Set<String> set = new HashSet<String>();

        for (int i = 0; i < size; i++) {
            set.add(i + "");
        }

        Set<String> sortedSet = new TreeSet<String>(set);
        //System.out.println(sortedSet);
        long end = System.currentTimeMillis();

        System.out.println("useHashThenTreeSet: " + (end - start));
    }
}

1
पोस्ट में कहा गया है कि आम तौर पर हाशसेट में तत्वों को जोड़ना और फिर संग्रह को डुप्लिकेट-फ्री सॉर्टेड ट्रैवर्सल के लिए ट्रीसेट में बदलना है। सेट करें <string> s = new TreeSet <String> (hashSet); मैं सोच रहा हूं कि सेट क्यों नहीं किया गया <string> s = new TreeSet <String> () सीधे अगर हम जानते हैं कि इसका उपयोग क्रमबद्ध पुनरावृत्ति के लिए किया जाएगा, तो मैंने यह तुलना की और परिणाम दिखाया जो कि तेज है।
gli00001

"किन मामलों में मैं एक ट्रीसेट पर हैशसेट का उपयोग करना चाहूंगा?"
ऑस्टिन हेनले

1
मेरा कहना है, अगर आपको ऑर्डर करने की आवश्यकता है, तो ट्रीसेट को अकेले ही इस्तेमाल करें, सब कुछ हैशसेट में डालने से बेहतर है कि उस हैशसेट के आधार पर ट्रीसेट का निर्माण किया जाए। मुझे मूल पोस्ट से HashSet + TreeSet का मूल्य बिल्कुल नहीं दिखता है।
gli00001

@ gli00001: आप इस बिंदु से चूक गए। यदि आपको हमेशा अपने तत्वों के सेट की आवश्यकता नहीं होती है, लेकिन इसे अक्सर हेरफेर करने जा रहे हैं, तो यह आपके लिए सबसे अधिक समय तक तेजी से संचालन से लाभ के लिए हैशसेट का उपयोग करने के लिए लायक है। के लिए समय-समय पर कई बार जहां क्रम में तत्वों पर कार्रवाई करने की जरूरत है, तो बस एक treeset के साथ रैप। यह आपके उपयोग के मामले पर निर्भर करता है, लेकिन यह बहुत अधिक असामान्य उपयोग का मामला नहीं है (और शायद यह एक ऐसा सेट मानता है जिसमें बहुत सारे तत्व नहीं होते हैं और जटिल आदेश नियमों के साथ होते हैं)।
12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.