ओ (एन) जटिलता में आदेश के साथ शब्द आवृत्ति


11

एक जावा डेवलपर स्थिति के लिए एक साक्षात्कार के दौरान, मुझे निम्नलिखित पूछा गया था:

एक ऐसा कार्य लिखें, जिसमें दो परास हों:

  1. एक स्ट्रिंग एक पाठ दस्तावेज़ का प्रतिनिधित्व करता है और
  2. लौटने के लिए मदों की संख्या प्रदान करने वाला पूर्णांक।

फ़ंक्शन को ऐसे कार्यान्वित करें कि यह शब्द आवृत्ति द्वारा आदेशित स्ट्रिंग्स की सूची लौटाता है, सबसे पहले होने वाला शब्द। आपका समाधान समय में चलना चाहिए जहां दस्तावेज़ में वर्णों की संख्या है।हे(n)n

निम्नलिखित वह है जो मैंने उत्तर दिया (छद्मकोश में), यह नहीं है, बल्कि इस प्रकार के कारण समय है। मैं यह पता नहीं लगा सकता कि यह कैसे करना है समय। हे(n)हे(nलॉगn)हे(n)

wordFrequencyMap = new HashMap<String, Integer>();
words = inputString.split(' ');

for (String word : words) {
  count = wordFrequencyMap.get(word);
  count = (count == null) ? 1 : ++count;
  wordFrequencyMap.put(word, count);
}

return wordFrequencyMap.sortByValue.keys

क्या कोई जानता है या कोई मुझे कुछ संकेत दे सकता है?


1
हैश टेबल का उपयोग करें।
युवल फिल्मस

हैशटेबल का उपयोग करने से समस्या हल नहीं होती है। इसके अलावा, हैशटेबल जावा है।
user2712937

हैश टेबल आमतौर पर जटिलता को नीचे लाने की चाल है हे(nलॉगn) सेवा हे(n)। भले ही वे विरासत जावा, जो भी इसका मतलब है। मैंने इस विशेष मामले की जाँच नहीं की है, इसलिए आप सही हो सकते हैं।
युवल फिल्मस

@YuvalFilmus। धन्यवाद, लेकिन हैश तालिका बहुत हद तक हैश मैप के समान है, जिसे मैं पहले से ही उपयोग कर रहा हूं (2 डेटा संरचना के बीच प्रमुख अंतर सिंक्रनाइज़ेशन है, जो यहां लागू नहीं होता है)। मेरा लॉग (n) हैश मानचित्र में मानों को छाँटने से आता है।
user2712937

3
वैसे, यह साइट अवधारणाओं और एल्गोरिदम पर केंद्रित है, कोड पर नहीं। इसलिए, आमतौर पर हम आपसे जावा कोड को हटाने और अपने दृष्टिकोण का एक वैचारिक विवरण देने के लिए कहेंगे (संभवतः यदि आवश्यक हो तो उच्च-स्तरीय छद्म कोड के साथ)। इसके अलावा, इस साइट पर प्रासंगिक सवाल यह है कि डेटा संरचनाओं और एल्गोरिदम का उपयोग क्या है; विशिष्ट जावा एपीआई इस साइट के लिए ऑफ-टॉपिक है (लेकिन आप स्टैकऑवरफ्लो पर इसके बारे में पूछ सकते हैं), और इसी तरह, Hashtableइस साइट के उद्देश्यों के लिए विरासत जावा या नहीं वास्तव में अप्रासंगिक है।
DW

जवाबों:


10

मैं वितरण गिनती का एक प्रकार सुझाता हूं:

  1. पाठ पढ़ें और प्रत्येक शब्द को एक त्रि में सम्मिलित करें , प्रत्येक नोड में एक गिनती बनाए रखते हुए, इस नोड द्वारा दर्शाए गए शब्द को कितनी बार देखा गया है। इसके अतिरिक्त सर्वोच्च शब्द गणना का कहना है कि ट्रैक रखें maxWordCound। -हे(n)
  2. आकार की एक सरणी प्रारंभ करें maxWordCount। प्रवेश प्रकार तार की सूची है। -हे(n), क्योंकि गिनती अधिक नहीं हो सकती।
  3. तीनों को पार करें और प्रत्येक नोड के लिए गिनती द्वारा इंगित सरणी प्रविष्टि में संबंधित स्ट्रिंग जोड़ें। -हे(n), क्योंकि तार की कुल लंबाई से घिरा हुआ है n
  4. सरणी को अवरोही क्रम में पार करें और वांछित संख्याओं को आउटपुट करें। -हे(n), क्योंकि यह सरणी में डेटा के आकार और मात्रा दोनों पर एक बाध्य है।

