Ihre Lieblings-Algorithmus und die Lektion, die es Ihnen beigebracht hat
Welchen Algorithmus lehrte Sie am meisten über die Programmierung oder eine bestimmte Sprache Funktion?
Wir haben alle schon diese Momente, in denen alle von einer plötzlichen wir wissen, nur wissen, haben wir gelernt, eine wichtige Lektion für die Zukunft, basierend auf schließlich das Verständnis eines Algorithmus, geschrieben von einem Programmierer ein paar Stufen auf der Evolutionsleiter. Deren Ideen und code hatte Magie auf Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
"To iterate is human, to recurse göttlichen" - zitiert in 1989 an der Hochschule.
P. S. Geschrieben von Woodgnome während der Wartezeit für die zum mitmachen einladen
Allgemeine algorithmen:
Numerischen Zusammenhang:
Anzahl Theorie-Bezug:
Ich auch gerne studieren quantum computing (Shor und Deutsch-Josza algorithmen zum Beispiel): dies lehrt dich, zu denken, out of the box.
Wie Sie sehen können, ich bin ein bisschen voreingenommen in Richtung Mathematik-algorithmen 🙂
Floyd-Warshall alle-Paare-kürzeste-Pfade-Algorithmus
Ist hier, warum es cool ist: wenn Sie zuerst lernen, über die kürzeste-Wege-problem in Ihrem Diagramm, Theorie-Kurs, die Sie wahrscheinlich beginnen mit der Dijkstra-Algorithmus löst single-source-shortest-path. Es ist ziemlich kompliziert auf den ersten, aber dann Sie get over it, und Sie voll und ganz verstanden.
Dann sagt der Lehrer "Jetzt wollen wir dasselbe problem zu lösen, aber für ALLE Quellen". Sie denken sich, "Oh Gott, das wird ein viel härteres problem! Es werden mindestens N-mal komplizierter als der Dijkstra-Algorithmus!!!".
Dann der Lehrer gibt Floyd-Warshall. Und dein Geist explodiert. Dann beginnen Sie zu zerreißen, wie schön einfach der Algorithmus ist. Es ist nur eine dreifach verschachtelte Schleife. Es nutzt nur ein einfaches array für die Daten-Struktur.
Die meisten eye-opening ist für mich die folgende Erkenntnis: angenommen, Sie haben eine Lösung für problem a: Dann haben Sie ein größeres "superproblem" B enthält A. problem Die Lösung zu problem B kann in der Tat einfacher als die Lösung zu problem A.
Huffman-Codierung wäre mir, ich hatte ursprünglich meine eigene dumm-version durch die Minimierung der Anzahl der bits, die zum codieren von text von 8 bis zu weniger, aber hatte nicht gedacht, über variable Anzahl von bits, je nach Frequenz. Dann fand ich die huffman-Kodierung beschrieben in einem Artikel in einer Zeitschrift, und es eröffnet viele neue Möglichkeiten.
Quicksort. Es zeigte mir, dass die Rekursion kann mächtig und nützlich.
Diese eine Aussage mag trivial klingen, aber es war eine Offenbarung für mich an der Zeit.
Ich war in meiner ersten Programmier-Klasse(VB6) und der Prof hatte nur hat uns gelehrt, über die Zufallszahlen und er gab folgende Anweisungen: "Erstellen Sie einen virtuellen Lotto-Maschine. Stellen Sie sich eine Glaskugel voller 100 ping-pong-Bälle von 0 bis 99. Wählen Sie nach dem Zufallsprinzip und zeigen Sie Ihre Nummer, bis Sie alle ausgewählt haben, werden keine Duplikate."
Alle anderen schrieben Ihre Programm wie diesem: Wählen Sie einen ball, stellen Sie seine Nummer in einen bereits ausgewählten Liste" und wählen Sie dann einen anderen ball. Überprüfen, um zu sehen, wenn es schon ausgewählt ist, wenn ja, wähle einen anderen ball, wenn nicht die Nummer auf der "bereits ausgewählt list" etc....
Natürlich am Ende, Sie machten Hunderte von vergleichen zu finden, die wenigen Bälle, die nicht bereits ausgewählt worden. Es war wie das werfen Sie die Bälle wieder zurück in das Glas, nachdem Sie Sie auswählen. Meine Offenbarung war, zu werfen Bälle Weg nach dem pflücken.
Ich weiß, das klingt Geistes-betäubend offensichtlich, aber dies war der moment, in dem der "programmierschalter" bekam, blätterte in meinem Kopf. Dies war der moment, Programmierung ging aus versuchen zu lernen, in der fremden Sprache zu versuchen, herauszufinden, einen angenehmen puzzle. Und einmal habe ich die geistige Verbindung zwischen Programmier-und Spaß gab es wirklich kein halten mir.
Bresenham ' s line drawing Algorithmus hat mich interessiert in Echtzeit-Grafik-rendering. Dies kann verwendet werden um render-Polygone, wie Dreiecke, für Dinge wie 3D-Modell-rendering.
Recursive-Descent-Parsing - Ich erinnere mich sehr beeindruckt, wie solche einfachen code, könnte etwas so scheinbar komplexe.
Quicksort in Haskell:
Obwohl ich konnte schreiben würdest, Haskell an der Zeit, ich Verstand diesen code und mit Rekursion und quicksort-Algorithmus. Es machte einfach Klick und da war es...
Des iterativen Algorithmus für die Fibonacci, weil es für mich nagelfest ist die Tatsache, dass die meisten eleganten code (in diesem Fall die rekursive version) ist nicht unbedingt der effizienteste.
Zu erarbeiten, - Die "fib(10) = fib(9) + fib(8)" Ansatz bedeutet, dass fib(9) ausgewertet werden, fib(8) + fib(7). So die Auswertung von fib(8) (und dafür fib7, fib6) werden zweimal beurteilt.
Die iterative Methode (curr = prev1 + prev2 in einer forloop) nicht der Baum, aus diese Weise, noch braucht es so viel Speicher, da es nur 3 transiente Variablen, die anstelle von n frames in der rekursions-stack.
Tendiere ich zu Streben nach einfachen, eleganten code, wenn ich die Programmierung, aber dies ist der Algorithmus, der half mir klar, dass dies nicht das Ende-all-sein-all das für das schreiben von software, und dass letztlich die Endverbraucher kümmern sich nicht, wie der code aussieht.
Aus irgendeinem Grund mag ich die Schwartzian verwandeln
Wo foo($) stellt eine compute-intensiven Ausdruck, der nimmt $ (jedes Element der Liste in turn) und erzeugt den entsprechenden Wert, der verglichen werden, die in seinem Willen.
Minimax hat mich gelehrt, dass Schach-Programme sind nicht intelligent, Sie denken einfach mehr vorwärts bewegt, als Sie können.
Ich weiß nicht, ob dies qualifiziert als ein Algorithmus, oder nur ein klassisches hack. In jedem Fall, es half mir, mich zu beginnen, denken außerhalb der box.
Swap 2 ganze zahlen, ohne eine temporäre variable (in C++)
Quicksort: Bis ich auf eine Hochschule kam, hatte ich noch nie die Frage gestellt, ob brute-force Bubble-Sort wurde die effizienteste Art und Weise zu Sortieren. Es schien nur intuitiv offensichtlich. Aber ausgesetzt, um nicht-offensichtliche Lösungen wie Quicksort hat mich gelehrt, zu schauen Vergangenheit die offensichtliche Lösung zu sehen, wenn etwas besseres vorhanden ist.
Für mich ist es der weak-heapsort Algorithmus, denn es zeigt (1), wie viel eine klug gewählte Datenstruktur (und die algorithmen arbeiten) können die Leistung beeinflussen und (2), die faszinierende Dinge entdecken kann, die noch in alten, bekannten Dinge. (weak-heapsort ist die beste Variante von allen-heap sortiert, das war bewährt acht Jahre später.)
Dies ist zu langsam 🙂
Lernte ich sehr viel über die beiden C und Computern im Allgemeinen durch das Verständnis Duffs Device und XOR-swaps
EDIT:
@Jason Z, das ist mein XOR swap 🙂 cool ist es nicht.
Aus irgendeinem Grund Bubble-Sort hat, Stand immer zu mir. Nicht, weil es elegant oder gut nur weil es hatte/hat einen doofen Namen, nehme ich an.
Ich nicht Lieblings - -- es gibt so viele schöne zur Auswahl-aber ich habe immer gefunden, faszinierend ist die Bailey–Borwein–Plouffe (BBP) Formel, die ermöglicht Ihnen die Berechnung einer beliebigen Ziffer von pi ohne Kenntnis über die vorstehenden Ziffern.
RSA führte mich in die Welt der modularen Arithmetik, die verwendet werden, um lösen ein überraschend Anzahl der interessant Probleme!
Ist noch nicht lehrte Sie mich viel, aber die Johnson–Trotter-Algorithmus nie versagt, um mich umhauen.
Binary decision diagrams, obwohl formell nicht ein Algorithmus, sondern ein datastructure, führen zu eleganten und minimalen Lösungen für verschiedene Arten von (booleschen) Logik-Probleme. Sie wurden erfunden und entwickelt zur Minimierung der gate-rechnen im chip-design, und kann gesehen werden, als eine der Grundlagen der Silizium-revolution. Die resultierenden algorithmen sind verblüffend einfach.
Was Sie mich gelehrt:
Für mich, das einfache tauschen Kelly & Pohl Ein Buch über C, um zu demonstrieren, call-by-reference flippte mich raus, als ich es das erste mal sah. Ich sah es an, und der Zeiger eingeschnappt. Wörtlich. . .
Den Türme von Hanoi Algorithmus ist eine der schönsten algorithmen. Es zeigt, wie Sie mithilfe von Rekursion zu lösen, ein problem auf eine viel elegantere Weise als die iterative Methode.
Alternativ die Rekursion Algorithmus für die Fibonacci-Folge und die Berechnung von Potenzen einer Zahl zeigen die umgekehrte situation der rekursive Algorithmus verwendet wird, zum Wohle der Rekursion statt, die einen guten Mehrwert.
Wissen Sie, dass die fibonacci ist eine geschlossene form-Lösung, mit der direkten Berechnung des Ergebnisses in eine Feste Anzahl von Schritten, richtig? Nämlich (phin - (1 - phi)n) /sqrt(5). Es fällt mir immer wieder als etwas bemerkenswert, dass diese Rendite eine ganze Zahl, aber es funktioniert.
phi ist der goldene Schnitt, natürlich; (1 + sqrt(5)) /2.
Einen Algorithmus generiert eine Liste von Primzahlen zu vergleichen jede Zahl an die aktuelle Liste der Primzahlen, hinzufügen, falls es nicht gefunden, und für die Rückgabe der Liste der Primzahlen am Ende. Geistes-Biege-in mehrfacher Hinsicht, nicht zuletzt von denen die Idee mit dem teilweise-abgeschlossen-Ausgang als primären Suchkriterien.
Speichern von zwei-Zeiger in einem einzigen Wort für eine doppelt verkettete Liste, unterrichtete mich die Lektion, die Sie tun können, sehr böse Dinge in C in der Tat (mit dem ein konservativer GC, wird ne Menge ärger).
Die meisten stolz, ich habe schon von eine Lösung schreiben war etwas sehr ähnlich zu dem DisplayTag-Paket. Es hat mich gelehrt, eine Menge über das code-design, Wartbarkeit und Wiederverwendung. Ich schrieb es auch vor DisplayTag, und es wurde versenkt in eine NDA-Vereinbarung, so konnte ich nicht open source, aber ich kann noch sprechen gushingly darum, dass man in job-interviews.
Map/Reduce. Zwei einfache Konzepte, die zusammen passen, um ein laden von Daten-Verarbeitung-Aufgaben einfacher zu parallelisieren.
Oh... und es ist nur die Grundlage für Massiv-parallele Indizierung:
http://labs.google.com/papers/mapreduce.html
Nicht mein Favorit, aber die Der Miller-Rabin-Algorithmus for testing primality zeigte mir, dass Recht fast die ganze Zeit, ist gut genug für fast alle der Zeit. (also nicht das Misstrauen ein probabilistischer Algorithmus, nur weil es eine Wahrscheinlichkeit, sich zu irren.)
@Krishna Kumar
Den bitweisen Lösung ist sogar noch mehr Spaß als die rekursive Lösung.
Binäre Suche müssen die meisten einfachen und eleganten Algorithmus. Der Grund der Daten, die sortiert werden muss und für das der merge-sort-Algorithmus ist sehr einfach und elegant.
Die Lektion ist, dass eine Lösung gefunden werden kann, die in ganz unerwartete Bereiche, und es sind sehr überraschende verbindungen zwischen verschiedenen Gebieten algorithmen und Mathematik.
Einige algorithmen, Prinzipien oder tricks, die noch nicht angeführt wurden: