πώς να είσαι μηχανικός αλγορίθμου


Απάντηση 1:

Κατ 'αρχάς, επιτρέψτε μου να σας συγχαρώ για το ότι θέλετε να βελτιώσετε τη γνώση των αλγορίθμων, ώστε να γίνετε καλύτερος μηχανικός λογισμικού. Όπως έχω δει πάρα πολύ συχνά - στο Quora και αλλού - ορισμένοι πιστεύουν ότι η μηχανική λογισμικού προγραμματίζει απλώς χωρίς να χρειάζεται να μάθει τεχνικές επίλυσης προβλημάτων.

Εάν θέλετε να γίνετε γκουρού σε αλγόριθμους, τότε πρέπει να μάθετε για την περιοχή στο σημείο που μπορείτε να την διδάξετε. Σε τελική ανάλυση, ο γκουρού σημαίνει δάσκαλος ή δάσκαλος, και τίποτα δεν σας βοηθά να κυριαρχήσετε ένα θέμα όπως να το διδάξετε. Συνιστώ να ξεκινήσετε μικρά. Επιλέξτε έναν αλγόριθμο ή μερικούς σχετικούς αλγόριθμους (ίσως μερικούς αλγόριθμους ταξινόμησης) και προσπαθήστε να τους διδάξετε σε κάποιον. Με αυτόν τον τρόπο, θα έχετε μια βαθύτερη κατανόηση αυτών των αλγορίθμων. Φυσικά, θα πρέπει να εξηγείτε όχι μόνο τους αλγόριθμους, αλλά γιατί λειτουργούν και πόσο γρήγορα τρέχουν (δηλαδή, ασυμπτωτική ανάλυση). Μπορεί να σκοντάψετε, αλλά αυτό είναι εντάξει. Πολλοί άνθρωποι που έγιναν καλοί δάσκαλοι δεν ήταν απαλοί στην αρχή. Συνεχίστε να προσπαθείτε μέχρι να εξηγήσετε καλά τους αλγόριθμους. σε αυτό το σημείο θα τα καταλάβετε.

Στη συνέχεια, δοκιμάστε ξανά με διαφορετικούς αλγόριθμους. Κάντε το μερικές φορές μέχρι να φτάσετε στο σημείο όπου είστε πραγματικά σίγουροι για την κατανόηση των αλγορίθμων. Σε αυτό το σημείο, θα ξέρετε αν κατανοείτε τους αλγόριθμους. Μόλις καταλάβετε αν καταλαβαίνετε πραγματικά το υλικό, θα είστε στο δρόμο για να γίνετε γκουρού.

Αλλά δεν είναι όλο αυτό. Θα πρέπει επίσης να μπορείτε να βρείτε μόνοι σας αλγόριθμους. Δεδομένου ότι μου ζητήσατε συγκεκριμένα να απαντήσω στην ερώτησή σας, θα υποθέσω ότι γνωρίζετε

Εισαγωγή στους αλγόριθμους

. Για την τρίτη έκδοση, διαθέσαμε δημόσια απαντήσεις σε επιλεγμένες ασκήσεις και προβλήματα. μπορείτε να τα βρείτε

εδώ.

Δοκιμάστε να λύσετε αυτές τις ασκήσεις και προβλήματα χωρίς να κοιτάξετε τις λύσεις μας. Στη συνέχεια, συγκρίνετε τις λύσεις σας με τη δική μας.

Σας εύχομαι επιτυχία στο να γίνετε αλγόριθμοι γκουρού!


Απάντηση 2:

Αν το σκεφτείτε

Η ταξονομία του Bloom

στον γνωστικό τομέα, θα συνειδητοποιήσετε ότι οι αλγόριθμοι που προκύπτουν απαιτούν "

σύνθεση

"

Σύνθεση

είναι το δεύτερο υψηλότερο επίπεδο στην ταξινομία, που σημαίνει ότι προέρχεται φυσικά μετά από όλα πριν:

Η γνώση

,

Κατανόηση

,

Εφαρμογή

, και

Ανάλυση

.

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