आप संभवतः पहले चरण में अन्य डेटा संरचनाओं द्वारा त्रि को प्रतिस्थापित कर सकते हैं।


+1, हालाँकि मैं इस बारे में निश्चित नहीं हूँ। यह O (n) है क्योंकि लौटने के लिए शब्दों की संख्या n, वर्णों की संख्या से बंधी है, लेकिन क्या यह सवाल है? या लौटे शब्दों की संख्या से स्वतंत्र परिणाम?
निकोस एम।

@NikosM। यह है ;nएक सामान्य रूप से सबसे खराब स्थिति है, लौटे हुए शब्दों की संख्या पर ऊपरी बाध्य, आवश्यक नहीं कि धारणाएं।
राफेल

@ राफेल, ये सही है मैं इस बारे में सोच रहा हूं क्योंकि यह एक साक्षात्कार में पूछा गया था, प्रश्न में संभावित चाल ..
निकोस एम।

मैं सोच रहा था कि क्या कोई अंतरिक्ष कुशल रैखिक समय एल्गोरिथ्म है।
सादतमी

3
@ असदता, हाँ, यह एक दिलचस्प सवाल है। एक अलग प्रश्न के रूप में अलग-अलग पोस्ट करने के लायक हो सकता है। यह केवल अंतरिक्ष दक्षता नहीं है; trie सॉल्यूशन भी पॉइंटर-इंटेंसिव है, जो इसे व्यवहार में धीमा बना सकता है (वास्तविक फोन में मेमोरी पदानुक्रम कैसे काम करता है)। "दक्षता" सबसे खराब स्थिति के चलने के समय से अलग है। यह एक साफ के लिए असामान्य नहीं हैO(nlgn) एक पॉइंटर-इंटेंसिव को हरा करने के लिए समय एल्गोरिथ्म O(n)समय एल्गोरिथ्म, इसलिए यह प्रश्न पहले से ही कुछ संभावित एल्गोरिदम पर शासन कर रहा है जो अभ्यास में बेहतर विकल्प हो सकता है।
DW

3

घटना संख्याओं का जमाव O (n) है, इसलिए यह चाल वास्तव में केवल शीर्ष k की घटना की गणना है।

