ट्रैक
/
Lean
Lean
/
अभ्यास
/
समानांतर अक्षर आवृत्ति
समानांतर अक्षर आवृत्ति

समानांतर अक्षर आवृत्ति

मध्यम

निर्देश

समानांतर गणना की मदद से टेक्स्ट में अक्षरों की आवृत्ति गिनिए।

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

एसिंक्रोनस टास्क

टास्क Lean में एसिंक्रोनस कोड लिखने का मुख्य एब्स्ट्रैक्शन हैं। वे हल्के होते हैं और किसी दूसरे थ्रेड पर समानांतर में, या उसी थ्रेड पर समवर्ती रूप से चल सकते हैं।

टास्क या तो प्योर हो सकते हैं या इम्प्योर। प्योर टास्क Task.spawn से बनाए जाते हैं, जो एक प्योर कंप्यूटेशन लेता है। इम्प्योर टास्क IO कंप्यूटेशन से बनाए जाते हैं, उदाहरण के लिए IO.asTask का उपयोग करके, जो IO मोनाड के अंदर एक IO α को Task α में ले जाता है।

इस अभ्यास में, फंक्शन calculateFrequencies मोनाडिक है, जो IO (Std.TreeMap Char Nat) लौटाता है। यह IO.asTask के ज़रिए इम्प्योर टास्क के उपयोग की अनुमति देता है, और अंतिम वैल्यू लौटाने से पहले बीच के कंप्यूटेशन के लिए प्योर टास्क बनाना भी संभव बनाता है।

डेटा रेस को रोकना

एक फंक्शनल भाषा होने के नाते, Lean में अधिकांश वैल्यू पर्सिस्टेंट होती हैं, यानी अपरिवर्तनीय। ऐसे ऑपरेशन जो किसी वैल्यू को बदलते दिखते हैं, वास्तव में माँगे गए बदलावों के साथ एक नई वैल्यू बनाते हैं। इसका मतलब है कि मेमोरी को अक्सर टास्क के बीच सुरक्षित रूप से साझा किया जा सकता है, बिना डेटा रेस पैदा किए।

ध्यान दीजिए, हालाँकि, सभी डेटा स्ट्रक्चर पर्सिस्टेंट उपयोग के लिए समान रूप से उपयुक्त नहीं होते। उदाहरण के लिए, किसी Array के एक एलिमेंट को बदलने के लिए आम तौर पर पूरे ऐरे की कॉपी करनी पड़ती है। यही बात Std.HashSet और Std.HashMap पर भी लागू होती है।

ऐसे डेटा स्ट्रक्चर को कुशल बनाने के लिए Lean रेफरेंस काउंटिंग का उपयोग करता है। जब तक किसी वैल्यू का एक अद्वितीय रेफरेंस होता है, बदलाव विनाशकारी ढंग से किए जा सकते हैं, जिससे अनावश्यक कॉपी से बचा जाता है।

अन्य डेटा स्ट्रक्चर, जैसे List, Std.TreeSet और Std.TreeMap, आंतरिक रूप से स्ट्रक्चर साझा करने के लिए बनाए गए हैं। जब बदलाव किए जाते हैं, तो वे बिना बदले नोड का दोबारा उपयोग करते हैं, ताकि कई वैल्यू उन नोड के रेफरेंस साझा कर सकें। परिणामस्वरूप, स्ट्रक्चर के एक हिस्से को बदलने के लिए आम तौर पर पूरी वैल्यू की कॉपी नहीं करनी पड़ती। इससे वे टास्क के बीच साझा करने के लिए खास तौर पर उपयुक्त हो जाते हैं।

निष्पादन गति मापना

हर टेस्ट का निष्पादन समय IO.monoNanosNow का उपयोग करके नैनोसेकंड में मापा जाता है और परिणामों के साथ दिखाया जाता है। आप अलग-अलग तरीकों से प्रयोग कर सकते हैं और रनटाइम प्रदर्शन पर उनके प्रभाव की जाँच कर सकते हैं।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Lean Exercism

समानांतर अक्षर आवृत्ति शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Lean को 100 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।

समानांतर अक्षर आवृत्ति को गहराई से जानिए!

हम कंकरेंसी और समानांतरता के बीच के अंतर पर नज़र डालते हैं, और देखते हैं कि JavaScript, Go, Elixir तथा Rust जैसी भाषाएँ कौन-कौन से अलग-अलग तरीके अपनाती हैं।