Τι περιλαμβάνει η ανάλυση; Σύμφωνα με τη Βικιπαίδεια, απαιτείται να αρχίσετε να "σπάζετε πληροφορίες σε τμήματα εντοπίζοντας κίνητρα ή αιτίες". Το έχετε κάνει με συγχώνευση; Ξέρετε γιατί χωρίζουμε επανειλημμένα την αρχική λίστα σε δύο μέρη; Έχετε σκεφτεί γιατί οι ενέργειες της ταξινόμησης συγχώνευσης οδηγούν σε χρόνο εκτέλεσης O (nlgn); Καταλαβαίνετε γιατί πρέπει να συγχωνεύσετε κάθε δευτερεύουσα λίστα σε ομάδες των δύο; Έχετε αναλύσει ποιες ιδιότητες ισχύουν σε κάθε σημείο του αλγορίθμου; Ξέρετε γιατί αυτές οι ιδιότητες πρέπει να ισχύουν; Η Wikipedia λέει ότι με την ανάλυση θα πρέπει να λάβετε υπόψη στοιχεία, σχέσεις και οργανωτικές αρχές. Μόλις αναλύσετε κάτι, θα είστε καλύτερα προετοιμασμένοι να συνθέσετε.

Θα είστε καλύτερα προετοιμασμένοι να συνθέσετε γιατί θα καταλάβετε γιατί ο John Von Neumann σχεδίασε τη συγχώνευση όπως έκανε. Μόλις καταλάβετε τα κίνητρα του σχεδιασμού του, θα είστε καλύτερα εξοπλισμένοι για να τροποποιήσετε τον αλγόριθμο για να ικανοποιήσετε τις μεταβαλλόμενες απαιτήσεις.

Και αυτό είναι το κλειδί για την επίλυση προβλημάτων αλγορίθμου. Αρχικά αποκτάτε γνώση για πράγματα όπως δομές δεδομένων / αλγόριθμοι / παραδείγματα / ανάλυση χρόνου εκτέλεσης / αποδείξεις / κ.λπ. Στη συνέχεια, ξοδεύετε χρόνο για να κατανοήσετε πώς λειτουργούν / ποια είναι τα πλεονεκτήματά τους / ποιες είναι οι χρήσεις τους / πώς προέρχονται / κ.λπ. το έχετε κάνει, ενισχύετε την κατανόησή σας εφαρμόζοντας ό, τι έχετε μάθει. Ίσως να κωδικοποιήσετε έναν πίνακα κατακερματισμού από το μηδέν. Ίσως να εφαρμόσετε μια αποτελεσματική λύση στο πρόβλημα του μέγιστου κενού για το οποίο διαβάζετε στο διαδίκτυο. Ας ελπίσουμε ότι θα αφιερώσετε χρόνο αναλύοντας τα πράγματα που έχετε μάθει στη συνέχεια. Σπάστε τα στα μέρη τους. Πραγματικά τους καταλαβαίνετε. Κατανοήστε το γιατί εκτός από το πώς. Κάντε τα δικά σας, σαν να ήταν οι δικές σας εφευρέσεις. Γνωρίστε τα μέσα και έξω.

Έτσι, όταν έχετε αποκτήσει όλες αυτές τις πληροφορίες, επιστρέφετε στο πρόβλημα ταξινόμησης συγχώνευσης. Αφού το αναλύσετε, θα καταλάβετε ότι η ισχύς του είδους συγχώνευσης έγκειται στο γεγονός ότι μπορείτε να συγχωνεύσετε λίστες συγκρίνοντας δύο στοιχεία κάθε φορά με γραμμικό τρόπο. Με την αλλαγή των απαιτήσεων, δεν μπορείτε πλέον να συγκρίνετε δύο στοιχεία ταυτόχρονα με γραμμικό τρόπο. Αντ 'αυτού, πρέπει να συγκρίνετε τα στοιχεία k κάθε φορά. Τότε αναρωτιέστε, πώς μπορώ να βρω το ελάχιστο στοιχείο k σε γραμμικό ή σχεδόν γραμμικό χρόνο; Το καλό που μάθατε τον περασμένο μήνα ότι οι ελάχιστοι δυαδικοί σωροί μπορούν να κάνουν ακριβώς αυτό που χρειάζεστε. Τότε ρωτάτε, τι χρειάζομαι η ελάχιστη τιμή; Το πρώτο στοιχείο σε κάθε μία από τις λίστες thek. Έτσι, εάν αποθηκεύσουμε την πρώτη τιμή από κάθε λίστα σε έναν ελάχιστο δυαδικό σωρό, μπορούμε απλώς να εμφανίσουμε το ελάχιστο. Στη συνέχεια, σκεφτόμαστε τι έκανε η αμφίδρομη συγχώνευση αφού βρήκε το ελάχιστο. Το εισήγαγε σε μια λίστα και στη συνέχεια μετακίνησε το δείκτη στη λίστα από την οποία προήλθε η ελάχιστη τιμή. Πώς μεταφράζεται αυτό για εμάς; Μπορούμε να προσθέσουμε το ελάχιστο σε έναν πίνακα αποτελεσμάτων. Γνωρίζουμε από ποια δευτερεύουσα λίστα έχουμε εξαγάγει το ελάχιστο, αλλά τι σημαίνει η προώθηση του δείκτη σε αυτήν τη λίστα; Αυτό σημαίνει ότι ένας νέος αριθμός βρίσκεται τώρα στο μπροστινό μέρος της λίστας, πράγμα που σημαίνει ότι ένας νέος αριθμός πρέπει να βρίσκεται στο ελάχιστο σωρό μας. Έτσι βάζουμε τον επόμενο αριθμό στο σωρό και επαναλαμβάνουμε. Αυτή η βασική ιδέα φαίνεται ότι θα λειτουργήσει και κάθε φορά που κάνουμε μια συγχώνευση k-way μιας λίστας n αντικειμένων, χρειάζεται O (nlgk) χρόνος.