शीर्ष k मानों को एकत्रित करने के लिए ढेर एक सामान्य तरीका है, हालांकि अन्य तरीकों का उपयोग किया जा सकता है (देखें https://en.wikipedia.org/wiki/Partial_sorting )।

मान लिया जाए कि k ऊपर दूसरा परम है, और यह समस्या कथन में एक स्थिर है (ऐसा प्रतीत होता है):

  1. प्रत्येक नोड पर होने वाली घटनाओं के साथ शब्दों का एक समूह बनाएँ।
  2. आकार के ढेर का प्रारंभ करें k।
  3. त्रिकोणीय और न्यूनतम-जांच को पार करें / शीर्ष-के ढेर में प्रत्येक (पत्ती, घटना-गणना) जोड़ी डालें।
  4. शीर्ष k के पत्तों और काउंट्स को आउटपुट करें (यह वास्तव में एक तरह का दर्द है क्योंकि आपको प्रत्येक पत्ते को एक शब्द में मैप करने के लिए पेरेंट पॉइंटर्स की आवश्यकता होती है)।

चूंकि ढेर का आकार एक स्थिर है, इसलिए ढेर के संचालन ओ (1) हैं, इसलिए चरण 3 ओ (एन) है।

तिकड़ी के निर्माण के दौरान ढेर को गतिशील रूप से बनाए रखा जा सकता है।


2

आपका एल्गोरिथ्म भी समय पर नहीं चलता है हे(nलॉगn); डालनेΘ(n) एक हैशटेब में चीजें समय खर्च होती हैं Ω(n2) पहले से ही (सबसे खराब स्थिति)।


जो गलत है ; मैं इसे यहाँ उस समय के लिए छोड़ रहा हूँ जब मैं उदाहरण के लिए जा रहा हूँ।

निम्न एल्गोरिथ्म सबसे खराब स्थिति में चलता है हे(n) (एक वर्णमाला मानकर Σ निरंतर आकार), n पाठ में वर्णों की संख्या।

  1. उकोकोन के एल्गोरिथ्म के साथ, उदाहरण के लिए, पाठ के एक प्रत्यय के पेड़ का निर्माण करें ।

    यदि निर्माण पहले से ही ऐसा नहीं करता है, तो प्रत्येक (आंतरिक) नोड में पहुंच योग्य पत्तियों की संख्या जोड़ें।

  2. पेड़ को जड़ से उखाड़ें और पहले (सफेद) स्थान पर सभी शाखाओं को काट दें।

  3. पेड़ को पीछे छोड़ें और प्रत्येक पत्ती के बच्चों की सूची को उनके पत्तों की गिनती द्वारा क्रमबद्ध करें।

  4. पेड़ की पैदावार (बाएं से दाएं की ओर) अब आवृत्ति द्वारा क्रमबद्ध सभी शब्दों की एक सूची है।

रनटाइम के बारे में:

  1. उकोनेन का एल्गोरिथ्म (इसके बढ़ाया रूप में) समय में चलता है हे(n); पत्ती की गिनती बनाए रखने से वृद्धि नहीं होती हैΘएल्गोरिथ्म के -ost।
  2. हमें पाठ में होने वाले प्रत्येक शब्द के एक-एक नोड को बदलना होगा। चूंकि ज्यादातर हैंn विभिन्न शब्द-वर्ण जोड़े, हम सबसे मिलते हैं n नोड्स।
  3. हम सबसे मिलते हैं n नोड्स (cf 2.) और समय व्यतीत करें हे(|Σ|लॉग|Σ|)=हे(1) प्रति नोड।
  4. हम उपज प्राप्त कर सकते हैं (जिसका आकार निश्चित है हे(n)) समय में एक साधारण ट्रावेल द्वारा हे(n) (सीएफ 2.)।

अधिक सटीक सीमाएं विभिन्न शब्दों की संख्या के साथ पैरामीट्राइजिंग रनटाइम द्वारा प्राप्त की जा सकती हैं; यदि कुछ हैं, तो पेड़ 2 के बाद छोटा है।


एल्गोरिथ्म गलत है (यह सॉर्ट नहीं करता है)। मुझे अब यकीन नहीं है कि रैखिक समय भी संभव है।
राफेल

1

HashMapसभी शब्दों और उनकी आवृत्तियों को इकट्ठा करने के लिए हैश टेबल (जैसे ) का उपयोग करें । फिर, घटती आवृत्ति के क्रम में शब्दों को क्रमबद्ध करने के लिए गिनती के प्रकार का उपयोग करें । चूंकि सभी फ्रीक्वेंसी रेंज में पूर्णांक हैं1 ..n, गिनती की तरह लेता है हे(n)समय। कुल अपेक्षित समय चल रहा हैहे(n), जो सभी व्यावहारिक उद्देश्यों के लिए पर्याप्त से अधिक होने की संभावना से अधिक है (जब तक कि साक्षात्कारकर्ता ने आपके प्रश्न से बचे हुए कुछ का उल्लेख नहीं किया है)। कि इस है उल्लेख करना सुनिश्चित करें की उम्मीद समय के बजाय चल बुरी से बुरी हालत चलने का समय।

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

या, यदि आप इसे थोड़ा सुरक्षित खेलना चाहते हैं, तो जवाब देने से पहले, पहले पूछें "क्या आप अपेक्षित अंतर के बारे में परवाह करते हैं हे(n) समय और सबसे खराब मामला चल रहा है हे(n)समय से चल रहा है? "। तो फिर आपका जवाब दर्जी तदनुसार। पूछने के लिए साक्षात्कारकर्ता के लिए तैयार रहें आप , आप कैसे चुनते हैं व्यवहार में। (यदि हां, तो स्कोर! यही कारण है कि एक सवाल आप बॉलपार्क से बाहर हिट करने के लिए सक्षम होना चाहिए है।)


भंडारण Θ(n) हैशटेब में चीजें लेता है Ω(n2)पहले से ही सबसे खराब स्थिति में समय।
राफेल

मैं साक्षात्कारकर्ताओं के लिए बात नहीं कर सकता, लेकिन मैं उनके अधिक के लिए बहाने के रूप में उनके फूहड़पन का उपयोग करने में संकोच कर रहा हूं। इसके अलावा, यह साइट विज्ञान के बारे में है (जैसा कि आपने खुद ऊपर टिप्पणी की है), हाथ से लहराते हुए "मैं कैसे जल्दी भुगतान किया जाएगा" प्रोग्रामिंग चाल के बारे में नहीं।
राफेल

जब तक यह समझ स्पष्ट की जाती है, मैं इसके साथ ठीक हूं। मैंने यहाँ बहुत सारे प्रश्न देखे हैं जो भ्रम में स्थापित किए गए थे क्योंकि कुछ निहितार्थ "समझ" ने गलत विचारों को बढ़ावा दिया।
राफेल

0

हैशटेबल आधारित समाधान

निश्चित नहीं है कि हैशटेबल जटिलता क्यों बनाता है Ω(n2) अगर nवर्णों की संख्या है (शब्द नहीं)।

यदि आप दस्तावेज़ में प्रत्येक वर्ण के माध्यम से पुनरावृत्ति करते हैं और जैसा कि आप पुनरावृत्ति कर रहे हैं, शब्द के हैशकोड की गणना करें, तो आप गुजर गए होंगे nपात्र। यही है, जैसे ही एक पत्र का सामना होता है, शब्द शुरू होता है, इसलिए शब्द समाप्त होने तक हैश की गणना करना शुरू करें (विराम चिह्न के लिए कुछ विशेष मामले हैं लेकिन वे जटिलता को प्रभावित नहीं करते हैं)। हर शब्द के लिए, एक बार हैश की गणना करने के बाद, इसे हैशटेबल में जोड़ें। यह हर शब्द पर दो बार जाने से बचने के लिए है, यानी पहले दस्तावेज़ के माध्यम से शब्दों को खोजने के लिए पुनरावृति करना और फिर उन्हें हैशटेबल में डालना, हालांकि उस मामले में जटिलता भी हो सकती हैΩ(n)

हैशटेबल में टकराव निश्चित रूप से एक समस्या है, और यह निर्भर करता है कि मूल हैशटेबल कितना बड़ा था और हैशिंग एल्गोरिथ्म कितना अच्छा है, एक करीब पहुंच सकता है हे(1) प्रविष्टि के लिए और मायने रखता है और इस प्रकार हे(n)एल्गोरिथ्म के लिए, हालांकि स्मृति की कीमत पर। हालाँकि, मैं अभी भी सराहना नहीं कर सकता कि कैसे सबसे खराब मामला होने का दावा किया जा सकता हैहे(n2) अगर n वर्णों की संख्या है।

धारणा है कि वर्णों की संख्या के संबंध में हैशिंग एल्गोरिथ्म समय में रैखिक है।

मूलांक सॉर्ट आधारित समाधान

वैकल्पिक रूप से, अंग्रेजी को मानते हुए, क्योंकि शब्दों की लंबाई अच्छी तरह से ज्ञात है, मैं इसके बजाय एक ग्रिड बनाऊंगा और मूलांक लागू करूंगा जो है हे(एन) कहाँ पे अंग्रेजी भाषा में एक शब्द की अधिकतम लंबाई होगी, और एनशब्दों की कुल संख्या है। दिया हुआn दस्तावेज़ में वर्णों की संख्या है, और एक स्थिर, asymptotically यह मात्रा है हे(n)

अब प्रत्येक शब्द की आवृत्ति गिनें। चूंकि शब्द छांटे गए हैं, हम प्रत्येक शब्द की तुलना उसके पूर्ववर्ती शब्द से करेंगे, यह देखने के लिए कि क्या यह एक ही है या अलग है। यदि यह समान है, तो हम शब्द को हटाते हैं और पिछले में एक गिनती जोड़ते हैं। यदि अलग है, तो बस गिनती 1 बनाएं और आगे बढ़ें। ये आवश्यक2n तुलना कहाँ n वर्णों की संख्या है, और इस प्रकार हे(n) एक पूरे के रूप में जटिलता में।

अंग्रेजी के शीर्ष कुछ सबसे लंबे शब्द हास्यास्पद रूप से लंबे होते हैं , लेकिन तब व्यक्ति शब्द की लंबाई को उचित संख्या (जैसे कि 30 या उससे छोटे) पर काट सकता है और ट्रंकट शब्दों को त्रुटि का मार्जिन स्वीकार कर सकता है जो इसके साथ आ सकते हैं।


(१) चूँकि अधिकांश ग्रंथों में शब्दों की अधिकतम लंबाई एक स्थिर से बंधी होती है, इसलिए शब्दों की संख्या होती है Θ(n)भी। (२) हैश फ़ंक्शन के आधार पर, शब्द पढ़ते समय मक्खी पर हैश की गणना करना संभव नहीं हो सकता है। (3) सबसे खराब स्थिति में, सभी शब्द तालिका में एक ही स्थान पर हैश, सम्मिलित और लुकअप बनाते हैंΘ(n)
फ्रैंकडब्ल्यू

हाय फ्रैंकडब्ल्यू। (२) मैं कह रहा हूँ कि हम फंक्शन (यानी एक रोलिंग हैश) चुन सकते हैं जिसे हम मक्खी पर गणना कर सकते हैं। यदि नहीं, तो भी समग्र जटिलता तब तक नहीं बदलती है जब तक हैशिंग रैखिक समय है, क्योंकि पढ़ना और हैशिंग होगाहे(n+n)संचालन। (3) बेशक, लेकिन वह एल्गोरिथम की पसंद पर फिर से निर्भर करता है। कई एल्गोरिदम हैं जो शब्दों को अलग करने पर काफी बेहतर करते हैं। उसी शब्द के लिए, आप केवल एक प्रविष्टि पर गिनती बढ़ाते हैं। सादृश्य के रूप में, जब मुझे एक छँटाई एल्गोरिथ्म चुनना होगा, तो सबसे खराब स्थिति हो सकती हैहे(n2)लेकिन मैं आम तौर पर बेहतर :-) :-)
उमर इकबाल

