2012-07-20 13 views
7

मैं एक आईओएस ऐप के लिए एक तरह का स्वत: पूर्ण कार्यान्वित कर रहा हूं। डेटा जो मैं स्वत: पूर्ण मानों के लिए उपयोग कर रहा हूं वह लगभग 100,000 तारों वाला अल्पविराम से अलग टेक्स्ट फ़ाइल है। यह अब मैं क्या कर रहा हूँ है:उद्देश्य-सी में तारों के माध्यम से खोज करने का सबसे तेज़ तरीका क्या है?

  1. पाठ फ़ाइल पढ़ें, और 100000 NSString के साथ एक NSArray पैदा करते हैं।
  2. उपयोगकर्ता प्रकार के रूप में, [array containsObject:text]

निश्चित रूप से वहाँ एक बेहतर/तेजी से इस देखने करने के लिए जिस तरह से है। कोई विचार?

+0

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

+0

यदि आपको ऑर्डर करने की आवश्यकता नहीं है तो मुझे लगता है कि यह जांचते समय सेट तेज होते हैं कि इसमें कोई ऑब्जेक्ट है या नहीं। यह अभी भी तारों के लिए अनुकूलित नहीं है।आपको शायद बाइनरी पेड़ जैसी चीजों को देखना चाहिए। यदि आपको कस्टम कोड बनाने की आवश्यकता है तो सामान्य दृष्टिकोण समान होगा चाहे आप जिस मंच/भाषा के साथ काम कर रहे हों। –

+0

* हमेशा * एक तेज़ तरीका है। क्या आप अपने यूआई में अंतराल देख रहे हैं, यद्यपि? मैंने निष्क्रिय खोज एल्गोरिदम के बावजूद स्वत: पूर्ण (एक छोटी इनपुट सरणी के साथ) के लिए एक ही चीज़ की है और कोई दृश्य अंतराल नहीं था। उद्देश्य-सी को इंगित करने के लिए – kubi

उत्तर

19

बिल्कुल, वहाँ है! यह "उद्देश्य-सी" में नहीं है हालांकि: सबसे अधिक संभावना है, आपको इसे स्वयं कोड करना होगा।

विचार स्ट्रिंग की अपनी सूची को suffix tree में परिवर्तित करना है, एक डेटा संरचना जो आपको उपसर्ग द्वारा बहुत तेज़ी से खोज करने देती है। एक प्रत्यय पेड़ में संभव समापन के लिए खोज बहुत तेज़ हैं, लेकिन संरचना स्वयं निर्माण करना आसान नहीं है। इंटरनेट पर एक त्वरित खोज से पता चला कि उद्देश्य सी में कोई आसानी से उपलब्ध कार्यान्वयन नहीं है, लेकिन आप port an implementationin another language, use a C implementation, या यहां तक ​​कि यदि आप विशेष रूप से समय के लिए दबाए नहीं जाते हैं तो खुद को भी लिख सकते हैं।

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

+2

+1 सी है और आपको प्रदर्शन गहन कार्यों को देखते समय सी को छोड़ने से डरना नहीं चाहिए :) मैं द्विआधारी पेड़ भी दूंगा जो शायद लागू करने के लिए सबसे आसान है। – Taum

+0

+1 बस अपने उत्तर – Omarj

+1

एनडीटीरी (https://github.com/nathanday/ndtrie) और पीजेटीर्नरीशर्चट्री (https://github.com/peakji/PJTernarySearchTree) को ऑब्जेक्टिव-सी में ठीक है! –

2

शायद सबसे आसान बाइनरी खोज है। -[NSArray indexOfObject:inSortedRange:options:usingComparator:] देखें।

  • आप सरणी, संभवतः @selector(compare:) लोड करते हैं (यदि आप इसके बारे में चिंतित हैं कि आप फ़ाइल को बचाने के

    • पूर्व प्रकार सरणी:

      विशेष रूप से, मैं कुछ इस तरह की कोशिश करता हूँ गलती से छोड़े जा रहे हैं या कुछ किनारे के मामलों के लिए यूनिकोड सॉर्ट ऑर्डर बदल रहा है)। यह लगभग ओ (एन) होना चाहिए मानना ​​है कि सरणी ज्यादातर पहले से ही क्रमबद्ध है।

    • पहला संभावित मिलान खोजने के लिए, [array indexOfObject:searchString inSortedRange:(NSRange){0,[array count]} options:NSBinarySearchingInsertionIndex|NSBinarySearchingFirstEqual usingComparator:@selector(compare:)]
    • सरणी को तब तक चलाएं जब तक कि प्रविष्टियों में कोई उपसर्ग के रूप में खोज न हो। ,

    यह नहीं "सही ढंग से" सभी स्थानों संभाल सकता है (विशेष रूप से तुर्की) (NSWidthInsensitiveSearch | NSCaseInsensitiveSearch | | NSDiacriticInsensitiveSearch NSAnchoredSearch) आप शायद मामले/विशेषक/चौड़ाई-संवेदी तुलना करने के लिए निर्धारित करने के लिए यह एक उपसर्ग है कि क्या चाहते हैं लेकिन न तो compare:localizedCompare: के साथ बदल देगा, न ही स्ट्रिंग-फोल्डिंग भंग करेगा। (यह केवल 9 लाइन लंबी है, लेकिन सही होने के लिए लगभग एक दिन का समय लगता है और इसमें लगभग 40 लाइन कोड और 200 लाइनों की परीक्षा है, इसलिए मुझे शायद इसे यहां साझा नहीं करना चाहिए।)

  • संबंधित मुद्दे

     संबंधित मुद्दे