Sollte ich weiterhin in Datenstrukturen und Algorithmen investieren? [geschlossen]

28

In diesen Tagen investiere ich viel in Datenstrukturen und Algorithmen und versuche, einige Programmier-Rätsel zu lösen.
Ich versuche mit Java und Clojure zu programmieren und zu lösen.

Verschwende ich meine Zeit? Sollte ich mehr in Technologien und Frameworks investieren, die ich bereits kenne, um tieferes Wissen zu erlangen (die Ins und Outs) und in der Lage zu sein, schneller mit ihnen zu programmieren?

Werde ich durch das Studium von Datenstrukturen und Algorithmen ein besserer Programmierer, oder sind diese Fächer nur während der Studienzeit wichtig?

Chiron
quelle
5
Mit welchen Datenstrukturen und Algorithmen arbeiten Sie? Auf welchen Programmierrätseln verwendest du sie?
Osterwal
Ich arbeite / arbeite noch an Hash-Tabellen, Maps, Heaps, Graphs, Trees und den dazugehörigen Algorithmen (Traversieren, Hashing, Suchen, Einfügen, Löschen und einige Sortieralgorithmen). Die Rätsel stammen von TopCoder- und Google Code Jam-Wettbewerben.
Chiron

Antworten:

24

Es ist durchaus möglich, den größten Teil Ihrer Karriere mit signifikanten und nützlichen Arbeiten zu verbringen, wenn Sie nur minimale Kenntnisse über Algorithmen und Datenstrukturen haben.

Die Mindestkenntnisse für Algorithmen und Datenstrukturen erfordern Folgendes, um erfolgreich zu sein:

  • Beachten Sie die meisten von ihnen (einschließlich gelegentlichem Nachlesen neuer, wenn sie herauskommen).
  • wissen, wo gute, getestete und funktionierende Implementierungen zu finden sind
  • in der Lage sein, Algorithmen und ihre Nützlichkeit zu vergleichen
  • in der Lage sein, ein Beispiel aus einem Open-Source-Programm mit ein wenig Optimierungsaufwand korrekt in Ihre spezifische Umgebung zu kopieren

Es gibt kein * Maximum * . Wenn Sie möchten, können Sie Ihr Studium auf das Doktoratsniveau und darüber hinaus bringen. Die Nützlichkeit hängt direkt mit der Art von Jobs zusammen, die Sie haben möchten, und mit der Art von Arbeit, die Sie am interessantesten und lohnendsten finden.

Als grobe (aber nicht absolute) Richtlinie gilt jedoch: Je niedriger, ressourcenintensiver und weniger automatisiert die Sprache, das Framework und die Anwendung sind, an denen Sie arbeiten, desto höher ist das erforderliche Qualifikationsniveau zu Algorithmen und Datenstrukturen. Wenn Sie beispielsweise den Ukkonen-Algorithmus in Assembler implementieren , bedeutet dies wahrscheinlich, dass Sie das Verständnis der beteiligten Algorithmen und Datenstrukturen auf Masterebene erlangen möchten.

Wenn Sie in Ihrer spezifischen Situation von einem Java-Entwicklungshintergrund zu einer Arbeit an den iOs übergehen, sollten Sie bei gleichbleibenden Bedingungen ein etwas höheres Verständnis für Algorithmen und Datenstrukturen haben. Sie möchten in der Lage sein, effizient auf einem Gerät mit weniger verfügbaren Ressourcen zu arbeiten. Erwarten Sie außerdem, Ihrem Arsenal einige neue Kategorien hinzuzufügen - vor allem möchten Sie mehr über die Speicherverwaltung erfahren.

Blaubeerfelder
quelle
2
Stimme voll zu. Ich muss mich fast nie direkt mit Algorithmen befassen, da die überwiegende Mehrheit der benötigten Algorithmen bereits in den Basisbibliotheken enthalten ist. Ich wäre jedoch in Schwierigkeiten, wenn ich die Leistungsmerkmale nicht ausreichend verstehen würde, um den geeigneten Algorithmus oder die geeignete Struktur für einen bestimmten Anwendungsfall zu wählen. OP: Wenn Sie nicht mit Algorithmen arbeiten möchten, können Sie viel, viel , viel bessere Amortisationszeiten für das Erlernen anderer Bibliotheken, Tools und Techniken erzielen.
Quentin-Starin
1
Ugh, Ukkonens Algorithmus in Python zu schreiben ist schwer genug, ich kann mir sogar vorstellen, es in Assembler zu machen.
rjzii
2
Dies fällt in den Punkt "Algorithmen vergleichen", aber ich wollte nur darauf eingehen, dass Sie den Kompromiss zwischen räumlicher und zeitlicher Komplexität kennen sollten. Viele Algorithmen, die aufgrund ihrer Geschwindigkeit häufig auf Desktops verwendet werden, sind unter iOS möglicherweise nicht möglich, da sie große Datenstrukturen erfordern.
Karl Bielefeldt
3
Ich stimme dir nicht zu. Ein einfacher Grund ist, wenn jemand Zeit damit verbringt, Algorithmen oder Design oder Architektur zu lernen, geht es nicht nur darum, wann / wo er es verwenden wird. Es macht die Person nur schlauer und sie könnte das Lernen nutzen, um andere Probleme zu lösen. Es fördert auch das Gefühl, die Dinge optimal zu machen. Zum Beispiel. Es gibt vielleicht nicht für alles einen handgemachten Algorithmus, aber da Sie viele Dinge kennen, können Sie selbst etwas Außergewöhnliches mitbringen.
Geek
14