Όπως μπορείτε να δείτε, μόλις αποκτήσετε ένα μεγάλο σώμα γνώσεων τομέα, θα είστε έτοιμοι να συνθέσετε. Το μυαλό σας θα κάνει συνδέσεις μεταξύ διαφορετικών αλγορίθμων και δομών δεδομένων που γνωρίζετε. Θα αρχίσετε να συνδέετε περιορισμούς και μοτίβα και παραδείγματα. Σπάνια κάποιος παράγει μια αριστοτεχνική δουλειά χωρίς να μάθει από τους μεγάλους πριν από αυτόν. Κοιτάξτε προς τα μεγάλα μυαλά της γενιάς που έχουμε μπροστά μας. Διαβάστε τα γραπτά των Knuth, Dijkstra, Rabin κ.λπ. Εκτιμήστε τι έχουν κάνει για το γήπεδο ... και μετά εμπνευστείτε.

Τέλος, μια τεράστια συνιστώσα της μάθησης επίλυσης αλγορίθμων πιστεύει στον εαυτό σας.

Καλή τύχη!


Απάντηση 3:

Για μένα, υπάρχουν 3 στάδια κατανόησης:

  • δεν γνωρίζω καθόλου το θέμα
  • γνωρίζοντας το θέμα
  • κατανοώντας το θέμα

Ακούγεται αρκετά απλό, έτσι; Το πρόβλημα είναι ότι οι περισσότεροι άνθρωποι γνωρίζουν αόριστα μόνο το θέμα. Έχουν μια ασαφή ιδέα για το τι σημαίνει μια έννοια, αλλά δεν την καταλαβαίνουν πραγματικά.

Το εφέ Dunning-Kruger λειτουργεί ως εξής: «Όσο πιο εξειδικευμένοι είστε, όσο περισσότερη εξάσκηση έχετε, τόσο περισσότερη εμπειρία έχετε, τόσο καλύτερα μπορείτε να συγκρίνετε τον εαυτό σας με τους άλλους. Καθώς προσπαθείτε να βελτιώσετε, αρχίζετε να καταλαβαίνετε καλύτερα πού χρειάζεστε εργασία. Αρχίζετε να βλέπετε την πολυπλοκότητα και την απόχρωση. ανακαλύπτετε τους πλοιάρχους της τέχνης σας και συγκρίνετε τον εαυτό σας με αυτούς και δείτε πού σας λείπει.

Από την άλλη πλευρά, όσο λιγότερο εξειδικευμένοι είστε, τόσο λιγότερη πρακτική έχετε κάνει, και όσο λιγότερες εμπειρίες έχετε, τόσο χειρότερη είναι να συγκρίνετε τον εαυτό σας με άλλους σε συγκεκριμένες εργασίες. "

Πώς μπορείτε λοιπόν να είστε «πραγματικός μηχανικός λογισμικού» ή «γκουρού στους αλγόριθμους»;

