2010-02-28 11 views
6

सी में मेरा कार्यक्रम ++ में करने के लिए एक स्ट्रिंग तुलना करने की आवश्यकता ... कार्यक्रम स्ट्रिंग "foo" मेंसी ++ 200.000 शब्द

उपयोगकर्ता प्रकार के।

मुझे की आवश्यकता है इस स्ट्रिंग को मेरे तारों में, txt फ़ाइलों को लिखने के लिए तुलना करें: यह स्ट्रिंग संज्ञा है! (या विशेषण ...)

मुझे कुछ TXT फ़ाइलें मिलीं - संज्ञाओं के साथ एक फ़ाइल, विशेषण वाले 2-एनडी फ़ाइल ... लेकिन प्रत्येक फ़ाइल में लगभग 200,000 शब्द हैं।

मैं अपनी फ़ाइलों में तारों के साथ इस स्ट्रिंग "foo" की प्रभावी ढंग से तुलना कैसे कर सकता हूं?

मुझे क्या उपयोग करने की आवश्यकता है?

+0

क्या यह होमवर्क है? कृपया इसे टैग करें जैसे कि यह है। –

+0

नहीं, यह कोई होमवर्क नहीं है, इसका सवाल है। – Kate83

+1

एक असली डेटाबेस के बारे में कैसे? आपके द्वारा प्रदान की गई "चश्मा" बहुत ही अपूर्ण लगती हैं ... – none

उत्तर

14

अपने शब्दों को std::set<std::string> कंटेनर में रखें और उन पर एक नज़र डालें। यह एक एक्सेस के लिए ओ (लॉग एन) समय देता है, जो संभवतः आप जो कर रहे हैं उसके लिए पर्याप्त है।

आप std::map<std::string, std::string> का भी उपयोग कर सकते हैं जहां कुंजी शब्द है और मान कक्षा (उदा। "संज्ञा") है।

+0

आप कैसे सोचते हैं, कंटेनरों में 200,000 x 2 शब्द पढ़ते हैं तेज़ होंगे? – Kate83

+3

@ केट: हाँ। 200k कुछ भी नहीं है। –

+0

std :: नक्शा और std :: सेट c.find (key) का उपयोग करते समय कुंजी द्वारा लुकअप के लिए अत्यधिक अनुकूलित किया जाता है (वे आंतरिक रूप से लाल-लाल खोज पेड़ का उपयोग कर सकते हैं)। सही नोड खोजने के लिए केवल कुछ तुलना की आवश्यकता होगी। – Tronic

0

क्या आपको यह पुष्टि करने की आवश्यकता है कि यह किसी भी चीज़ से मेल खाता है या नहीं?

यदि ऐसा है, तो ट्री का उपयोग करें।

+0

मुझे उपयोगकर्ता को बताया जाना चाहिए कि उसका शब्द संज्ञा, विशेषण ... या प्रोग्राम नहीं जानता कि वह शब्द क्या है। – Kate83

+0

फिर दो प्रयासों का उपयोग करें, एक संज्ञा के लिए और एक विशेषण के लिए। – MSalters

15

इसके लिए TRIE डेटा संरचना का उपयोग करें। डेटा संरचना बनाने के लिए आपको कुछ स्मृति की आवश्यकता होनी चाहिए। लेकिन आपका उद्देश्य सबसे कुशल होगा।

+1

धन्यवाद, मैं यह 1-एस कोशिश करूंगा :) – Kate83

+1

ओएमजी ट्राई शानदार है। अफसोस की बात है, यह कुछ ऐसा है जो मैंने इसके लिए काफी कठिन दबाव डाला हो सकता है। –

+0

मैंने इसे सी में 1 99 6 में फिर से शुरू किया। गति भिन्नता ने मेरे मोजे बंद कर दिए (पीसी 486 था)। बहुत ही शांत। यह पहली बार 60 के दशक के उत्तरार्ध में लिखा गया था। पता नहीं था कि एक असली संरचना थी जब तक कि मुझे कुछ साल पहले curous मिला। यदि यह होमवर्क है तो आप वास्तव में अंतर्निहित कार्यों से अधिक शिक्षक को प्रभावित करेंगे। यदि यह काम करता है तो आपके सहकर्मी पहिया को पुनर्जीवित करने में समय बर्बाद करने के लिए मजाक करेंगे! – FastAl

1

मैं आपकी फ़ाइलों के लिए एसक्लाइट का उपयोग करने की अनुशंसा करता हूं।

आप प्रत्येक प्रमुख मानों का सीआरसी बना सकते हैं, और कुंजी और मान (int) को किसी तालिका में संग्रहीत कर सकते हैं। कुंजी फ़ील्ड के लिए एक अनुक्रमणिका बनाएँ।

जब आप एक लुकअप करना चाहते हैं तो आप शब्द का सीआरसी ले सकते हैं, और तालिका में एक लुकअप कर सकते हैं।

+0

क्या प्रत्येक शब्द 1-1 के लिए सीआरसी निर्माण है? यदि नहीं, तो चाबियां टकरा सकती हैं? – bragboy

+1

@ ब्रागाडेस केवल 200,000 कुंजी के साथ आपको लॉटरी जीतने का बेहतर मौका मिलेगा। यदि आप चाहें तो आप सीआरसी -8 का भी उपयोग कर सकते हैं। यदि आप मिलान करते हैं तो आप सभी का चयन कर सकते हैं और स्ट्रिंग तुलना कर सकते हैं, लेकिन 2 शायद कभी मेल नहीं खाएंगे। –

+1

बुरा विचार। सीआरसी -32 के साथ, जन्मदिन टकराव 2^16 = 65536 कुंजी पर होने की संभावना है। 200,000 कुंजी के साथ, एक टकराव लगभग गारंटी है। हां, किसी जोड़ी की टक्कर का मौका 4 बिलियन में केवल 1 है, लेकिन 40,000.000.000 कुंजी जोड़े हैं। – MSalters

1

Radix tree यदि आप सामान्य जड़ें/उपसर्गों के साथ बहुत सारे स्ट्रिंग हैं (जो संभवतः एक शब्द यानी कई रूपों वाले शब्दों के मामले में हैं) - हालांकि यह होगा कि 'नियमित' त्रिभुज की तुलना में तारों के लिए बेहतर स्मृति उपयोग प्रदान करेगा। शायद भाषा पर निर्भर करते हैं)।

0

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

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