(3) जो भी हैश फ़ंक्शन आप चुनते हैं, मैं एक इनपुट के साथ आ सकता हूं, जहां वह विशिष्ट फ़ंक्शन ख़राब होता है। और इनपुट जानने के बाद हैश फ़ंक्शन चुनना आमतौर पर एक विकल्प नहीं है। (और याद रखें कि आप जिस टिप्पणी को संभवत: संबोधित कर रहे थे वह सबसे खराब स्थिति के बारे में थी, विशिष्ट मामले के बारे में नहीं।)
फ्रैंकडब्ल्यू

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

साधारण हैश टेबल आवेषण हैं हे(n2)क्योंकि टकराव के लिए वस्तु को अन्यत्र रखा जाना चाहिए। यहां, हमें डुप्लिकेट सम्मिलित करने की आवश्यकता नहीं है। 1) एक ही शब्द दोहराता है: फिर गिनती करें, यह होने की गारंटी हैहे(1)प्लस हैशिंग समय। 2) अलग-अलग शब्द एक ही हैश: यही वह जगह है जहाँ हैश कितना अच्छा / बुरा है, और यदि टेबल का आकार सिर्फ छोटा है, तो यह सवाल है। मैं मानता हूंΩ(1), लेकिन विकल्पों के आधार पर मैंने यह भी कहा कि "कोई भी निकट आ सकता हैहे(1) सम्मिलन के लिए और मायने रखता है "। हम चर्चा कर सकते हैं कि टेबल का आकार और कार्य क्या है जो हमें करीब ला सकता है हे(1)
ओमर इकबाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.