Πρώτα θα έχετε κάποια έκθεση στο θέμα. Γνωρίστε το θέμα. Συγχαρητήρια, είστε ήδη στο βήμα 2. Τώρα κατανοήστε το θέμα και σπάστε το. Δείτε πού έχει τρύπες οι γνώσεις σας. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι να απαντήσετε σε ερωτήσεις, γιατί αυτό είναι ουσιαστικά το ίδιο με το να δοκιμάσετε τον εαυτό σας.

Επαναλαμβάνετε γενικά αυτά τα 3 στάδια κατανόησης, επειδή όταν έχετε μια σταθερή αντίληψη για μια ιδέα, αυτό θα σας οδηγήσει σε μερικές ακόμη έννοιες για τις οποίες είτε δεν έχετε ακούσει ή έχετε μια αδύναμη κατανόηση.

Μερικοί άνθρωποι πρότειναν ότι πρέπει να διδάξετε σε άλλους ανθρώπους να καταλάβουν πραγματικά κάτι. Αυτό μπορεί να λειτουργήσει για εσάς. Δεν είναι για μένα - καταλήγω να διδάσκω σε λάθος πληροφορίες. Μόλις μπορώ να βρω αυτό το χείλος στην πανοπλία μου, έχω πολύ πιο εύκολο χρόνο να εξηγήσω έννοιες στους ανθρώπους. Βρείτε τι λειτουργεί για εσάς.

Βασικά, για να βελτιωθείς σε κάτι πρέπει να δεις πού οι ικανότητές σου υπολείπονται. Σε τελική ανάλυση, εκεί βελτιώνεστε. Το Dunning-Kruger συμφωνεί με αυτό - η εκπαίδευση είναι εξίσου με το να μαθαίνεις αυτό που δεν ξέρεις, αλλά για να προσθέσεις σε αυτό που κάνεις. Ευχαριστώ για το A2A.


Απάντηση 4:

Πιστεύω ότι η απομόνωση αλγορίθμων μεμονωμένα από πραγματικά προβλήματα είναι βαρετή. Το ίδιο με τη μελέτη των μαθηματικών χωρίς να τα εφαρμόσετε. Νομίζω ότι ο καλύτερος καλύτερος τρόπος για να γνωρίσετε πολλούς αλγόριθμους θα ήταν να γράψετε το δικό σας λειτουργικό σύστημα από την αρχή. Είναι πολλή δουλειά και απαιτεί κάποιες τεχνικές γνώσεις σχετικά με το υλικό, αλλά θα σας κρατήσει κίνητρα.

Εάν χρειάζεστε έναν αλγόριθμο για να λύσετε ένα πρόβλημα και να συνεχίσετε το έργο σας, θα το μελετήσετε ή θα το εφεύρετε. Δεδομένου ότι κάνετε τα πάντα από το μηδέν, δεν θα υπάρχει βιβλιοθήκη για χρήση στο επίπεδο διεπαφής χωρίς να καταλαβαίνετε πώς λειτουργεί ο εσωτερικός αλγόριθμος.

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

Όμως οι αλγόριθμοι είναι παντού: οι παίκτες που διαβάζουν το σκορ μουσικής χρησιμοποιούν ουρά προτεραιότητας. Κατασκευάζουν κάπως το ισοδύναμο της ουράς στο μυαλό τους και το γεμίζουν με γεγονότα καθώς προχωρούν στην ανάγνωση του σκορ, ενώ επιλέγουν τα γεγονότα με την υψηλότερη προτεραιότητα καθώς περνά ο χρόνος (αυτές είναι οι σημειώσεις που πρέπει να παίξετε τώρα). Η ίδια ουρά προτεραιότητας μπορεί να χρησιμοποιηθεί για τον προγραμματισμό διαδικασιών για εκτέλεση σε ένα λειτουργικό σύστημα (υπάρχουν πολλές στρατηγικές). Όπως μπορείτε να δείτε ο ίδιος αλγόριθμος μπορεί να χρησιμοποιηθεί σε πολλές διαφορετικές περιοχές, οπότε τα περισσότερα βιβλία περιγράφουν απλώς τον αλγόριθμο και τις ιδιότητές του, αλλά δεν αναφέρουν ούτε δίνουν λεπτομέρειες για την εφαρμογή του. Κάτι τέτοιο είναι μόνο το ήμισυ της διασκέδασης, IMHO.

