Ich habe dies ursprünglich als kurze To-Do-Liste mit Studienthemen für die Ausbildung zum Software-Ingenieur erstellt, aber daraus ist die große Liste geworden, die Sie heute sehen. Nachdem ich diesen Studienplan durchlaufen hatte, wurde ich als Software-Entwicklungsingenieur bei Amazon eingestellt! Du wirst wahrscheinlich nicht so viel lernen müssen wie ich. Wie auch immer, alles, was Sie brauchen, ist hier.
Ich habe mehrere Monate lang etwa 8 bis 12 Stunden am Tag gelernt. Das ist meine Geschichte: Warum ich für ein Google-Interview 8 Monate lang Vollzeit studiert habe
Bitte beachten Sie: Sie müssen nicht so viel lernen wie ich. Ich habe viel Zeit mit Dingen verschwendet, die ich nicht wissen musste. Weitere Informationen dazu finden Sie weiter unten. Ich helfe Ihnen, dorthin zu gelangen, ohne Ihre kostbare Zeit zu verschwenden.
Die hier aufgeführten Punkte bereiten Sie gut auf ein technisches Vorstellungsgespräch bei nahezu jedem Softwareunternehmen vor, einschließlich der Giganten Amazon, Facebook, Google und Microsoft.
Viel Glück für Sie!
Bahasa Indonesien
bulgarisch
Spanisch
Deutsch
Japanisch (日本語)
Marathi
Polieren
Portugiesisch Brasileiro
Russisch
Tiếng Việt – Vietnamesisch
Urdu - اردو
Usbekisch
বাংলা - Bangla
ខ្មែរ – Khmer
简体中文
繁體中文
Afrikaans
Arabisch
Französisch
griechisch
Italienisch
Koreanisch (한국어)
Malayalam
Persisch - Farsi
Telugu
Thailändisch
Türkisch
Ukraine
עברית
Ja
Werden Sie Sponsor und unterstützen Sie die Coding Interview University!
Dies ist mein mehrmonatiger Studienplan, um Softwareentwickler für ein großes Unternehmen zu werden.
Erforderlich:
Ein wenig Erfahrung mit Codierung (Variablen, Schleifen, Methoden/Funktionen usw.)
Geduld
Zeit
Beachten Sie, dass es sich hierbei um einen Studienplan für Software-Engineering handelt, nicht um Frontend-Engineering oder Full-Stack-Entwicklung. Es gibt anderswo wirklich tolle Roadmaps und Kursmaterialien für diese Karrierewege (weitere Informationen finden Sie unter https://roadmap.sh/).
In einem Informatikstudiengang an einer Universität gibt es viel zu lernen, aber nur etwa 75 % davon reichen für ein Vorstellungsgespräch aus, deshalb behandle ich das hier. Für ein vollständiges CS-Autodidaktprogramm wurden die Ressourcen für meinen Studienplan in Kamran Ahmeds Informatik-Roadmap aufgenommen: https://roadmap.sh/computer-science
Was ist das?
Warum es verwenden?
Wie man es benutzt
Denken Sie nicht, dass Sie nicht schlau genug sind
Ein Hinweis zu Videoressourcen
Wählen Sie eine Programmiersprache
Bücher für Datenstrukturen und Algorithmen
Bücher zur Vorbereitung auf Vorstellungsgespräche
Machen Sie nicht meine Fehler
Was Sie nicht sehen werden
Der Tagesplan
Übung zum Codieren von Fragen
Codierungsprobleme
Algorithmische Komplexität / Big-O / Asymptotische Analyse
Datenstrukturen
Arrays
Verknüpfte Listen
Stapel
Warteschlange
Hash-Tabelle
Mehr Wissen
Binäre Suche
Bitweise Operationen
Bäume
Bäume – Einführung
Binäre Suchbäume: BSTs
Heap / Prioritätswarteschlange / Binärer Heap
Ausgewogene Suchbäume (allgemeines Konzept, keine Details)
Durchquerungen: Vorbestellung, Inorder, Postorder, BFS, DFS
Sortierung
Auswahl
Einfügen
Haufensort
Quicksort
Mergesort
Grafiken
gerichtet
ungerichtet
Adjazenzmatrix
Adjazenzliste
Durchquerungen: BFS, DFS
Noch mehr Wissen
Rekursion
Dynamische Programmierung
Designmuster
Kombinatorik (n wähle k) und Wahrscheinlichkeit
NP-, NP-vollständige und Approximationsalgorithmen
Wie Computer ein Programm verarbeiten
Caches
Prozesse und Threads
Testen
String-Suche und -Manipulationen
Versucht
Gleitkommazahlen
Unicode
Endianness
Vernetzung
Abschließende Überprüfung
Aktualisieren Sie Ihren Lebenslauf
Finden Sie einen Job
Vorstellungsgesprächsprozess und allgemeine Vorbereitung auf Vorstellungsgespräche
Denken Sie daran, wann das Vorstellungsgespräch kommt
Haben Sie Fragen an den Interviewer?
Sobald Sie den Job haben
---------------- Alles unter diesem Punkt ist optional ----------------
Zusätzliche Bücher
Systemdesign, Skalierbarkeit, Datenverarbeitung (wenn Sie mehr als 4 Jahre Erfahrung haben)
Zusätzliches Lernen
AVL-Bäume
Spreizbäume
Rot/schwarze Bäume
2-3 Suchbäume
2-3-4 Bäume (auch bekannt als 2-4 Bäume)
N-ary (K-ary, M-ary) Bäume
B-Bäume
Compiler
Emacs und vi(m)
Unix-Befehlszeilentools
Informationstheorie
Paritäts- und Hamming-Code
Entropie
Kryptographie
Kompression
Computersicherheit
Müllabfuhr
Parallele Programmierung
Messaging-, Serialisierungs- und Warteschlangensysteme
A*
Schnelle Fourier-Transformation
Bloom-Filter
HyperLogLog
Lokalitätssensitives Hashing
van Emde Boas-Bäume
Erweiterte Datenstrukturen
Ausgewogene Suchbäume
kD-Bäume
Listen überspringen
Netzwerkflüsse
Disjunkte Mengen und Unionssuche
Mathematik für schnelle Verarbeitung
Treap
Lineare Programmierung
Geometrie, konvexe Hülle
Diskrete Mathematik
Zusätzliche Details zu einigen Themen
Videoserie
Informatikkurse
Papiere
Wenn Sie als Softwareentwickler für ein großes Unternehmen arbeiten möchten, müssen Sie Folgendes wissen.
Wenn Sie wie ich einen Abschluss in Informatik verpasst haben, wird dies Sie nachholen und vier Jahre Ihres Lebens retten.
Als ich mit diesem Projekt begann, kannte ich weder einen Stapel noch einen Heap, wusste nichts über Big-O, nichts über Bäume oder wie man einen Graphen durchquert. Ich kann Ihnen sagen, wenn ich einen Sortieralgorithmus programmieren müsste, wäre das schrecklich gewesen. Jede Datenstruktur, die ich jemals verwendet hatte, war in die Sprache integriert, und ich wusste überhaupt nicht, wie sie unter der Haube funktionierte. Ich musste nie den Speicher verwalten, es sei denn, ein von mir ausgeführter Prozess würde die Fehlermeldung „Nicht genügend Speicher“ ausgeben, und dann musste ich eine Problemumgehung finden. Ich habe in meinem Leben ein paar mehrdimensionale Arrays und Tausende assoziative Arrays verwendet, aber ich habe nie Datenstrukturen von Grund auf erstellt.
Es ist ein langer Plan. Es kann Monate dauern. Wenn Sie bereits mit viel davon vertraut sind, wird es viel weniger Zeit in Anspruch nehmen.
⬆ zurück nach oben
Alles, was unten steht, ist eine Übersicht, und Sie sollten die Punkte in der Reihenfolge von oben nach unten angehen.
Ich verwende die spezielle Markdown-Variante von GitHub, einschließlich Aufgabenlisten, um den Fortschritt zu verfolgen.
Mehr über Markdown im GitHub-Stil
Klicken Sie auf dieser Seite oben auf die Schaltfläche „Code“ und dann auf „ZIP herunterladen“. Entpacken Sie die Datei und Sie können mit den Textdateien arbeiten.
Wenn Sie einen Code-Editor öffnen, der Markdown unterstützt, sehen Sie, dass alles schön formatiert ist.
Erstellen Sie einen neuen Zweig, damit Sie Elemente wie diesen überprüfen können. Geben Sie einfach ein x in die Klammern ein: [x]
Forken Sie das GitHub-Repo: https://github.com/jwasham/coding-interview-university
indem Sie auf die Schaltfläche Fork klicken.
Klonen Sie auf Ihr lokales Repo:
Git-Klon https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.gitcd programming-interview-university Git Remote Upstream hinzufügen https://github.com/jwasham/coding-interview-university.git git remote set-url --push upstream DISABLE #, damit Sie Ihren persönlichen Fortschritt nicht auf das ursprüngliche Repo zurückschieben
Markieren Sie alle Kästchen mit X, nachdem Sie Ihre Änderungen abgeschlossen haben:
git commit -am „Markierter persönlicher Fortschritt“git pull upstream main # Halten Sie Ihren Fork mit Änderungen gegenüber dem ursprünglichen Repo auf dem neuesten Stand.git push # pusht einfach zu Ihrem Fork
⬆ zurück nach oben
Erfolgreiche Softwareentwickler sind schlau, aber viele haben die Unsicherheit, dass sie nicht schlau genug sind.
Die folgenden Videos können Ihnen helfen, diese Unsicherheit zu überwinden:
Der Mythos vom genialen Programmierer
Es ist gefährlich, alleine zu gehen: Kampf gegen die unsichtbaren Monster in der Technik
⬆ zurück nach oben
Einige Videos sind nur verfügbar, wenn Sie sich für einen Coursera- oder EdX-Kurs anmelden. Diese werden MOOCs genannt. Manchmal finden die Kurse nicht statt, sodass Sie ein paar Monate warten müssen und keinen Zugang haben.
Es wäre großartig, die Online-Kursressourcen durch kostenlose und immer verfügbare öffentliche Quellen wie YouTube-Videos (vorzugsweise Universitätsvorlesungen) zu ersetzen, damit Sie diese jederzeit studieren können, nicht nur, wenn ein bestimmter Online-Kurs stattfindet.
⬆ zurück nach oben
Sie müssen eine Programmiersprache für Ihre Programmierinterviews auswählen, aber Sie müssen auch eine Sprache finden, die Sie zum Studium von Informatikkonzepten verwenden können.
Vorzugsweise wäre die Sprache dieselbe, so dass Sie nur eine beherrschen müssen.
Als ich den Studienplan erstellt habe, habe ich für den größten Teil zwei Sprachen verwendet: C und Python
C: Sehr niedriges Niveau. Ermöglicht Ihnen den Umgang mit Zeigern und der Speicherzuweisung/-freigabe, sodass Sie die Datenstrukturen und Algorithmen in Ihren Knochen spüren. In höheren Sprachen wie Python oder Java sind diese für Sie verborgen. Im Arbeitsalltag ist das großartig, aber wenn man lernt, wie diese Low-Level-Datenstrukturen aufgebaut sind, ist es großartig, sich nah am Metall zu fühlen.
Dies ist ein kurzes Buch, aber es vermittelt Ihnen gute Kenntnisse in der C-Sprache und wenn Sie es ein wenig üben, werden Sie es schnell beherrschen. Das Verständnis von C hilft Ihnen zu verstehen, wie Programme und Speicher funktionieren.
Sie müssen nicht besonders tief in das Buch eintauchen (oder es gar zu Ende lesen). Kommen Sie einfach dorthin, wo Sie sich beim Lesen und Schreiben in C wohl fühlen.
C ist überall. Während Sie studieren, werden Sie überall Beispiele in Büchern, Vorlesungen und Videos sehen.
Die Programmiersprache C, 2. Auflage
Python: Modern und sehr ausdrucksstark, ich habe es gelernt, weil es einfach super nützlich ist und es mir außerdem ermöglicht, in einem Interview weniger Code zu schreiben.
Das ist meine Präferenz. Du machst natürlich, was Du willst.
Sie brauchen es vielleicht nicht, aber hier sind einige Websites zum Erlernen einer neuen Sprache:
Übung
Codewars
HackerEarth
Scaler-Themen (Java, C++)
Programiz PRO Community Challenges)
Sie können für den Programmierteil des Vorstellungsgesprächs eine Sprache verwenden, mit der Sie sich auskennen, aber für große Unternehmen sind dies gute Optionen:
C++
Java
Python
Sie könnten diese auch verwenden, aber lesen Sie sich zuerst um. Es kann Vorbehalte geben:
JavaScript
Rubin
Hier ist ein Artikel, den ich über die Auswahl einer Sprache für das Interview geschrieben habe: Wählen Sie eine Sprache für das Coding-Interview aus. Dies ist der ursprüngliche Artikel, auf dem mein Beitrag basiert: Auswahl einer Programmiersprache für Interviews
Sie müssen die Sprache sehr gut beherrschen und über Kenntnisse verfügen.
Lesen Sie mehr über Auswahlmöglichkeiten:
Wählen Sie die richtige Sprache für Ihr Coding-Interview
Sprachspezifische Ressourcen finden Sie hier
⬆ zurück nach oben
Dieses Buch wird Ihre Grundlage für die Informatik bilden.
Wählen Sie einfach eine Sprache aus, mit der Sie vertraut sind. Sie werden viel lesen und programmieren.
Algorithmen in C, Teile 1-5 (Bundle), 3. Auflage
Grundlagen, Datenstrukturen, Sortier-, Such- und Diagrammalgorithmen
Datenstrukturen und Algorithmen in Python
von Goodrich, Tamassia, Goldwasser
Ich habe dieses Buch geliebt. Es deckte alles und noch mehr ab.
Pythonischer Code
mein leuchtender Buchbericht: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
Ihre Wahl:
Goodrich, Tamassia, Goldwasser
Datenstrukturen und Algorithmen in Java
Sedgewick und Wayne:
Algorithmen I
Algorithmen II
Algorithmen
Kostenloser Coursera-Kurs, der das Buch behandelt (von den Autoren unterrichtet!):
Ihre Wahl:
Goodrich, Tamassia und Mount
Datenstrukturen und Algorithmen in C++, 2. Auflage
Sedgewick und Wayne
Algorithmen in C++, Teile 1–4: Grundlagen, Datenstruktur, Sortieren, Suchen
Algorithmen in C++ Teil 5: Graphalgorithmen
⬆ zurück nach oben
Sie müssen nicht viele davon kaufen. Ehrlich gesagt reicht „Cracking the Coding Interview“ wahrscheinlich aus, aber ich habe mir mehr gekauft, um mehr Übung zu haben. Aber ich mache immer zu viel.
Ich habe beides gekauft. Sie haben mir viel Übung gegeben.
Offengelegte Programmierinterviews: Programmieren Sie Ihren Weg durch das Interview, 4. Auflage
Antworten in C++ und Java
Dies ist eine gute Aufwärmübung für „Cracking the Coding Interview“.
Nicht allzu schwierig. Die meisten Probleme sind möglicherweise einfacher als das, was Sie in einem Vorstellungsgespräch sehen werden (nach dem, was ich gelesen habe)
Cracking the Coding Interview, 6. Auflage
Antworten in Java
Wählen Sie eines aus:
Elemente von Programmierinterviews (C++-Version)
Elemente der Programmierung von Interviews in Python
Elements of Programming Interviews (Java-Version) – Begleitprojekt – Methoden-Stub und Testfälle für jedes Problem im Buch
⬆ zurück nach oben
Diese Liste ist über viele Monate hinweg gewachsen und ja, sie ist außer Kontrolle geraten.
Hier sind einige Fehler, die ich gemacht habe, damit Sie ein besseres Erlebnis haben. Und Sie sparen Monate Zeit.
Ich schaute mir stundenlang Videos an und machte mir reichlich Notizen, und Monate später gab es vieles, an das ich mich nicht mehr erinnern konnte. Ich habe drei Tage damit verbracht, meine Notizen durchzugehen und Karteikarten zu erstellen, damit ich sie noch einmal durchgehen konnte. Ich brauchte dieses ganze Wissen nicht.
Bitte lesen Sie, damit Sie meine Fehler nicht machen:
Informatikwissen bewahren.
Um das Problem zu lösen, habe ich eine kleine Karteikartenseite erstellt, auf der ich zwei Arten von Karteikarten hinzufügen kann: allgemein und Code. Jede Karte hat eine andere Formatierung. Ich habe eine Mobile-First-Website erstellt, damit ich auf meinem Telefon oder Tablet Bewertungen lesen kann, wo immer ich bin.
Machen Sie kostenlos Ihr eigenes:
Karteikarten-Site-Repo
Ich EMPFEHLE NICHT, meine Karteikarten zu verwenden. Es gibt zu viele und die meisten davon sind Kleinigkeiten, die Sie nicht brauchen.
Aber wenn Sie mir nicht zuhören wollen, hier sind Sie:
Meine Karteikarten-Datenbank (1200 Karten):
Meine Karteikarten-Datenbank (extrem – 1800 Karten):
Denken Sie daran, dass ich es übertrieben habe und Karten habe, die alles abdecken, von Assemblersprache und Python-Trivia bis hin zu maschinellem Lernen und Statistiken. Es ist viel zu viel für das, was benötigt wird.
Hinweis zu Karteikarten: Wenn Sie zum ersten Mal bemerken, dass Sie die Antwort kennen, markieren Sie sie nicht als bekannt. Man muss die gleiche Karte mehrmals sehen und sie mehrmals richtig beantworten, bevor man sie wirklich kennt. Durch Wiederholung wird dieses Wissen tiefer in Ihr Gehirn eindringen.
Eine Alternative zur Nutzung meiner Karteikartenseite ist Anki, die mir schon mehrfach empfohlen wurde. Es verwendet ein Wiederholungssystem, um Ihnen das Erinnern zu erleichtern. Es ist benutzerfreundlich, auf allen Plattformen verfügbar und verfügt über ein Cloud-Synchronisierungssystem. Auf iOS kostet es 25 US-Dollar, auf anderen Plattformen ist es jedoch kostenlos.
Meine Karteikartendatenbank im Anki-Format: https://ankiweb.net/shared/info/25173560 (danke @xiewenya).
Einige Schüler haben Formatierungsprobleme mit Leerzeichen erwähnt, die wie folgt behoben werden können: Öffnen Sie den Stapel, bearbeiten Sie die Karte, klicken Sie auf Karten, wählen Sie das Optionsfeld „Styling“ aus und fügen Sie das Mitglied „white-space: pre;“ hinzu. zur Kartenklasse.
DAS IST SEHR WICHTIG.
Beginnen Sie mit dem Codieren von Interviewfragen, während Sie Datenstrukturen und Algorithmen erlernen.
Sie müssen das Gelernte anwenden, um Probleme zu lösen, sonst vergessen Sie es. Ich habe diesen Fehler gemacht.
Sobald Sie ein Thema kennengelernt haben und sich damit einigermaßen vertraut fühlen, zum Beispiel mit verknüpften Listen :
Öffnen Sie eines der unten aufgeführten Coding-Interview-Bücher (oder Websites zu Coding-Problemen).
Stellen Sie zwei oder drei Fragen zu verknüpften Listen.
Fahren Sie mit dem nächsten Lernthema fort.
Gehen Sie später zurück und lösen Sie weitere zwei oder drei Probleme mit verknüpften Listen.
Tun Sie dies mit jedem neuen Thema, das Sie lernen.
Machen Sie weiterhin Probleme, während Sie all das lernen, nicht danach.
Sie werden nicht wegen Ihres Wissens eingestellt, sondern wegen der Art und Weise, wie Sie das Wissen anwenden.
Hierfür gibt es viele Ressourcen, die unten aufgeführt sind. Weitermachen.
Es gibt viele Ablenkungen, die wertvolle Zeit kosten können. Fokus und Konzentration sind schwer. Wenn Sie Musik ohne Text einschalten, können Sie sich ziemlich gut konzentrieren.
⬆ zurück nach oben
Dies sind weit verbreitete Technologien, die jedoch nicht Teil dieses Studienplans sind:
Javascript
HTML, CSS und andere Front-End-Technologien
SQL
⬆ zurück nach oben
In diesem Kurs werden viele Themen behandelt. Jeder wird wahrscheinlich ein paar Tage oder vielleicht sogar eine Woche oder länger dauern. Es hängt von Ihrem Zeitplan ab.
Nehmen Sie sich jeden Tag das nächste Thema in der Liste, schauen Sie sich einige Videos zu diesem Thema an und schreiben Sie dann eine Implementierung dieser Datenstruktur oder dieses Algorithmus in der Sprache, die Sie für diesen Kurs ausgewählt haben.
Sie können meinen Code hier sehen:
C
C++
Python
Sie müssen sich nicht jeden Algorithmus merken. Sie müssen es nur ausreichend verstehen, um Ihre eigene Implementierung schreiben zu können.
⬆ zurück nach oben
Why is this here? I'm not ready to interview.
Dann gehen Sie zurück und lesen Sie dies.
Warum Sie das Lösen von Programmierproblemen üben müssen:
Problemerkennung und wo die richtigen Datenstrukturen und Algorithmen passen
Sammeln von Anforderungen für das Problem
Sprechen Sie das Problem so an, wie Sie es im Vorstellungsgespräch tun werden
Codierung auf einem Whiteboard oder Papier, nicht auf einem Computer
Ermitteln Sie die zeitliche und räumliche Komplexität Ihrer Lösungen (siehe Big-O unten).
Testen Sie Ihre Lösungen
Es gibt eine tolle Einleitung zur methodischen, kommunikativen Problemlösung im Vorstellungsgespräch. Das finden Sie auch in den Programmierinterviewbüchern, aber dieses fand ich herausragend: Algorithm Design Canvas
Schreiben Sie Code auf ein Whiteboard oder Papier, nicht auf einen Computer. Testen Sie mit einigen Beispieleingaben. Geben Sie es dann ein und testen Sie es auf einem Computer.
Wenn Sie zu Hause kein Whiteboard haben, besorgen Sie sich in einem Kunstgeschäft einen großen Zeichenblock. Sie können auf der Couch sitzen und üben. Das ist mein „Sofa-Whiteboard“. Ich habe den Stift im Foto nur zur Skalierung hinzugefügt. Wenn Sie einen Stift verwenden, wünschen Sie sich, Sie könnten löschen. Wird schnell chaotisch. Ich benutze einen Bleistift und einen Radiergummi.
Beim Üben von Codierungsfragen geht es nicht darum, Antworten auf Programmierprobleme auswendig zu lernen.
⬆ zurück nach oben
Vergessen Sie hier nicht Ihre Bücher über wichtige Coding-Interviews.
Probleme lösen:
So finden Sie eine Lösung
So analysieren Sie eine Topcoder-Problemstellung
Fragenvideos zum Programmieren von Vorstellungsgesprächen:
IDeserve (88 Videos)
Tushar Roy (5 Playlists)
Super für exemplarische Vorgehensweisen bei Problemlösungen
Nick White - LeetCode Solutions (187 Videos)
Gute Erklärungen zur Lösung und zum Code
Sie können mehrere in kurzer Zeit ansehen
FisherCoder – LeetCode-Lösungen
Herausforderungs-/Übungsorte:
LeetCode
Meine Lieblingsseite zu Codierungsproblemen. Das Abonnementgeld lohnt sich für die 1–2 Monate, die Sie wahrscheinlich vorbereiten werden.
Code-Komplettlösungen finden Sie oben in den Videos von Nick White und FisherCoder.
HackerRank
TopCoder
Codeforces
Kodilität
Geeks für Geeks
AlgoExpert
Dies wurde von Google-Ingenieuren erstellt und ist auch eine hervorragende Ressource, um Ihre Fähigkeiten zu verbessern.
Projekt Euler
Sehr mathematisch ausgerichtet und nicht wirklich zum Codieren von Interviews geeignet
⬆ zurück nach oben
Okay, genug geredet, lasst uns lernen!
Aber vergessen Sie nicht, während des Lernens die oben genannten Codierungsaufgaben zu lösen!
Hier gibt es nichts zu implementieren, Sie schauen sich nur Videos an und machen sich Notizen! Juhuu!
Hier gibt es viele Videos. Schauen Sie einfach so lange zu, bis Sie es verstanden haben. Sie können jederzeit zurückkommen und eine Bewertung abgeben.
Machen Sie sich keine Sorgen, wenn Sie die ganze Mathematik dahinter nicht verstehen.
Sie müssen nur verstehen, wie man die Komplexität eines Algorithmus in Form von Big-O ausdrückt.
Harvard CS50 – Asymptotische Notation (Video)
Big-O-Notationen (allgemeines Kurz-Tutorial) (Video)
Big-O-Notation (und Omega und Theta) – beste mathematische Erklärung (Video)
Skiena (Video)
UC Berkeley Big O (Video)
Amortisierte Analyse (Video)
TopCoder (beinhaltet Wiederholungsrelationen und Master-Theorem):
Rechenkomplexität: Abschnitt 1
Rechenkomplexität: Abschnitt 2
Spickzettel
[Rezension] Analyse von Algorithmen (Playlist) in 18 Minuten (Video)
Nun, das ist in etwa genug davon.
Wenn Sie „Cracking the Coding Interview“ durchgehen, gibt es ein Kapitel zu diesem Thema und am Ende gibt es ein Quiz, um zu sehen, ob Sie die Laufzeitkomplexität verschiedener Algorithmen identifizieren können. Es ist ein super Review und Test.
⬆ zurück nach oben
zusammenhängend im Speicher, sodass die Nähe die Leistung steigert
Benötigter Platz = (Array-Kapazität, die >= n ist) * Größe des Elements, aber selbst wenn 2n, immer noch O(n)
O(1) zum Hinzufügen/Entfernen am Ende (amortisiert für Zuweisungen für mehr Speicherplatz), Index oder Aktualisierung
O(n) zum Einfügen/Entfernen an anderer Stelle
Üben Sie das Codieren mit Arrays und Zeigern sowie Zeigerberechnungen, um zu einem Index zu springen, anstatt die Indizierung zu verwenden.
Neues Rohdatenarray mit zugewiesenem Speicher
size() – Anzahl der Elemente
Capacity() – Anzahl der Elemente, die es aufnehmen kann
is_empty()
at(index) – gibt das Element an einem bestimmten Index zurück, explodiert, wenn der Index außerhalb der Grenzen liegt
push(item)
insert(index, item) – fügt das Element am Index ein, verschiebt den Wert dieses Index und die nachfolgenden Elemente nach rechts
prepend(item) – kann oben bei Index 0 einfügen
pop() – vom Ende entfernen, Wert zurückgeben
delete(index) – Element am Index löschen und alle nachfolgenden Elemente nach links verschieben
Remove(item) – sucht nach Wert und entfernt den Index, der ihn enthält (auch wenn er sich an mehreren Stellen befindet)
find(item) – sucht nach einem Wert und gibt den ersten Index mit diesem Wert zurück, -1, wenn er nicht gefunden wird
resize(new_capacity) // private Funktion
Unter der Haube kann ein int-Array zugewiesen werden, aber seine Funktionen werden nicht verwendet
Beginnen Sie mit 16, oder wenn die Startzahl größer ist, verwenden Sie eine Potenz von 2 – 16, 32, 64, 128
Wenn die Kapazität erreicht ist, verdoppeln Sie die Größe
Wenn beim Herausnehmen eines Elements die Größe 1/4 der Kapazität beträgt, ändern Sie die Größe auf die Hälfte
Arrays CS50 Harvard University
Arrays (Video)
UC Berkeley CS61B – Lineare und Multi-Dim-Arrays (Video) (Start ab 15 Min. 32 Sek.)
Dynamische Arrays (Video)
Gezackte Arrays (Video)
Über Arrays:
Implementieren Sie einen Vektor (veränderliches Array mit automatischer Größenänderung):
Zeit
Raum
Beschreibung (Video)
Keine Notwendigkeit zur Implementierung
size() – gibt die Anzahl der Datenelemente in der Liste zurück
empty() – bool gibt true zurück, wenn leer
value_at(index) – gibt den Wert des n-ten Elements zurück (beginnend bei 0 für das erste)
push_front(value) – fügt ein Element am Anfang der Liste hinzu
pop_front() – entfernt das vordere Element und gibt seinen Wert zurück
push_back(value) – fügt am Ende ein Element hinzu
pop_back() – entfernt das Endelement und gibt seinen Wert zurück
front() – ermittelt den Wert des vorderen Elements
back() – den Wert des Endelements abrufen
insert(index, value) – Wert am Index einfügen, sodass das neue Element am Index auf das aktuelle Element an diesem Index zeigt
erase(index) – entfernt den Knoten am angegebenen Index
value_n_from_end(n) – gibt den Wert des Knotens an der n-ten Position vom Ende der Liste zurück
reverse() – kehrt die Liste um
remove_value(value) – entfernt das erste Element in der Liste mit diesem Wert
Zeiger auf Zeiger
Kernverknüpfte Listen vs. Arrays (Video)
In der realen Welt: Verknüpfte Listen vs. Arrays (Video)
Verknüpfte Listen CS50 Harvard University – das stärkt die Intuition.
Einfach verknüpfte Listen (Video)
CS 61B – Verknüpfte Listen 1 (Video)
CS 61B – Verknüpfte Listen 2 (Video)
[Rezension] Verlinkte Listen in 4 Minuten (Video)
Beschreibung:
C-Code (Video) – nicht das gesamte Video, nur Teile zur Knotenstruktur und Speicherzuweisung
Verknüpfte Liste vs. Arrays:
Warum Sie verlinkte Listen meiden sollten (Video)
Gotcha: Sie benötigen Zeiger-zu-Zeiger-Kenntnisse: (Wenn Sie einen Zeiger auf eine Funktion übergeben, kann dies die Adresse ändern, auf die dieser Zeiger zeigt.) Diese Seite dient nur dazu, einen Überblick über ptr zu ptr zu bekommen. Ich empfehle diesen Listendurchlaufstil nicht. Lesbarkeit und Wartbarkeit leiden unter der Cleverness.
Implementieren (habe ich mit und ohne Tailpointer gemacht):
Doppelt verknüpfte Liste
Stapel (Video)
[Rezension] Stapelt in 3 Minuten (Video)
Wird nicht umgesetzt. Die Implementierung mit dem Array ist trivial
Eine schlechte Implementierung mit einer verknüpften Liste, bei der Sie am Anfang in die Warteschlange eingereiht und am Ende aus der Warteschlange entfernt werden, wäre O(n), da Sie das vorletzte Element benötigen würden, was zu einem vollständigen Durchlauf jeder Warteschlange führt
Enqueue: O(1) (amortisierte, verknüpfte Liste und Array [Probing])
Aus der Warteschlange entfernen: O(1) (verknüpfte Liste und Array)
leer: O(1) (verknüpfte Liste und Array)
enqueue(value) – fügt das Element am Ende des verfügbaren Speichers hinzu
dequeue() – gibt einen Wert zurück und entfernt das zuletzt hinzugefügte Element
leer()
voll()
enqueue(value) – fügt Wert an einer Position am Ende hinzu
dequeue() – gibt einen Wert zurück und entfernt das zuletzt hinzugefügte Element (vorne)
leer()
Warteschlange (Video)
Ringpuffer/FIFO
[Rezension] Warteschlangen in 3 Minuten (Video)
Implementieren Sie mithilfe einer verknüpften Liste mit Endzeiger:
Implementieren Sie mit einem Array fester Größe:
Kosten:
hash(k, m) – m ist die Größe der Hash-Tabelle
add(key, value) – wenn der Schlüssel bereits existiert, aktualisieren Sie den Wert
existiert(Schlüssel)
get(key)
(Schlüssel) entfernen
Kern-Hash-Tabellen (Video)
Datenstrukturen (Video)
Telefonbuchproblem (Video)
Verteilte Hash-Tabellen:
Sofortige Uploads und Speicheroptimierung in Dropbox (Video)
Verteilte Hash-Tabellen (Video)
Hashing mit Chaining (Video)
Tischverdoppelung, Karp-Rabin (Video)
Offene Adressierung, kryptografisches Hashing (Video)
PyCon 2010: Das mächtige Wörterbuch (Video)
PyCon 2017: Das Wörterbuch noch mächtiger (Video)
(Erweiterte) Randomisierung: Universelles und perfektes Hashing (Video)
(Fortgeschritten) Perfektes Hashing (Video)
[Rezension] Hash-Tabellen in 4 Minuten (Video)
Videos:
Online-Kurse:
Implementieren Sie mit Array und linearer Sondierung
⬆ zurück nach oben
Binäre Suche (auf einem sortierten Array von Ganzzahlen)
Binäre Suche mittels Rekursion
Binäre Suche (Video)
Binäre Suche (Video)
Detail
Entwurf
[Rezension] Binäre Suche in 4 Minuten (Video)
Implementieren:
Absolute Ganzzahl
Tauschen
4 Möglichkeiten, Bits in einem Byte zu zählen (Video)
Bits zählen
So zählen Sie die Anzahl der gesetzten Bits in einer 32-Bit-Ganzzahl
Binär: Pluspunkte und Minuspunkte (Warum wir das Zweierkomplement verwenden) (Video)
1er-Komplement
2er-Komplement
Worte
Gute Einführung: Bit-Manipulation (Video)
C-Programmier-Tutorial 2-10: Bitweise Operatoren (Video)
Bit-Manipulation
Bitweise Operation
Bithacks
Der Bit-Twiddler
The Bit Twiddler Interactive
Bit Hacks (Video)
Übungsoperationen
Sie sollten viele der Zweierpotenzen von (2^1 bis 2^16 und 2^32) kennen.
Bits-Spickzettel
Erhalten Sie ein wirklich gutes Verständnis für die Manipulation von Bits mit: &, |, ^, ~, >>, <<
2er- und 1er-Komplement
Setzte Bits zählen
Werte tauschen:
Absoluter Wert:
⬆ zurück nach oben
BFS-Hinweise:
DFS-Hinweise:
Ebenenreihenfolge (BFS, mit Warteschlange)
Zeitkomplexität: O(n)
Raumkomplexität: am besten: O(1), am schlechtesten: O(n/2)=O(n)
Zeitkomplexität: O(n)
Raumkomplexität: am besten: O(log n) – Durchschn. Höhe des Baumes am schlechtesten: O(n)
inorder (DFS: links, selbst, rechts)
Postorder (DFS: links, rechts, selbst)
Vorbestellung (DFS: self, left, right)
Einführung in Bäume (Video)
Baumdurchquerung (Video)
BFS (Breitensuche) und DFS (Tiefensuche) (Video)
[Rezension] Breitensuche in 4 Minuten (Video)
[Rezension] Tiefensuche in 4 Minuten (Video)
[Rezension] Tree Traversal (Playlist) in 11 Minuten (Video)
einfügen // Wert in Baum einfügen
get_node_count // Anzahl der gespeicherten Werte abrufen
print_values // druckt die Werte im Baum, von min bis max
delete_tree
is_in_tree // gibt true zurück, wenn ein bestimmter Wert im Baum vorhanden ist
get_height // gibt die Höhe in Knoten zurück (die Höhe eines einzelnen Knotens ist 1)
get_min // gibt den im Baum gespeicherten Mindestwert zurück
get_max // gibt den im Baum gespeicherten Maximalwert zurück
is_binary_search_tree
delete_value
get_successor // gibt den nächsthöheren Wert im Baum nach dem angegebenen Wert zurück, -1, wenn keiner vorhanden ist
Binärer Suchbaum – Implementierung in C/C++ (Video)
BST-Implementierung – Speicherzuweisung in Stack und Heap (Video)
Finden Sie das minimale und maximale Element in einem binären Suchbaum (Video)
Ermitteln Sie die Höhe eines Binärbaums (Video)
Durchquerung binärer Bäume – Breiten- und Tiefenstrategien (Video)
Binärbaum: Level Order Traversal (Video)
Durchquerung des Binärbaums: Preorder, Inorder, Postorder (Video)
Überprüfen Sie, ob ein Binärbaum ein binärer Suchbaum ist oder nicht (Video)
Einen Knoten aus dem binären Suchbaum löschen (Video)
Inorder-Nachfolger in einem binären Suchbaum (Video)
Überprüfung des binären Suchbaums (Video)
Einführung (Video)
MIT (Video)
C/C++:
Implementieren:
einfügen
sift_up – wird zum Einfügen benötigt
get_max – gibt das maximale Element zurück, ohne es zu entfernen
get_size() – Anzahl der gespeicherten Elemente zurückgeben
is_empty() – gibt true zurück, wenn der Heap keine Elemente enthält
extract_max – gibt das maximale Element zurück und entfernt es
sift_down – benötigt für extract_max
Remove(x) – entfernt Element am Index x
heapify – Erstellt einen Heap aus einem Array von Elementen, die für heap_sort benötigt werden
heap_sort() – Nehmen Sie ein unsortiertes Array und wandeln Sie es mithilfe eines Max-Heaps oder Min-Heaps direkt in ein sortiertes Array um
Wird als Baum dargestellt, ist jedoch normalerweise linear in der Speicherung (Array, verknüpfte Liste).
Haufen
Einführung (Video)
Binärbäume (Video)
Bemerkung zur Baumhöhe (Video)
Grundlegende Operationen (Video)
Vollständige Binärbäume (Video)
Pseudocode (Video)
Heap Sort – springt zum Start (Video)
Heap-Sortierung (Video)
Einen Haufen bauen (Video)
MIT 6.006 Einführung in Algorithmen: Binäre Heaps
CS 61B Vorlesung 24: Prioritätswarteschlangen (Video)
Lineare Zeit BuildHeap (max-heap)
[Rezension] Heap (Playlist) in 13 Minuten (Video)
Implementieren Sie einen Max-Heap:
⬆ zurück nach oben
Hinweise:
Ich würde nicht empfehlen, eine verknüpfte Liste zu sortieren, aber eine Zusammenführungssortierung ist machbar.
Sortierung für verknüpfte Liste zusammenführen
Stabilität des Sortieralgorithmus
Stabilität in Sortieralgorithmen
Stabilität in Sortieralgorithmen
Sortieralgorithmen - Stabilität
Keine Blasensortierung – es ist schrecklich – O(n^2), außer wenn n <= 16
Implementieren Sie Sortierungen und kennen Sie den besten/schlechtesten Fall sowie die durchschnittliche Komplexität jedes einzelnen:
Stabilität in Sortieralgorithmen („Ist Quicksort stabil?“)
Welche Algorithmen können für verknüpfte Listen verwendet werden? Welche auf Arrays? Welches von beiden?
Informationen zur Heapsortierung finden Sie oben in der Heap-Datenstruktur. Heap-Sortierung ist großartig, aber nicht stabil
Sedgewick - Mergesort (5 Videos)
1. Zusammenführen
2. Bottom-up-Mergesort
3. Komplexität sortieren
4. Vergleicher
5. Stabilität
Sedgewick - Quicksort (4 Videos)
1. Quicksort
2. Auswahl
3. Doppelte Schlüssel
4. Systemsortierungen
UC Berkeley:
CS 61B Vorlesung 29: Sortieren I (Video)
CS 61B Vorlesung 30: Sortieren II (Video)
CS 61B Vorlesung 32: Sortieren III (Video)
CS 61B Vorlesung 33: Sortieren V (Video)
CS 61B 21.04.2014: Radix Sort (Video)
Blasensortierung (Video)
Blasensortierung analysieren (Video)
Einfügungssortierung, Zusammenführungssortierung (Video)
Einfügungssortierung (Video)
Sortierung zusammenführen (Video)
Quicksort (Video)
Auswahlsortierung (Video)
Sortiercode zusammenführen:
Verwenden des Ausgabearrays (C)
Ausgabearray verwenden (Python)
Direkt (C++)
Schneller Sortiercode:
Implementierung (C)
Implementierung (C)
Implementierung (Python)
[Rezension] Sortierung (Playlist) in 18 Minuten
Schnelle Sortierung in 4 Minuten (Video)
Heap-Sortierung in 4 Minuten (Video)
Zusammenführungssortierung in 3 Minuten (Video)
Blasensortierung in 2 Minuten (Video)
Auswahlsortierung in 3 Minuten (Video)
Einfügungssortierung in 2 Minuten (Video)
Implementieren:
Mergesort: O(n log n) Durchschnitt und schlechtester Wert