Welche Programmiersprache würden Sie empfehlen , zu lernen , über Datenstrukturen und Algorithmen in?
Berücksichtigt man Folgendes:
- Persönliche Erfahrung
- Sprachfunktionen (Zeiger, OO usw.)
- Eignung zum Erlernen von DS & A-Konzepten
Ich frage, weil es einige Bücher gibt, die programmiersprachenunabhängig sind (aus mathematischer Sicht geschrieben und Pseudocode verwenden). Wenn ich aus einer dieser Methoden lerne, möchte ich eine Programmiersprache zum Codieren und Ausführen der Algorithmen auswählen.
Dann gibt es andere Bücher, in denen DS & A-Konzepte mit Beispielen vorgestellt werden, die in einer bestimmten Programmiersprache geschrieben wurden - und ich möchte diese Algorithmen auch codieren -, sodass die Sprache bis zu einem gewissen Grad auch das Buch auswählt.
In jedem Fall muss ich eine Sprache auswählen, und ich würde es vorziehen, mich durchgehend an eine zu halten. Welche persönlichen Sprachpräferenzen sind für diesen Zweck am besten geeignet?
Antworten:
Die Antwort auf diese Frage hängt genau davon ab, was Sie lernen möchten.
Python und Ruby
Hochsprachen wie Python und Ruby werden häufig empfohlen, da sie Hochstufensprachen sind und die Syntax gut lesbar ist. Diese Sprachen haben jedoch alle Abstraktionen für die gemeinsamen Datenstrukturen. Nichts hindert Sie daran, Ihre eigenen Versionen als Lernübung zu implementieren, aber Sie stellen möglicherweise fest, dass Sie Datenstrukturen auf hoher Ebene auf anderen Datenstrukturen auf hoher Ebene aufbauen, was nicht unbedingt nützlich ist.
Außerdem sind Ruby und Python dynamisch typisierte Sprachen. Dies kann gut sein, aber es kann auch für den Anfänger verwirrend sein und es kann (anfangs) schwieriger sein, Fehler zu erkennen, da sie normalerweise erst zur Laufzeit sichtbar werden.
C.
C ist am anderen Extrem. Es ist gut, wenn Sie wirklich einfache Details wie die Verwaltung des Speichers erfahren möchten, aber die Speicherverwaltung ist plötzlich eine wichtige Überlegung, wie bei der korrekten Verwendung von malloc () / free (). Das kann ablenken. Außerdem ist C nicht objektorientiert. Das ist keine schlechte Sache, aber einfach erwähnenswert.
C ++
C ++ wurde erwähnt. Wie ich im Kommentar sagte, halte ich dies für eine schreckliche Wahl. C ++ ist selbst bei einfacher Verwendung schrecklich kompliziert und hat eine lächerliche Menge an "Fallstricken". Außerdem hat C ++ keine gemeinsame Basisklasse. Dies ist wichtig, da Datenstrukturen wie Hash-Tabellen von einer gemeinsamen Basisklasse abhängen. Sie könnten eine Version für eine nominelle Basisklasse implementieren, diese ist jedoch etwas weniger nützlich.
Java
Java wurde ebenfalls erwähnt. Viele Leute hassen Java gerne und es ist wahr, dass die Sprache extrem ausführlich ist und einige der moderneren Sprachfunktionen (z. B. Abschlüsse) fehlen, aber nichts davon ist wirklich wichtig. Java ist statisch typisiert und verfügt über eine Garbage Collection. Dies bedeutet, dass der Java-Compiler viele Fehler abfängt, die dynamisch typisierte Sprachen (bis zur Laufzeit) nicht haben, und dass Segmentierungsfehler nicht behoben werden (was nicht heißt, dass Sie in Java keinen Speicher verlieren können; offensichtlich können Sie dies). Ich denke, Java ist eine gute Wahl.
C #
C # Die Sprache ist wie eine modernere Version von Java. Wie Java ist es eine verwaltete (durch Müll gesammelte) kompilierte Zwischensprache, die auf einer virtuellen Maschine ausgeführt wird. Alle anderen hier aufgeführten Sprachen außer C / C ++ werden ebenfalls auf einer virtuellen Maschine ausgeführt, aber Python, Ruby usw. werden direkt interpretiert und nicht zu Bytecode kompiliert.
C # hat im Grunde die gleichen Vor- und Nachteile wie Java.
Haskell (etc)
Schließlich haben Sie funktionale Sprachen: Haskell, OCaml, Scheme / Lisp, Clojure, F # usw. Diese denken über alle Probleme auf eine ganz andere Art und Weise nach und sind es wert, irgendwann gelernt zu werden, aber es kommt wieder darauf an, was Sie lernen möchten: funktionale Programmierung oder Datenstrukturen? Ich würde mich daran halten, jeweils eine Sache zu lernen, anstatt das Thema zu verwirren. Wenn Sie irgendwann eine funktionale Sprache lernen (was ich empfehlen würde), ist Haskell eine sichere und gute Wahl.
Mein Rat
Wählen Sie Java oder C #. Beide verfügen über kostenlose, hervorragende IDEs (Eclipse, Netbeans und IntelliJ Community Edition für Java, Visual Studio Express für C #, Visual Studio Community Edition), mit denen das Schreiben und Ausführen von Code zum Kinderspiel wird. Wenn Sie keine native Datenstruktur verwenden, die komplexer als ein Array ist, und jedes Objekt, das Sie selbst schreiben, lernen Sie im Grunde das Gleiche wie in C / C ++, ohne jedoch den Speicher tatsächlich verwalten zu müssen.
Lassen Sie mich erklären: Die Größe einer erweiterbaren Hash-Tabelle muss geändert werden, wenn genügend Elemente hinzugefügt werden. In jeder Implementierung bedeutet dies, dass beispielsweise die Größe der Hintergrunddatenstruktur (normalerweise ein Array) verdoppelt und die vorhandenen Elemente kopiert werden. Die Implementierung ist grundsätzlich in allen zwingenden Sprachen gleich, aber in C / C ++ müssen Sie mit Segmentierungsfehlern umgehen, wenn Sie etwas nicht richtig zuweisen oder freigeben.
Python oder Ruby (es spielt keine Rolle, welche) wären meine nächste Wahl (und sehr nahe an den beiden anderen), nur weil die dynamische Eingabe zunächst problematisch sein könnte.
quelle
Ich würde vor
Java
allem empfehlen, weil:EDIT: Down Wähler bitte erklären.
quelle
Meiner Meinung nach ist C die beste Sprache, um Datenstrukturen und Algorithmen zu lernen, da Sie dadurch gezwungen werden, Ihre eigenen zu schreiben. Es wird Sie dazu zwingen, Zeiger, dynamische Speicherzuweisung und die Implementierungen hinter den gängigen Datenstrukturen wie verknüpften Listen, Hash-Tabellen usw. zu verstehen. Viele dieser Dinge können in höheren Sprachen (Java, C # usw.) als selbstverständlich angesehen werden. ).
quelle
Python
ist toll. Einfach zu lesen, voll ausgestattet. Wenn Sie mit Pseudocode arbeiten, wird Python ziemlich vertraut aussehen.Python ist bereits die bevorzugte Sprache für Algorithmen an der UC Irvine , wo es folgendermaßen beschrieben wird:
" Python stellt eine algorithmisch orientierte Sprache dar, die in der Bildung dringend benötigt wurde. Zu den Vorteilen von Python gehört die lehrbuchartige Syntax und Interaktivität, die zum Experimentieren anregt . "
Python arbeitet auch anfängerfreundlich mit Gato , einem Tool zum Erstellen von Grafiken. Das Erlernen von Algorithmen und Datenstrukturen ist eine der wichtigsten Möglichkeiten, um visuell dargestellt zu werden. Dies macht Gato einfach (ohne komplexe Grafikbibliotheken zu erlernen).
quelle
Wenn der Zweck darin besteht, nur Datenstrukturen und Algorithmen kennenzulernen , würde ich JavaScript sagen. Sie können Ihren Code in einem Browser ausführen. Sie haben eine sehr flexible Objekthandhabung und können sich ganz auf die Datenstrukturen und Algorithmen konzentrieren und nicht auf die Speicherverwaltung, Sprachkonstrukte oder andere Dinge, die den Fokus von der eigentlichen Informatik, die Sie lernen, ablenken.
Der Bonus ist auch, dass Sie verschiedene Datenstrukturen einfach visualisieren können, indem Sie mit dem Browser Grafiken und Bäume mit DOM und Canvas rendern.
CS-Kurse ändern im Laufe der Jahre in der Regel die Sprache, in der das Fach unterrichtet wird, einfach weil neuere und bessere Implementierungen von Sprachen eingeführt wurden, die das Lernen erleichtern und es einfacher machen, sich auf das eigentliche Problem zu konzentrieren.
quelle
Wenn Sie den Weg des geringsten Widerstands beschreiten möchten, dann Python. Es wird die minimale Menge an unnötiger Kesselplatte und dergleichen haben.
Idealerweise möchte ich Algorithmen in C lernen, damit Sie lernen können, was auf Speicherebene vor sich geht. Ich möchte auch Algorithmen in einer funktionalen Sprache lernen, damit Sie sehen können, wie ähnliche Algorithmen mit persistenten Datenstrukturen funktionieren.
Knuths berühmte Bücher enthalten große Mengen an (erfundener Plattform-) Assembler-Code. Dies wird empfohlen, wenn Sie Super-Hardcore sein möchten. Persönlich habe ich jedoch in C gearbeitet, als ich meine Algorithmusklasse durchgearbeitet habe (Offenlegung: Dies war erst vor ein paar Jahren). Ich arbeite manchmal an einigen Problemen in Knuth, aber ich weiß nicht, ob ich MMIX als meine bevorzugte Sprache für Lernalgorithmen verwenden würde. Es ist ein bisschen übertrieben, würde ich fühlen.
EDIT : Es hängt auch davon ab, was Sie kennen. Wenn Sie jetzt mit dem Durcharbeiten eines Algorithmus-Textes beginnen möchten und noch nie viel mit C gearbeitet haben, ist Python mit Abstand die richtige Antwort. Sie möchten, dass die Sprache keine große Hürde ist, die Sie überwinden müssen, weil Sie dies genießen möchten. Ich weiß, dass ich es getan habe.
Letzter Punkt: Zumindest als ich Algorithmen lernte, habe ich verdammt viel Zeit damit verbracht, auf Papier zu arbeiten. Ich denke, das ist wichtig - ich meine, Sie möchten etwas über Asymptotik usw. lernen. Die ganze Zeit damit verbringen, Algorithmen in einer beliebigen Sprache zu implementieren, ist nicht das Richtige.
quelle
Ich würde Ada vorschlagen. Es verfügt über Funktionen für Datenkonstrukte, die nicht in anderen Sprachen gefunden wurden, wie z. B. Bereichsprüfungen.
type Day is range 1 .. 31;
Außerdem verfügt es über eine sehr strenge Überprüfung der Kompilierungs- und Laufzeit (es sei denn, Sie deaktivieren sie), um das Auffinden von Fehlern in Ihrer Implementierung zu erleichtern.quelle
Oberon-2 oder Component Pascal . Der letzte ist eine Obermenge des ersten.
Einstein sagte einmal: "Mach es so einfach wie möglich, aber nicht einfacher." Dieser Satz wurde von Prof. Niklaus Wirth als Inschrift zum ursprünglichen Oberon-Sprachbericht gewählt. Und es gilt für Oberons Nachkommen, die oben erwähnt wurden.
Wenn es um die Perfektion der Programmiersprache geht, zitiere ich gerne Antoine de Saint-Exupéry: "Ein Designer weiß, dass er zur Perfektion gelangt ist, nicht wenn es nichts mehr hinzuzufügen gibt, sondern wenn es nichts mehr zum Mitnehmen gibt." . Wirth ist auf dem richtigen Weg, auch wenn dies nicht erreicht wird. In "Wirth Programmiersprachen Zeile" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2) ist jede nachfolgende Sprache einfacher und gleichzeitig leistungsfähiger als die vorherige.
Leistungsstarke, aber einfache Sprachen nach dem Prinzip der geringsten Überraschung. Starke statische Typisierung, einfache objektorientierte Funktionen, Speicherbereinigung. Die Funktionsliste ist nicht groß, aber es reicht aus, um produktiv zu sein und die Dinge nicht zu komplizieren, insbesondere in der Anfangsphase.
Wenn Sie Algorithmen und Datenstrukturen lernen möchten, meinen Sie das auch so. Aber wenn Ihre Sprache "mächtig" ist (viele Funktionen wie C ++, C #, Java, Python, ...), verschwenden Sie viel Zeit mit dem Erlernen der Sprache, nicht mit Algorithmen und Datenstrukturen. Sie werden den Wald vor lauter Bäumen nicht sehen. =) Sie können sich Bäume als Syntaxelemente (und andere Features) und Forest als wichtiges Konzept vorstellen (jeder Algorithmus, jede Datenstruktur, kann OOP sein, was auch immer). Je mehr Funktionen (Bäume) Sie in Ihrer Sprache haben, desto komplizierter wird die Aufgabe, einen Schritt zurückzutreten und die Konzepte zu verstehen (den Wald zu sehen).
Aber wenn die Sprache wirklich mächtig ist (mit kleinen, bewährten Funktionen), belegt die Sprache selbst den zweiten Platz. Es gibt nicht so viele Bäume, so dass Sie ein paar Schritte zurücktreten können und ... Nun, ich denke, das sind genug Analogien. =)
Auch viele Bücher über Algorithmen und Datenstrukturen verwenden Algol / Pascal-ähnlichen Pseudocode und es wird einfach sein, Beispiele in diese Sprachen zu konvertieren. Und Sie können direkt Beispiele aus Wirths Buch "Algorithmen und Datenstrukturen" verwenden. Oberon Edition (2004), PDF (1,2 MB).
Einige zusätzliche Links:
quelle
"Wenn Ihr einziges Werkzeug ein Hammer ist, sehen alle Ihre Probleme wie Nägel aus."
Lerne mindestens ein paar Sprachen.
Auch Ihre Wahl hängt von Ihrem Zweck ab.
Hobby? Job in der Windows-Welt? Linux / UNIX-Familie?
Art der Anwendungen: Business versus Scientific; Hardwaretreiber oder Anwendungen?
Desktop-Anwendungen oder Webanwendungen?
Ich habe mehrere Vorschläge für Sie.
(a) Lernen Sie auf jeden Fall etwas J (kostenlos von jsoftware.com; Nachfolger von APL; sowohl J als auch APL sind Kreationen von Ken Iverson, Turing-Gewinner ... Der Turing-Preis ist wie der Nobelpreis für Computer).
(b) Wenn Sie sich in der Windows-Welt befinden, beginnen Sie mit c #, da in .NET so viel auf c # ausgeführt wird. Wenn Sie können, erhalten Sie eine Kopie von Tom Archers "Inside c #" von Microsoft Press. Sie können ein kostenloses c # -Entwicklungssystem erhalten, indem Sie die Express-Version von Microsoft herunterladen.
(c) lernen, TDD / BDD zu verwenden ... unabhängig von der Sprache schreiben Sie zuerst einen kleinen Test, der als Komponententest bezeichnet wird; Als nächstes schreiben Sie den Produktionscode, um den Komponententest zu bestehen. Schritt für Schritt ... es ist nicht nur die Sprache, die Sie verwenden, sondern auch die Methodik.
(d) etwas Assembler-Sprache lernen ... Assembler ist eine niedrige, fast maschinelle Sprache, die Ihnen ein gutes Verständnis dafür gibt, was hinter den Kulissen vor sich geht.
(e) Außerhalb der Windows-Welt würde ich c ++ empfehlen.
Es gibt keine beste Sprache.
Wenn es nur um Sprache ginge, wäre die Programmierung einfacher.
Sie möchten nicht nur sehr spezifische Algorithmen lernen, sondern auch allgemeinere Muster, die Ihnen bei der Auswahl des Lösungsansatzes für ein bestimmtes Problem helfen können.
Eines ist sicher: Wenn Sie Programmierer werden, werden Ihnen wahrscheinlich nie die Dinge ausgehen, die Sie lernen können.
quelle
Ich denke, Lisp ist einen Blick wert.
Mein erster Universitätsprogrammierkurs war in Lisp. Davor hatte ich 10 Jahre lang Programme in mehreren Sprachen geschrieben. Ich dachte, dass der erste Programmierkurs langweilig sein würde, aber ich habe mich geirrt.
Lisp ist eine sehr interessante Sprache, da sie eine sehr einfache Syntax hat. Der Fokus wechselt von der Syntax zur Funktionalität. Der funktionale Programmierstil ist auch eine äußerst wertvolle Sache zu lernen. Nach meinem Lisp-Kurs schrieb ich Programme in C ++ auf eine völlig neue, bessere Weise, dank der neuen Konzepte, die Lisp mir beigebracht hatte.
Lisp verwendet dieselbe Darstellung auch für Code und Daten, was sich für ein interessantes Algorithmusdesign mit Code öffnet, der im laufenden Betrieb generiert und dann ausgeführt wird.
quelle
Möglicherweise schätzen Sie eine Sprache mit algebraischen Datentypen und Mustervergleich wie Standard ML, OCaml, F # oder Haskell. Hier ist beispielsweise eine Funktion zum Neuausgleichen eines in OCaml / F # geschriebenen rot-schwarzen binären Suchbaums:
quelle
Ich kann mich irren, aber sind Datenstrukturen und Algorithmen nicht unabhängig von den Programmiersprachen?
Letztendlich sind Datenstrukturen nur eine Möglichkeit, Daten zu organisieren. Jede Hochsprache wird dies unterstützen. Sicher, bestimmte Sprachen verfügen über Mechanismen zur Implementierung grundlegender Datenstrukturen (z. B. Collections Framework in Java oder C ++ STL), aber dies hindert Sie nicht daran, Datenstrukturen in der Programmiersprache Ihrer Wahl zu programmieren. Darüber hinaus sind Algorithmen im Pseudocode geschrieben, wodurch sie sprachunabhängig werden.
Mir ist klar, dass es Ihre Frage nicht wirklich beantwortet, aber ich habe Probleme zu verstehen, wonach Sie suchen. Datenstrukturen / Algorithmen lernen oder eine neue Sprache lernen.
quelle
Jede Sprache außer dem flüchtigen C ++ sollte gut funktionieren.
quelle
Ich bevorzuge C ++ :)
quelle