Ένας παίκτης καρτών που τακτοποιεί τις κάρτες του, μπορεί να εφαρμόζει έναν αλγόριθμο εισαγωγής. Αναζητήστε έναν κατάλογο τηλεφώνου και εφαρμόζετε περίπου μια δυαδική αναζήτηση. Για να βγείτε από ένα λαβύρινθο με ελάχιστη προσπάθεια, θα πρέπει να εφαρμόσετε συστηματικά έναν αλγόριθμο backtracking (εκτός αν εξαπατήσετε με ένα νήμα της Ariadne). Εάν πολλαπλασιάζετε δύο αριθμούς με το χέρι, εφαρμόζετε έναν αριθμητικό αλγόριθμο με βάση την αλγεβρική ιδιότητα του πολλαπλασιασμού και το ίδιο ισχύει και για άλλες λειτουργίες αθροίζοντας δύο κλάσματα. Όποτε ο υπολογιστής σας σχεδιάζει μια γραμμή στην οθόνη, υπάρχει ένας άλλος αριθμητικός αλγόριθμος που τρέχει τώρα σε υλικό, προκειμένου να προσεγγίσει μια ιδανική ευθεία γραμμή στο πλέγμα pixel χρησιμοποιώντας μόνο ακέραιο μαθηματικό. Θα μπορούσα να συνεχίσω για πάντα…


Απάντηση 5:

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

Αλλά μόνο για να προσθέσω ένα πράγμα ... Πρέπει να προτείνω να ξεκινήσω με τα μαθήματα του Στάνφορντ Αλγόριθμοι Σχεδιασμός και Ανάλυση I και II (παρακάτω σύνδεσμοι) σε coursera που δίδαξε ο Tim Roughgarden. Είναι καταπληκτικός στο να σπάει τα πράγματα για εσάς.

Τα τελευταία χρόνια, έχω κάνει το σημείο να παρακολουθώ τις διαλέξεις του για να διατηρήσουν αυτήν τη γνώση τρέχουσα. Δεν κάνω τις εργασίες. Όμως, δεδομένου του στόχου σας, πιθανότατα θα θέλατε.

Τώρα για το πώς σχετίζεται με το να είσαι πραγματικός μηχανικός λογισμικού. Η αλήθεια είναι ότι υπάρχουν και άλλα πράγματα που ίσως προτιμάτε να επενδύσετε για να γίνετε "πραγματικός" μηχανικός λογισμικού. Και δεν θα έλεγα ότι η κυριαρχία των Αλγορίθμων ως το σημείο γκουρού είναι ένας από αυτούς, τουλάχιστον όχι στη γενική περίπτωση. Παραδόξως, είναι συνήθως πιο σημαντικό ως δεξιότητα συνέντευξης παρά στη δουλειά. Ωστόσο, το πόσο βάθος της γνώσης του Αλγόριθμου απαιτείται πραγματικά για εσάς, καθώς ένας μηχανικός λογισμικού θα εξαρτηθεί από τον τομέα σας / το πρόβλημα.

https://www.coursera.org/course/algo

https://www.coursera.org/course/algo2

Καλή τύχη!


Απάντηση 6:

Μεγάλη σημειογραφία.

Φύλλο εξαπάτησης πολυπλοκότητας Big-O Algorithm

Οι αλγόριθμοι και οι δομές δεδομένων που τους υποστηρίζουν τείνουν να λειτουργούν σε ένα σύνολο δεδομένων και θα χρησιμοποιούν κάποιο χρόνο (κύκλους CPU) και χώρο (μνήμη) για να μετατρέψουν τις εισόδους στις εξόδους.

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

Εάν οι ανάγκες κλιμακώνονται γραμμικά με τον αριθμό των στοιχείων είναι O (n).

Ορισμένοι αλγόριθμοι είναι σαφώς χειρότεροι από άλλους όσον αφορά τη χρήση πόρων. Για παράδειγμα, κανείς δεν χρησιμοποιεί Bubble Sort για να ταξινομήσει μια σειρά πραγμάτων, επειδή η χειρότερη απόδοση της ταξινόμησης φυσαλίδων είναι O (n ^ 2).

Φούσκα

Αντίθετα, το Quicksort στον ίδιο πίνακα παίρνει μόνο το O (n log (n)).