Nein. Wenn Sie gerade erst anfangen, halten Sie sich nur zurück, wenn Sie versuchen, sich mit großen Themen wie der UI-Programmierung zu beschäftigen. Schließlich müssen Sie dorthin gehen und größere Frameworks erlernen ... wie Sie die Datenstrukturen und Algorithmen verwenden, die ANDERE Leute geschrieben haben. Wenn Sie gerade erst anfangen, ist es gut, sich an Probleme mit begrenztem Umfang zu halten.

Algorithmen und Datenstrukturen sind im Grunde die Grundlage für alles, auch wenn Sie wahrscheinlich nie mehr eine eigene schreiben werden, wenn Sie die Anfängerphase hinter sich haben. Wenn Sie sie kennen oder zumindest gekannt haben, werden Sie am Ende zu einem besseren Entwickler. Sie werden wissen, wann und warum Sie welche verwenden müssen, weil Sie wissen, WIE sie funktionieren. Außerdem müssen Sie Ihre Algorithmen und Datenstrukturen generisch gestalten, damit sie mit jedem Typ oder Typ mit Schnittstelle X funktionieren können.

Ich sehe zu viele Leute, die sich mit Dingen wie Qt beschäftigen, die am Ende Fragen stellen, die beispielsweise keine Kenntnisse in C ++ aufweisen. Sie versuchen, zu viele Schritte zu überspringen, und am Ende brauchen sie länger, um zu lernen. Ich würde sagen, Sie sind auf dem richtigen Weg.

Edward Strange
quelle
Ich mache seit 2007 professionelles Java-Programmieren (was ich meine). Jetzt werde ich (zumindest hoffe ich) etwas iOS-Entwicklung machen.
Chiron
9

Du verschwendest nicht deine Zeit.

Wenn Sie im Laufe Ihrer Arbeit ein Tool oder Framework verwenden müssen, das Sie zuvor noch nicht verwendet haben, lernen Sie es und setzen es ein.

Wenn Sie jedoch eine Datenstruktur oder einen Algorithmus verwenden müssen, die bzw. den Sie zuvor noch nicht verwendet haben, werden Sie wahrscheinlich nicht einmal wissen, dass es sie gibt, und Sie werden Ihr Problem mit einer fürchterlich suboptimalen Technik lösen, die einiges mehr kostet Aufwand und Skalen schrecklich.

Ich versuche zu sagen, dass Sie so etwas nicht nur lernen, sondern lernen müssen, indem Sie lernen , entweder in einer akademischen Situation oder durch persönliche Anstrengung, wie Sie es tun jetzt machen.

Carson63000
quelle
6

In der Praxis sollten Sie sich darüber im Klaren sein, welche Datenstrukturen zur Verfügung stehen, welche Komplexitätsmerkmale sie aufweisen, wo Sie gute Implementierungen erhalten und wo Sie Ihre Kopie der Einführung in Algorithmen aufbewahren , um die Details später nachzuschlagen.

Schmiede
quelle
1

Wenn dich das glücklich macht, solltest du definitiv dabei bleiben. Wenn Sie befürchten, dass Sie nicht genug Theorie anwenden, ziehen Sie ein theorielastiges Projekt in Betracht. Erstellen Sie eine kleine Programmiersprache wie Potion von Grund auf neu. Bei einer vollständigen Implementierung werden Hash-Tabellen, Diagramme, Bäume und eine Vielzahl von Algorithmen verwendet. Wenn es interessant erscheint, können Sie tiefer in die Optimierung, native Codegenerierung oder Benutzererweiterbarkeit eintauchen.

Sie werden ein besserer Programmierer, wenn Sie interessiert und fokussiert bleiben, nicht wenn Sie an Projekten arbeiten, die praktisch, aber ein wenig langweilig erscheinen.

Das Kaninchenloch runter, Dorothy!

Scant Roger
quelle
1

Ich habe viel Zeit damit verbracht, mit OpenGL in C / C ++ herumzuhacken. Ich kenne die Sprachen und die API gut genug ... und aufgrund dieser Erfahrung bin ich ein vernünftiger Entwickler und Programmierer geworden. Das eigentliche algorithmische Wissen, das zur Lösung verschiedener auftretender Probleme erforderlich ist, konnte ich jedoch erst richtig erfassen.

Aus eigener Erfahrung heraus ist es eine Zeitverschwendung, sich auf das Erstellen von Anwendungen zu konzentrieren, wenn Sie die Theorie hinter den Problembereichen, die sich auf das beziehen, was Sie erstellen möchten, nicht kennen.

Für viele verschiedene Arten von Software ergeben sich diese Bereiche aus den Grundlagen, die Sie aus dem Studium von Algorithmen lernen, zusätzlich zu ihrer eigenen spezifischen nischenbasierten Theorie (z. B. lineare Algebra in Computergrafiken, Zahlen- / Informationstheorie in der Kryptographie usw.).

Sie müssen nicht unbedingt ein Computational Wiz-Kid hinter allem sein, aber das zu tun, was Sie zum Zeitpunkt dieses Beitrags getan haben, ist ein sehr, sehr notwendiger Weg, um mindestens einmal auf der Programmierreise unterzugehen - unabhängig davon, ob oder nicht sie sind Autodidakt.

etwa leer
quelle
0

Ich denke, wenn du sie nicht gut kennst, wirst du keinen Grund finden, sie zu benutzen. Ich scheine die ganze Zeit Verwendungen für sie zu finden. Aber ich muss zugeben, dass mit den Verbesserungen bei Generika in den letzten rund einem halben Dutzend Jahren die Notwendigkeit, eigene zu rollen, immer seltener auftritt. Die Vorteile, zu wissen, wie und wann sie zu verwenden sind, werden dadurch immer noch nicht beseitigt, und sie können den ansonsten komplizierten Code erheblich vereinfachen.

Dunk
quelle