Διαδρομές
/
Lean
Lean
/
Ασκήσεις
/
Παράλληλη συχνότητα γραμμάτων
Παράλληλη συχνότητα γραμμάτων

Παράλληλη συχνότητα γραμμάτων

Μέτριο

Οδηγίες

Μέτρησε τη συχνότητα των γραμμάτων σε κείμενα χρησιμοποιώντας παράλληλο υπολογισμό.

Ο παραλληλισμός αφορά την εκτέλεση παράλληλα πραγμάτων που μπορούν να γίνουν και σειριακά. Ένα συνηθισμένο παράδειγμα είναι η μέτρηση της συχνότητας των γραμμάτων. Χρησιμοποίησε παραλληλισμό για να υπολογίσεις τη συνολική συχνότητα κάθε γράμματος σε μια λίστα με κείμενα.

Ασύγχρονες εργασίες

Οι εργασίες είναι η κύρια αφαίρεση για τη συγγραφή ασύγχρονου κώδικα στη Lean. Είναι ελαφριές και μπορούν να εκτελεστούν παράλληλα σε άλλο νήμα ή ταυτόχρονα στο ίδιο νήμα.

Οι εργασίες μπορούν να είναι είτε καθαρές είτε μη καθαρές. Οι καθαρές εργασίες δημιουργούνται με Task.spawn, το οποίο δέχεται έναν καθαρό υπολογισμό. Οι μη καθαρές εργασίες δημιουργούνται από υπολογισμούς IO χρησιμοποιώντας, για παράδειγμα, το IO.asTask, το οποίο ανυψώνει ένα IO α σε Task α μέσα στη μονάδα IO.

Σε αυτή την άσκηση, η συνάρτηση calculateFrequencies είναι μοναδιακή, επιστρέφει ένα IO (Std.TreeMap Char Nat). Αυτό επιτρέπει τη χρήση μη καθαρών εργασιών μέσω IO.asTask, και επίσης καθιστά δυνατή τη δημιουργία καθαρών εργασιών για ενδιάμεσους υπολογισμούς πριν από την επιστροφή της τελικής τιμής.

Αποφυγή ανταγωνισμού δεδομένων

Ως συναρτησιακή γλώσσα, οι περισσότερες τιμές στη Lean είναι επίμονες, δηλαδή αμετάβλητες. Οι πράξεις που φαίνεται να τροποποιούν μια τιμή στην πραγματικότητα παράγουν μια νέα τιμή με τις ζητούμενες αλλαγές. Αυτό σημαίνει ότι η μνήμη μπορεί συχνά να μοιράζεται με ασφάλεια μεταξύ εργασιών χωρίς να προκαλούνται ανταγωνισμοί δεδομένων.

Σημείωσε, ωστόσο, ότι δεν είναι όλες οι δομές δεδομένων εξίσου κατάλληλες για επίμονη χρήση. Για παράδειγμα, η ενημέρωση ενός μεμονωμένου στοιχείου ενός Array απαιτεί συνήθως την αντιγραφή ολόκληρου του πίνακα. Το ίδιο ισχύει για τα Std.HashSet και Std.HashMap.

Για να κάνει τέτοιες δομές δεδομένων αποδοτικές, η Lean χρησιμοποιεί μέτρηση αναφορών. Όσο μια τιμή έχει μοναδική αναφορά, οι ενημερώσεις μπορούν να εκτελούνται καταστροφικά, αποφεύγοντας περιττές αντιγραφές.

Άλλες δομές δεδομένων, όπως οι List, Std.TreeSet και Std.TreeMap, είναι σχεδιασμένες να μοιράζονται εσωτερικά τη δομή τους. Επαναχρησιμοποιούν αμετάβλητους κόμβους όταν γίνονται ενημερώσεις, έτσι ώστε πολλαπλές τιμές να μπορούν να μοιράζονται αναφορές σε αυτούς τους κόμβους. Ως αποτέλεσμα, η τροποποίηση ενός μέρους της δομής συνήθως δεν απαιτεί την αντιγραφή ολόκληρης της τιμής. Αυτό τις κάνει ιδιαίτερα κατάλληλες για κοινή χρήση μεταξύ εργασιών.

Μέτρηση ταχύτητας εκτέλεσης

Ο χρόνος εκτέλεσης κάθε test μετριέται σε νανοδευτερόλεπτα χρησιμοποιώντας το IO.monoNanosNow και εμφανίζεται δίπλα στα αποτελέσματα. Μπορείς να πειραματιστείς με διαφορετικές προσεγγίσεις και να ελέγξεις τον αντίκτυπό τους στην απόδοση κατά την εκτέλεση.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Lean Exercism

Έτοιμος να ξεκινήσεις την άσκηση Παράλληλη συχνότητα γραμμάτων;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Lean με 100 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.

Αναλυτική ματιά στο Παράλληλη συχνότητα γραμμάτων!

Εξερευνούμε τις διαφορές ανάμεσα στον ταυτοχρονισμό και τον παραλληλισμό, εξετάζοντας διαφορετικές προσεγγίσεις που ακολουθούν γλώσσες όπως η JavaScript, η Go, η Elixir και η Rust.