Οι δομές δεδομένων έχουν επίσης μεγάλη επίδραση στους αλγορίθμους που έχετε στη διάθεσή σας. Για παράδειγμα: Ο χρόνος που χρειάζεται για να βρείτε κάτι σε έναν πίνακα χρησιμοποιώντας γραμμική αναζήτηση είναι O (n) εάν πρέπει να ελέγξετε κάθε στοιχείο για να δείτε αν είναι το σωστό. Η εισαγωγή νέων πραγμάτων σε μια ταξινομημένη συστοιχία σημαίνει εύρεση του σημείου για εισαγωγή και μετακίνηση όλων σε μια θέση έτσι ώστε να είναι και το O (n).

Από την άλλη πλευρά, θα μπορούσατε να ταξινομήσετε τον πίνακα για O (n log (n)) και στη συνέχεια να χρησιμοποιήσετε δυαδική αναζήτηση σε αυτό για να λάβετε μια αναζήτηση σε O (log (n)) ώρα.

Αλλά αν έχετε περισσότερα στοιχεία από αυτά που μπορεί να διατηρήσει ο πίνακας; Στο C θα πρέπει να δημιουργήσετε έναν μεγαλύτερο πίνακα και να αντιγράψετε όλα τα στοιχεία στον νέο πίνακα. Η χρονική ποινή υπάρχει O (n).

Εάν αποθηκεύατε πράγματα πολύ συχνά, θα μπορούσατε να χρησιμοποιήσετε μια λίστα με μοναδική σύνδεση όπου ο χρόνος εισαγωγής είναι O (1) που σημαίνει ότι μπορείτε να εισαγάγετε ένα στοιχείο με ταξινομημένη σειρά με τον ίδιο χρονικό διάστημα, ανεξάρτητα από το αν υπάρχουν πολύ λίγα ή πάρα πολλά αντικείμενα βρίσκονται στη συνδεδεμένη λίστα. Σε μια συνδεδεμένη λίστα, ο χρόνος αναζήτησης είναι O (n) όπως ένας πίνακας.

Ωστόσο, αν αναζητάτε συχνά τη δομή δεδομένων σας, μπορείτε να χρησιμοποιήσετε δυαδικό δέντρο αναζήτησης. Τα δυαδικά δέντρα αναζήτησης χρειάζονται μόνο το O (log (n) για εισαγωγή στη δομή δεδομένων και χρειάζονται μόνο O (log (n)) χρόνο για να βρουν κάτι.

Η ανταλλαγή μεταξύ αυτών των δομών δεδομένων είναι διάστημα:

  • Ένας πίνακας διατηρεί μόνο τα δεδομένα που χρειάζεστε για να αποθηκεύσετε.
  • Μια μοναδικά συνδεδεμένη λίστα χρειάζεται έναν δείκτη ανά κόμβο για να οδηγεί στον επόμενο κόμβο.
  • Ένα δέντρο δυαδικής αναζήτησης χρειάζεται δύο δείκτες ανά κόμβο εκτός από τα δεδομένα (ένα στοιχείο δεδομένων αποθηκεύεται σε κάθε κόμβο)

Έτσι, επιλέγοντας μια ταχύτερη δομή δεδομένων στο Time complexity (το δέντρο δυαδικής αναζήτησης) καταναλώνετε περισσότερη μνήμη (Space complexity) για την ίδια ποσότητα στοιχείων δεδομένων με τα οποία εργάζεστε.

Κάθε φορά που μαθαίνετε έναν νέο αλγόριθμο, μπορείτε να χρησιμοποιήσετε τη σημειογραφία Big-O για να κρίνετε τα πλεονεκτήματα και τις αδυναμίες του, ώστε να μπορείτε να γνωρίζετε ποια να επιλέξετε για το σχέδιό σας.

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


Απάντηση 7:

Αυτές είναι άσχετες ερωτήσεις. :) Ό, τι εννοείτε με τον «πραγματικό μηχανικό λογισμικού» δεν έχει καμία σχέση με το «γκουρού στους αλγόριθμους».

Εάν ο «πραγματικός μηχανικός λογισμικού» είναι «επαγγελματίας μηχανικός λογισμικού», τότε είναι απλό. Ο Επαγγελματίας είναι ένα άτομο που παίρνει χρήματα για τη δουλειά του, επομένως απλά πρέπει να βρείτε μια δουλειά προγραμματισμού και είστε «επαγγελματίας μηχανικός λογισμικού».

