Also entschied ich mich für den Sommer, dass ich vor dem Schulstart mit dem Lernen von Algorithmen beginnen sollte. Mir wurde gesagt, dass die Klasse ziemlich schnell ist, und diese Algorithmen sollten Sie nicht auf die leichte Schulter nehmen (ich habe die Tendenz, dies während des gesamten Semesters während des Semesters zu tun, lol).
Das Buch, das wir verwenden werden, ist Algorithms (4th Edition) . Wie auch immer, das ist mein Problem.
Ich bin fast der dritte Weg durch das Buch, aber ich habe gerade realisiert, was ich mache. Zum Beispiel würde ich die Abschnitte lesen und neu lesen, die ich nicht ganz verstehe. Wenn ich mich dann sicher genug fühle, würde ich versuchen, den gleichen Algorithmus in Java von meinem Kopf zu reproduzieren. Aber dadurch sieht mein Code fast genauso aus wie in dem Buch ... in Java.
Ich kann nicht sagen, dass ich mir Code für Code einpräge - ich verstehe die Konzepte und sie helfen mir, diese Algorithmen zu programmieren - aber ich glaube, ich werde diese Algorithmen nur in Java implementieren können. Ich sollte beachten, dass ich im Moment nur Java kenne.
tldr: Ich lerne Algorithmen, als würde ich Gitarre spielen lernen - Wiederholung nach Wiederholung. Aber dadurch fühle ich mich mehr fixiert, als dass ich diese nur in Java implementieren kann. Wie genau würden Sie Algorithmen lernen, wenn das Buch, das Sie verwenden, sprachspezifisch ist?
Vielen Dank im Voraus.
Sie studieren Java, schreiben Sie sie also in Java. Besonders wenn Java Ihre Muttersprache ist. Verwechsle dich jetzt nicht, denn du versuchst 2 Dinge auf einmal zu lernen: wie man in Java programmiert und wie man progam programmiert. Du lernst sowohl eine neue Sprache als auch eine Art zu denken. Mach nicht zu viel, sondern füge der Soße vorerst eine andere Sprache hinzu.
Später, oder wenn Sie sich sicher genug fühlen, dass Sie gleichzeitig eine andere Sprache übernehmen können, wäre es natürlich vorteilhaft, eine andere Sprache zu lernen und die Algorithmen zu replizieren, ohne das Buch zu betrachten.
Wir könnten Ihnen empfehlen, nach Derivaten der Algorithmen zu suchen. Bekannte Varianten, die dokumentiert wurden und wo Sie einfach die Beschreibung der Variante lesen konnten, so dass Sie versuchen können, sie von der "Basis" -Version aus zu implementieren, ohne das Buch lesen zu müssen.
Wenn Ihr Buch Sie beispielsweise in eine verknüpfte Liste einführte, sollten Sie in der Lage sein, den Algorithmus für eine doppelt verknüpfte Liste oder eine zirkulär verknüpfte Liste zu erstellen, ohne mehr als eine Beschreibung des gewünschten Ergebnisses zu lesen. Oder es gibt etwas über die ursprünglichen Konzepte, die Sie eindeutig missverstanden haben.
Ich würde Ihnen sogar empfehlen, die in Ihrem Buch beschriebenen Algorithmen zu implementieren, bevor sie Ihnen angezeigt werden . Der Sinn von Sedgewicks Algorithmus besteht darin, eine kanonische Implementierung zu sehen, die als Standard-Blaupause betrachtet wird. Wenn Sie nur den Abschnitt lesen, der zur Implementierung führt (der hoffentlich zuerst angezeigt wird), dann setzen Sie sich einfach mit dem Buch hin und versuchen Sie herauszufinden, wie Sie das machen könnten. Wenn Sie das überhaupt nicht können, dann sind Sie in Ihrem Buch zu weit voraus und sollten zurückgehen und von vorne anfangen.
Da es sich um Algorithmen handelt, sind sie im Wesentlichen sprachunabhängig. Es gibt wirklich nichts, was dich daran hindert, Sedgewicks Beispiele in C, Python oder einer anderen Sprache zu machen.
Wenn Sie wirklich keine anderen Sprachen kennen, konzentrieren Sie sich auf Java. Sicher, es ist ein bisschen repetitiv, aber diese Bits werden in Ihrem Kopf in einer guten Weise bleiben und kommen Testzeit, Sie werden sich für die Informationen freuen.
Sie befinden sich gerade in einer interessanten Position, da das Denken, das zum Schreiben von Programmen erforderlich ist, sich sehr vom normalen Denken unterscheidet. Hinzu kommt die Tatsache, dass Sie eine komplett neue Sprache mit einer anderen Syntax, Interpunktion und ähnlichem lernen. Übung macht wirklich perfekt, da es viele Kleinigkeiten gibt, an die man sich erinnern kann.
Wenn Sie mit Algorithmen üben möchten, probieren Sie project euler , code kata und andere Challenge-Sites. Diese kleinen Herausforderungen können Ihnen helfen, sich mit der Sprache vertraut zu machen und sich mit der Art des Denkens vertraut zu machen.
Zuerst, Glückwunsch, dass Sie Ihre ersten Schritte zum Codieren lernen. Ich würde sagen, dass Sie Ihren Kollegen bereits voraus sind, indem Sie im Sommer nach vorne schauen.
Soweit Sie befürchten, dass Sie nur Algorithmen in Java implementieren können, haben Sie bereits gezeigt, dass dies für Sie kein Problem darstellt. Es klingt, als ob Sie leidenschaftlich genug sind, um früh loszulegen, also sollten Sie keine Probleme haben, eine Lösung in mehreren Sprachen zu implementieren. Außerdem sind die meisten Sprachen mit C / C ++ (Java und C #, um nur einige zu nennen) Syntax ähnlich genug, dass Sie in der Lage sein werden, Ihr Wissen nahtlos zu übersetzen.
Der beste Rat, den ich geben kann, ist CODE, CODE, CODE !! Lesen Sie nicht nur über die Algorithmen, die sie tatsächlich implementieren.
Sie sagen nicht, wie gut Sie die Mathematik hinter den Algorithmen kennen. Das ist der Schlüssel zur Bestimmung Ihrer Einrichtung mit dem Code.
Sedgewicks Bücher sind sehr gut. Ich würde mich frei fühlen, einige zu suchen und andere Bücher wie "Numerical Recipes" und "Numerical Methods That Work" zu überprüfen. Sehen Sie, ob eine andere Sichtweise für Sie klären kann.
Wenn Sie nicht das Gefühl haben, dass Sie genug davon haben, Java zu kopieren, sehen Sie, ob Sie sie in eine andere Sprache übersetzen können, vielleicht Python oder eine rein funktionale Alternative. Wenn Sie das tun können, werden Sie wissen, dass Sie es haben.
Ich würde entweder versuchen, eine andere Sprache zu lernen, um zu überprüfen, dass man sie in eine andere Sprache portieren kann (Javascript wäre meine Stimme, weil sie einfach und nützlich ist) oder schreibe die Algorithmen in Pseudocode, weil das ist mehr Sprache agnostisch. In den meisten Sprachen wird der Code sehr ähnlich aussehen. Die einzige Sache, auf die man sehr genau achten sollte, ist, wenn man sich auf einen Aspekt der Sprache verlässt (wie Generika oder Iteratoren in Java), den man vielleicht nicht in einer anderen Sprache verwenden kann und der eine Verständnislücke hinterlassen könnte / p>
Eine weitere Möglichkeit zu überprüfen, ob Sie den Algorithmus wirklich verstehen, besteht darin, geringfügige Änderungen am Problem vorzunehmen und sicherzustellen, dass Sie den Algorithmus so anpassen können, dass er weiterhin funktioniert. Wenn es sich zum Beispiel um einen Sortieralgorithmus handelt, versuchen Sie, nach mehreren verschiedenen Attributen zu sortieren, und nicht nur nach einem, wenn es sich um einen Graphalgorithmus handelt, machen Sie den Graphen zu einem Digraph und sehen Sie, wie sich die Dinge ändern sollten.
Ich lerne Algorithmen, als würde ich lernen, das zu spielen Gitarre - Wiederholung nach Wiederholung.
Dann lernst du keine Algorithmen. Du lernst Wiederholung. Zwei verschiedene Dinge. Die Verwendung einer Programmiersprache durch ein Algorithmenbuch ist ein sekundärer Faktor. Es ist nur ein Vehikel des Unterrichts, ein Implementierungsdetail.
Sie sollten sich darauf konzentrieren, die Struktur, Logik und mathematischen Eigenschaften eines Algorithmus (und möglicherweise der damit verbundenen Datenstruktur (en)) zu verstehen.)
Darauf sollten Sie achten.
Aber wenn ich das tue, fühle ich mich, als wäre ich mehr fixiert, was ich nur kann um diese in Java zu implementieren.
Aber das liegt daran, dass Sie sich darauf konzentrieren, wie der Algorithmus codiert wird (in diesem Fall in Java). Sie konzentrieren sich auf ein Implementierungsdetail.
Wenn Sie fahren lernen, konzentrieren Sie sich nicht darauf, wie Sie einen Honda Civic oder einen Nissan Maxima fahren lernen. Sie lernen die Essenz dessen, was Fahren ist, die Regeln der Daumen, die notwendigen Vorsichtsmaßnahmen und die Gesetze, die das Führen eines Fahrzeugs regeln.
Gleiches gilt für Lernalgorithmen. Sie lernen "Algorithmen in Java" nicht mehr als "Algorithmen in Haskell". Sie lernen Algorithmen in erster Linie, das Fahrzeug (sans sehr spezielle Fälle) ist sekundär.
Sie sollten sich auf konzentrieren, was der Algorithmus tut, wie und warum . Fragen wie "Wie / warum funktioniert es?" und vor allem * "Was sind die Leistungsmerkmale?", Das sind die Dinge, auf die Sie sich konzentrieren sollten.
Jedes gute Algorithmenbuch (Sedgewicks eingeschlossen) trägt diese Botschaft. Darauf solltest du dich konzentrieren. Wie Sie zu dieser Neuausrichtung kommen, hängt von den eigenen Lernstrategien ab.
Wie genau würden Sie Algorithmen lernen, wenn das Buch, das Sie verwenden, sprachspezifisch ist?
Indem Sie sich nicht auf die Sprache konzentrieren. Fokus auf die Struktur, Fokus auf die beteiligten Datenstrukturen, Invarianten, Vorbedingungen und Nachbedingungen Verstehen Sie asymptotisches Verhalten, das in Big-O- (oder Big-Omicron-), Little-O / Little-Omicron- und Omega-Notationen beschrieben wird.
Sie lernen Algorithmen und programmieren nicht in Java über Codierungsalgorithmen.
Wenn du diesen Gedankensprung nicht machen kannst, bedeutet das, dass du keine ausreichende Übung oder abstrakte Analyse hast. Es ist keine Beleidigung, sondern eine Beobachtung und ein Ratschlag. Codierung, die Verwendung einer Programmiersprache ist in der Regel sekundär zu der mathematischen Analyse des Computing, der Schwerpunkt der Informatik (von denen Algorithmen ein Teil davon ist.)
HINWEIS Ich habe Java seit über 10 Jahren gemacht, und obwohl ich es für die Arbeit mag, glaube ich fest daran, dass es ein schlechtes Werkzeug zum Erlernen von Programmier- oder CS-Themen ist .
Man kann besser lernen, indem man Algorithmen lernt, entweder mit A) einer prozeduralen Programmiersprache auf Systemebene wie C oder Ada oder einem High-Level Pseudo-Assembler-Simulator oder B) einer funktionalen Sprache wie Lisp oder Haskell.
Objektorientierte Features in reinen / pseudo-reinen OO-Sprachen stehen einfach im Weg.
Algorithmen sind mathematische Strukturen mit einer Natur, die das Wie (operativ) und / oder das Was (mathematisch) beschreibt. Ersteres eignet sich hervorragend für die prozedurale Programmierung, später für die funktionale Programmierung.