2012-05-07 20 views
5

मेरे पास एक ऐरेलिस्ट है जिसमें इसमें 17,000 शब्द हैं। मुझे केवल सूची में एक शब्द जोड़ना होगा यदि यह पहले से नहीं है और मुझे सूची के क्रम क्रम को संरक्षित करने की आवश्यकता है। यानी, मुझे इसे अपने वर्णानुक्रमिक सही स्थान में रखना होगा।तारों की पहले से क्रमबद्ध सरणी सूची में स्ट्रिंग डालने का सबसे प्रभावी तरीका क्या है?

मुझे नहीं पता कि इसे सम्मिलित करने के लिए सही जगह कैसे खोजें। मैं यह पता लगाने के लिए एक बाइनरी खोज का उपयोग कर रहा हूं कि शब्द पहले से ही सूची में है या नहीं और अगर यह वहां है या यदि यह नहीं है तो सूचकांक लौटाता है। मैं ArrayList.add (पूर्णांक सूचकांक, ई तत्व) में यह डाल करने के लिए प्रयोग पर योजना बना रहा था।

+1

कृपया अपने प्रश्न के लिए प्रासंगिक भाषा टैग को जोड़ने। –

+0

आप बाइनरी खोज में एक छोटा सा परिवर्तन कर सकते हैं ताकि इसे आइटम के सूचकांक को वापस लौटाया जा सके या अगर यह पाया जाता है तो अगले आइटम की अनुक्रमणिका बड़ी हो सकती है। – trutheality

+0

ये शब्द सभी मामलों में दोहराए गए या अद्वितीय हैं? –

उत्तर

1

binary search मन में आता है, सूची API हालांकि बेहतर

शामिल हो सकता है एक द्विआधारी खोज आप एक के लिए प्राप्त होगा बिंदु जहां आपके पास 2 आइटम शेष हैं, एक ऊपर और एक नीचे, उनमें से एक संभवतः == आपके आइटम पर है। आपके मामले में आपके पास == केस नहीं होगा, इसलिए उच्चतम की अनुक्रमणिका वापस करें और इसकी स्थिति में डालें। मुझे नहीं पता कि जावा में एक ट्यूपल क्लास है या आप कंटेनर बना सकते हैं। किसी भी तरह से, वापसी की तरह कुछ:

(bool, int) binSearch(IList list) 
    returns true, -1 if found 
    returns false, higher of 2 bounds otherwise 

स्पष्ट रूप से इस जावा नहीं है बल्कि यह एक खंड आप द्विआधारी खोज आप अंतिम मान खोजा वापस जाने के लिए इसे संशोधित कर सकता है लिखा था तो

+0

मैं यह पता लगाने के लिए एक बाइनरी खोज का उपयोग कर रहा हूं कि शब्द पहले से ही सूची में है या नहीं और अगर यह वहां है या यदि यह नहीं है तो सूचकांक लौटाता है। – Cooldog117

+0

@ Cooldog117 मेरा उत्तर –

+0

संपादित मैं कक्षा कि निकटतम मान पर सेट किया जाएगा अगर शब्द नहीं मिला था करने के लिए एक चर जोड़ना चाहते थे लेकिन काम की कमी (मेरे प्रोफेसर से) के कारण, मैं एक चर नहीं हो सकता। – Cooldog117

1

कन्वर्ट करने के लिए नहीं है। यह मान या तो मिलान करने वाली स्ट्रिंग या उस स्थान का स्थान हो सकता है जहां इसे डाला जाना चाहिए।

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

0

एक प्रक्रिया को तेज करने के लिए, सामान्य विचार यह है कि अधिक स्मृति का उपयोग करना है, जैसा कि हम सभी जानते हैं। यहां, यह प्रत्येक पत्र के लिए पहले तारों की अनुक्रमणिका हो सकती है। उदाहरण के लिए एक अतिरिक्त ArrayList, छद्म में लिखा:

ArrayList indexes; 
indexes[0] = {"a", 0}; 
indexes[1] = {"b", 123}; 
... 

एक स्ट्रिंग "एक" के साथ शुरू के लिए, आप अनुक्रमित 0-123 के बीच एक द्विआधारी खोज कर सकते हैं।

2

अंतर्निहित binarySearch विधि का उपयोग करें। यदि कुंजी नहीं मिला है, संख्या दी
-(insertionIndex) - 1

+0

लॉल नहीं जोड़ सकते हैं, तो अनुमान लगाएं कि मैं सही था "सूची एपीआई बेहतर हो सकती है"। यह सही जवाब आईएमओ है। –

+0

यही वह है जो मैं अपने उत्तर के साथ कहने की कोशिश कर रहा था, मुझे जावा एपीआई भी नहीं पता है। ऐसा करने का यह सबसे अच्छा तरीका है, जिसके परिणामस्वरूप अन्य डेटा संरचनाओं का उपयोग करने की स्मृति में कमी नहीं होती है। – AaronM

0

है अगर वहाँ दोहराया शब्द नहीं हैं, जैसा कि आप कहते हैं, आप एक trie लागू करने पर विचार कर सकता है। एक ट्राई पर ऑपरेशन डालें, हैश टेबल की तुलना में कुछ तेज है, क्योंकि कोई टकराव नहीं है। खोज के लिए भी यही सच है।

इसके अलावा, सूची के मध्य में एक तत्व डालने के लिए ArrayList में, इसका मतलब तत्वों का आधा हिस्सा या सरणी आकार में वृद्धि करना है, जो कुछ महंगा हो सकता है।

आप उत्सुक हैं, तो आप निम्नलिखित पृष्ठ में एक कार्यान्वयन देख सकते हैं: https://forums.oracle.com/forums/thread.jspa?messageID=8787521

3

में कन्वर्ट ArrayList एक TreeSethttp://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

TreeSet आप के लिए डुप्लिकेट का ख्याल रखना होगा, और शब्द रख वर्णमाला क्रम में।

उदाहरण: (WordList शब्दों का ArrayList है)

TreeSet<String> WordSet = new TreeSet<String>(WordList); 
+1

+1 यदि आप स्ट्रिंग को मान जोड़ना चाहते हैं तो सॉर्ट किए गए मैप के साथ सूची को सॉर्ट करने के लिए जावा भाषा का यह सबसे अच्छा तरीका है। –

+0

एक अतिरिक्त विचार की बात है ... यदि आप सूची को हैशसेट में संग्रहीत करते हैं, और सॉर्ट किए जाने की आवश्यकता होने पर केवल ट्रीसेट में कनवर्ट करते हैं, तो आप प्रोसेसर समय बचाएंगे। ऐसा इसलिए है क्योंकि आप केवल एक बार डेटा को सॉर्ट करते हैं - जब आप ट्रीसेट में कनवर्ट करते हैं। अन्यथा, जब भी आप कोई आइटम जोड़ते हैं तो आप फिर से सॉर्ट कर रहे हैं ... – apnorton

+0

+1; मैं बस यादृच्छिक रूप से ब्राउज़ कर रहा था, और यह देखने के लिए हुआ। आप Arduino साइट पर लड़के हैं, है ना? छोटी सी दुनिया! : पी –