Αν εννοείτε «ικανός μηχανικός λογισμικού που παράγει αποτελέσματα υψηλής ποιότητας» τότε είναι πιο περίπλοκο. Πρέπει να μάθετε και να εφαρμόσετε σωστές πρακτικές μηχανικής λογισμικού (χειροτεχνία λογισμικού) όπως προσεκτική αρθρωτή σχεδίαση (εφαρμογή κατάλληλων σχεδίων σχεδίασης ή οτιδήποτε έχει νόημα για την εργασία), δοκιμές, τεκμηρίωση, αναθεώρηση κώδικα και ούτω καθεξής. Εκτός αυτού, θα πρέπει να γίνετε ικανοί σε ένα «επίπεδο πάνω», για παράδειγμα θα πρέπει να κατανοήσετε τη συνολική αρχιτεκτονική ενός προϊόντος, την απασχολησιμότητα και τους τεχνικούς περιορισμούς, τον κύκλο ζωής του προϊόντος και τη διαχείριση.

Αλλά αν θέλετε να γίνετε γκουρού σε αλγόριθμους, τότε θα πρέπει να μάθετε αλγόριθμους και να λύσετε τις ασκήσεις. Κάποιος γίνεται γκουρού αλγορίθμων εφαρμόζοντας και αναλύοντας πολύπλοκους αλγόριθμους.


Απάντηση 8:

Εάν θέλετε πραγματικά να γίνετε γκουρού αλγορίθμων - τότε πρέπει τελικά να "ξαναδημιουργήσετε τον τροχό". Ξέρω ότι αυτό ακούγεται τρελό, αλλά αν "μόνο" ετοιμάσετε βιβλία και αναποδογυρίσετε την ιδεολογία κάποιου άλλου τότε το μόνο που κάνετε αποτελεσματικά γίνεται το επιστόμιο για κάποιον άλλο.

Πρώτα πρέπει να καταλάβετε πραγματικά τις εφαρμογές του αλγορίθμου - που είναι απλώς ένας φανταστικός όρος για μια εξίσωση που λύνει τα πράγματα. Έτσι, δεν θα γίνετε γκουρού σε αλγόριθμους, αλλά περισσότερο, θα γίνετε επιλυτής προβλημάτων σε ένα πεδίο που μπορεί να εφαρμοστεί χρησιμοποιώντας αλγόριθμους.

Δεύτερον, πρέπει να βρείτε ένα πεδίο που πραγματικά «κορυφώνει» τα ενδιαφέροντά σας. Στη συνέχεια, πρέπει να διατηρήσετε τη μεταγνώριση σε αυτό το πεδίο σε σημείο που να καταλαβαίνετε πραγματικά τα προβλήματα που πρέπει πραγματικά να επιλυθούν. Τότε πρέπει να πάρετε τις δεξιότητες που έχετε μάθει από το "να μην ανακαλύψετε ξανά τον τροχό" και να τις αναπτύξετε για να "ανακαλύψετε ξανά τον τροχό". Σε αυτό το σημείο θα έχετε κυριαρχήσει εκείνο τον κλάδο αυτού του θέματος αρκετά ώστε να θεωρηθεί «πλοίαρχος / γκουρού» όπου οι σκέψεις σας για το θέμα θα είναι σεβαστές και αποδεκτές.

Διαφορετικά, θα είστε απλώς άντρας, απαντώντας σε μια ερώτηση για το Quora, χαχα.

Ευχαριστώ

Μπράντον Β.


Απάντηση 9:

Εάν ακολουθήσετε αυτήν τη διαδικασία σκέψης, θα είστε απλώς ένας άλλος προγραμματιστής σκουπιδιών που απομνημονεύει πολλά πράγματα, αλλά δεν έχει ιδέα πού ή πότε να τα χρησιμοποιήσει και ιδέα να καθορίσει πώς να δείτε διάφορα μοτίβα στον κώδικα όπου αυτά μπορεί να είναι χρήσιμα. Πιστέψτε με ... δεν χρειαζόμαστε πια από αυτά ... υπάρχουν ήδη πολλά που εργάζονται σε κάθε εταιρεία που υπάρχει ...

