मैं आपको आश्वस्त कर सकता हूं, फ़ंक्शन strcmp
असीमित रूप से बाधा नहीं है। आमतौर पर, strcmp अच्छी तरह अनुकूलित है और आर्किटेक्चर के आधार पर 4/8 बाइट्स से अधिक तारों के लिए 32 या 64 बिट तुलना कर सकता है। न्यूलिब और जीएनयू लिबिक दोनों यह करते हैं। लेकिन यहां तक कि यदि आप 20 बार दोनों तारों में प्रत्येक बाइट को देखना चाहते थे, तो इससे कोई फर्क नहीं पड़ता कि अल्गो & डेटा संरचना विकल्प यहां किए गए हैं।
असली बोतल गर्दन ओ (एन) खोज एल्गोरिदम है। फ़ाइल में एक एकल ओ (एन लॉग एन) पास का उपयोग ओ (लॉग एन) लुकअप करने के लिए उचित डेटा संरचना (चाहे यह एक सामान्य बीएसटी, एक ट्राई, या सिर्फ एक सरल सॉर्टेड सरणी है) पर किया जा सकता है।
यहां मेरे साथ भालू - गणित का बहुत कुछ अनुसरण करता है। लेकिन मुझे लगता है कि यह स्पष्ट करने का एक अच्छा अवसर है कि क्यों एल्गोरिदम & डेटा संरचना की पसंद स्ट्रिंग तुलना की विधि से FAR अधिक महत्वपूर्ण होती है। स्टीव इस पर छूता है, लेकिन मैं इसे थोड़ा और गहराई में समझा देना चाहता था।
एन = 1e6 के साथ, लॉग (1e6, 2) = 1 9.9, तो आदर्श डेटा संरचना पर 20 तुलनाओं तक गोल करें।
वर्तमान में आप ओ (एन), या 1e6 संचालन का सबसे खराब मामला खोज कर रहे हैं।
तो कहें कि आप ओ (लॉग एन) सम्मिलन समय के साथ एक लाल-काले पेड़ का निर्माण करते हैं, और आप एन आइटम डालते हैं, यह पेड़ बनाने के लिए ओ (एन लॉग एन) समय है। तो यह आपके पेड़ के निर्माण के लिए आवश्यक 1e6 x 20 या 20e6 संचालन है।
आपके वर्तमान दृष्टिकोण में, डेटा संरचना का निर्माण ओ (एन), या 1e6 संचालन है, लेकिन आपका सबसे खराब केस खोज समय ओ (एन) भी है। तो जब तक आप फ़ाइल पढ़ते हैं और केवल 20 खोज ऑपरेशन करते हैं, तो आप 21,000,000 परिचालनों के सैद्धांतिक सबसे खराब मामले तक पहुंच जाते हैं। तुलनात्मक रूप से, लाल-काले पेड़ और 20 खोजों के साथ आपका सबसे खराब मामला 20,000,400 ऑपरेशंस है, या 99 (9) ऑपरेशन बेल्टर की तुलना में एक अनारक्षित सरणी पर है। तो 20 खोजों पर, आप पहले बिंदु पर हैं जहां एक अधिक परिष्कृत डेटा संरचना वास्तव में भुगतान करती है। लेकिन 1000 खोजों पर क्या होता है:
अनसुलझा सरणी = प्रारंभिक + 1000 x खोज समय = ओ (एन) + 1000 * ओ (एन) = 1,000,000 + 2,000,000,000 = 2,001,000,000 संचालन।
लाल-काला = प्रारंभिकरण + 1000 x खोज समय = ओ (एन लॉग एन) + 1000 * ओ (लॉग एन) = 20,000,000 + 20,000 = 20,020,000 संचालन।
2,001,000,000/20,020,000 ~ = 100x ओ (एन) खोज के लिए कई संचालन के रूप में।
1E6 खोज में है कि (1E6 + 1E6 * 1E6) है/(20e6 + 1E6 * 20) = 25,000x कई आपरेशनों के रूप में।
मान लें कि आपका कंप्यूटर 40e6 'ऑपरेशंस' को संभाल सकता है जो लॉग एन को 1 मिनट में करता है। आपके वर्तमान एल्गोरिदम के साथ एक ही काम करने में 25,000 मिनट या 17 दिन लगेंगे। या देखने का एक और तरीका यह है कि ओ (एन) खोज एल्गोरिदम केवल ओ (लॉग एन) एल्गोरिदम 1,000,000 कर सकता है जब 39 खोजों को संभाल सकता है। और जितनी अधिक खोज आप करते हैं, वह उलझन में आता है।
डेटा संरचनाओं के कई बेहतर विकल्पों के लिए स्टीव और dirkgently से प्रतिक्रिया देखें & एल्गोरिदम। मेरी केवल अतिरिक्त सावधानी होगा कि qsort()
स्टीव ने सुझाव दिया पराक्रम हे की बुरी से बुरी हालत जटिलता (एन * एन) है, जो दूर है, अब तक, हे (एन लॉग ऑन एन) यदि आप एक heapsort या विभिन्न साथ मिल से भी बदतर है वृक्ष की तरह संरचनाएं।
यदि आप लाइनों को क्रमबद्ध कर सकते हैं, तो सुनिश्चित करें। – dbrank0
यदि आप हैश, हैश कर सकते हैं। – wildplasser
@ किंग्स इंडियन: नहीं, क्योंकि यहां असली सवाल "दो स्ट्रिंग्स की तुलना कैसे करें" नहीं है, यह "तारों के बड़े संग्रह में रोकथाम के लिए स्ट्रिंग का परीक्षण कैसे करें" है। –