Αν θέλετε να είστε καλός προγραμματιστής μαθαίνετε έννοιες, όχι κώδικα. Μπορώ να βρω οποιονδήποτε αλγόριθμο που θέλω ήδη τελειοποιημένος χρησιμοποιώντας το Google ή το StackOverflow και απλώς να τον αφήσω και να τον χρησιμοποιήσω. Χρειάζονται περίπου 10 δευτερόλεπτα. Γνωρίζοντας την ιδέα πίσω από ΓΙΑΤΙ τη χρησιμοποιείτε και πώς να καθορίσετε ΠΟΤΕ και ΠΟΥ και πιο σημαντικό πότε και πού ΔΕΝ να το χρησιμοποιήσετε είναι αυτό που πρέπει να εστιάζετε στη μάθηση.

Αυτό είναι που κάνει έναν καλό προγραμματιστή… την ικανότητά του να χρησιμοποιεί τις πληροφορίες και τις γνώσεις και να τις εφαρμόζει σε όλες τις καταστάσεις αναγνωρίζοντας καταστάσεις όπου θα είναι χρήσιμες, χωρίς να μαθαίνετε κάποιον κώδικα που μπορείτε να βρείτε σε 10 δευτερόλεπτα στο διαδίκτυο.


Απάντηση 10:

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

Τότε μια μέρα πήρα ένα βιβλίο με το όνομα και δεν μπορώ να σταματήσω να το διαβάζω, είναι τόσο καλά οργανωμένο, αφού διάβασα και κωδικοποίησα πάνω από το 80%, βρήκα ότι το επίπεδο αλγορίθμων μου βελτιώθηκε πολύ, τουλάχιστον για τους κοινούς αλγόριθμους.

Γι 'αυτό, προτείνω σε κάποιον να πάρει αυτό το βιβλίο, αν και το όνομά του είναι για συνέντευξη, αλλά στην πραγματικότητα αφορά κυρίως αλγόριθμο από την άποψή μου.

BTW:

  • Το βιβλίο μπορεί να είναι λίγο δύσκολο για τους αρχάριους στον αλγόριθμο.
  • Τα βιβλία δεν κάλυψαν κάποια θέματα πολύ βαθιά, αφού το διαβάσατε, αν θέλετε να πάτε πιο βαθιά σε κάποια πτυχή, πιθανότατα θα πρέπει να βρείτε ένα βιβλίο για αυτό το θέμα συγκεκριμένα.
  • Γράψτε τις υλοποιήσεις μόνοι σας, θα το κάνετε διπλά αποτελεσματικό.

Απάντηση 11:

Δεδομένου ότι δεν θεωρώ τον εαυτό μου Γκουρού σε αλγόριθμους, αλλά απλώς έναν πολύ περίεργο και επιμελή μηχανικό λογισμικού, θα σας προτείνω ένα βιβλίο που έχω συστήσει και σε άλλους, και το οποίο βρήκα ως χρυσό θησαυρό (όχι λιγότερο από αυτό). Το βιβλίο είναι: "εισαγωγή στους αλγορίθμους μια δημιουργική προσέγγιση" του Udi Manber. Είναι ένα εξαιρετικό βιβλίο για να μαζέψετε και να μάθετε την επίλυση προβλημάτων και το σχεδιασμό αλγορίθμων. Ο λόγος που μου αρέσει πολύ αυτό το βιβλίο είναι η μεθοδολογική προσέγγιση που χρειάζεται για τη διδασκαλία αλγορίθμων, η οποία βασίζεται σε μεγάλο βαθμό στην «μαθηματική επαγωγή». Τα περισσότερα βιβλία και δάσκαλοι χρησιμοποιούν την επαγωγή ως μέσο απόδειξης της ορθότητας των αλγορίθμων. Ο Udi Manber, χρησιμοποιεί τη μαθηματική επαγωγή ως μέσο για την κατασκευή τους. Για μένα αυτός ήταν ένας επαναστατικός τρόπος εξέτασης των αλγορίθμων. Ως εκ τούτου, προτείνω ανεπιφύλακτα να παραλάβετε αυτό το βιβλίο εάν θέλετε να βελτιώσετε τις δεξιότητές σας επίλυσης προβλημάτων και τις αλγοριθμικές ικανότητες σχεδίασης. Παρόλο που δεν μπορώ να σας υποσχεθώ ότι θα γίνετε "γκουρού", σας υπόσχομαι ότι θα γίνετε σίγουρα πολύ πιο ικανοποιητικός επιλυτής προβλημάτων από ό, τι (πριν το διαβάσετε).