Geht es in der Programmierung oder in der Informatik im Allgemeinen um Algorithmen?

40

Als Student finde ich es immer üblicher, dass renommierte Unternehmen (wie Google, Facebook, Microsoft, ...) Algorithmusfragen in ihre Tests und Interviews einbeziehen. Ein paar Startups, bei denen ich mich beworben habe, fragten auch nach Algorithmen. Ich frage mich, ob für Softwareentwickler in diesen Unternehmen die Beherrschung von Algorithmen am wichtigsten ist.

Wenn die Antwort ja lautet, welche Methode oder Ressourcen eignen sich am besten, um Algorithmen effektiv zu erlernen und zu üben? Ich kann mich nicht dafür interessieren, scheinbar zu komplizierte Probleme zu lösen, die in den meisten Lehrbüchern oder Websites zu finden sind. Obwohl grundlegende Algorithmen (wie QuickSort, Bubblesort, ...) leicht zu verstehen sind, finde ich es immens schwierig, sie später zu merken und wiederzuverwenden.

Vielen Dank.

P / S: Wenn Sie mich fragen, was mir gefällt, erstellen Sie gute Software, um die Probleme der Benutzer innovativ zu lösen. Ich nehme an, das bedeutet nicht unbedingt, dass die Software sehr kompliziert sein muss.

Wakandan
quelle
26
Wissen Sie, wie kompliziert es für Google ist, mit einem Textfeld und einer Schaltfläche das gesamte Web zu durchsuchen?
JeffO
21
@ Jeffo Ich benutze nicht mal mehr den Knopf
;-)
1
Wenn Google es einfacher macht, benötigen alle anderen Such-Websites überhaupt keinen Code.
JeffO
Ich dachte, die Frage wäre, wie Computer funktionieren, wie eine CPU funktioniert, wie RAM funktioniert, wie WLAN funktioniert usw. Diese sehr interessante Frage wird noch viel recherchiert. Ich finde Hardware immer noch fantastischer als alle Geeks, die in Java oder PHP programmieren.
jokoon
2
Es geht nicht nur um Algorithmen, sondern auch um den Kern von CS. Aber es gibt noch viel mehr zu programmieren als nur Algorithmen und Logik (Code beibehalten wird , zum Beispiel würde nicht erfordern nur Kenntnisse von Algorithmen).
Haylem

Antworten:

44

Algorithmen sind klar

Das Schöne an Algorithmen ist: Der Problembereich, mit dem sie sich befassen, ist genau definiert, dh Ihre Anforderungen sind nicht nur tatsächlich bekannt , sondern in der Regel sogar formalisiert, ähnlich wie die Metriken für die Qualität der Lösung.

Wenn ich Sie also auffordere, einen Algorithmus zu entwickeln, gibt es nicht viel Potenzial für Kommunikationsprobleme, und die Messung Ihrer Leistung ist eine triviale Aufgabe. Gleichzeitig ist Ihre Leistung ein ziemlich guter Indikator für Ihre Fähigkeit, logisch zu denken.

Algorithmen sind ein effizienter Filter

Das aktuelle Problem der Branche (und der Bildung) ist die schlechte Durchschnittsqualität der Absolventen. Dies wurde mit dem FizzBuzz- Test veranschaulicht, der wie folgt lautet:

Schreiben Sie ein Programm, das die Zahlen von 1 bis 100 durchläuft und "fizz" ausgibt, wenn die Zahl durch 3 teilbar ist, "buzz", wenn sie durch 5 teilbar ist, und die Zahl selbst, wenn sie durch keine teilbar ist.

Offensichtlich kann die Mehrheit aller Absolventen von Comp Sci dieses Problem nicht lösen. Bitte beachten Sie, dass dies eine algorithmische Frage ist, wenn auch natürlich eine peinlich einfache. Wenn Sie jemanden finden, der die Probleme in Google Code Jam oder Project Euler lösen kann, genießen Sie bereits die Crème-de-la-Crème.

Algorithmen sind ein winziger Teil der Softwareentwicklung

Die Wahrheit ist, sobald Sie in der Branche arbeiten, werden Sie nicht mehr als 1% der Zeit Ihre Algorithmusfähigkeiten einsetzen.

Bevor Sie überhaupt mit dem Schreiben von Code beginnen, müssen Sie zunächst Anforderungen erfassen und analysieren. Dann müssen Sie Ihr Design basierend auf ihnen synthetisieren. Dann müssen Sie das Design implementieren. Anschließend müssen Sie die Implementierung anhand der ursprünglichen Anforderungen bewerten, anschließend die Anforderungen wiederholen, anschließend den Entwurf wiederholen und anschließend die Implementierung wiederholen und so weiter.

Eine der Anforderungen ist eine vernünftige Leistung. Wenn diese Anforderung nicht erfüllt ist, müssen Sie Ihre Implementierung profilieren, um die Engpässe aufzuspüren, und dann können Sie sie optimieren. Dies ist manchmal eine Angelegenheit der einfachen Mikrooptimierung, manchmal aber auch eine Angelegenheit von Verwendung besserer Algorithmen (was später nicht immer einfach ist). Deshalb:

Algorithmen sind kritisch

Je besser Sie die Algorithmen verstehen, desto größer ist die Chance, dass Sie sie beim ersten Mal richtig einsetzen. Andernfalls stoßen Sie wahrscheinlich nicht nur auf ein Problem, das nur durch die Implementierung eines besseren Algorithmus gelöst werden kann, sondern Sie können es auch nicht wirklich lösen.
Während Sie diese Fertigkeit so gut wie nie benötigen, stellt sie eine einzige Schwachstelle in Ihrer Entwicklungsmethodik dar. Wenn Sie diese Fertigkeit nicht haben, können Sie nur hoffen, dass die Notwendigkeit nie entsteht oder dass jemand anderes einspringt, um sie zu beheben Sie.

Was wirklich wichtig ist, ist, ein Gefühl für die Komplexität der Berechnungen zu bekommen und sie gering zu halten, wie ich auch in Antwort auf eine ähnliche Frage erklärte . Oder sich auf Dinge zu spezialisieren, bei denen dies einfach nicht wichtig ist, wie die GUI-Entwicklung, aber andererseits hasst es fast jeder ... aus einem Grund!

back2dos
quelle
5
+1 für eine sehr umfassende und intelligente Antwort. Es ist auch traurig, wie effektiv ein Filter von FizzBuzz ist. Es gibt absolut keine Entschuldigung dafür, es nicht zu können.
Adam Crossland
4
Ich dachte, dass Sie drucken sollten, fizzbuzzwenn die Zahl durch beide teilbar war, und dass viele darauf schlüpften, weil Sie bestellen müssen, um Schecks sorgfältig zu modulieren.
Matthieu M.
1
1% ist möglicherweise etwas zu hoch
Hanf
1
@MatthieuM .: Das Drucken von beidem hängt von der Formulierung der Anforderung ab. Wenn Sie dies nicht wissen, haben Sie die Anforderungen nicht sorgfältig geprüft. jetzt finde ich interessant, dass es nicht heißt, dass Sie sie in einer bestimmten Reihenfolge oder sogar konsistent in derselben Reihenfolge
drucken
1
@ back2dos: Ja, aber es in zufälliger Reihenfolge zu machen, hört sich nach mehr Spaß an. Beachten Sie, dass die in dieser Antwort angegebene Anforderung keine Zeilen erwähnt, sondern nur das Drucken . Wenn Sie einen FizzBuzz-Test erhalten, kann es sich lohnen, darauf hinzuweisen, dass viele unausgesprochene Annahmen darin enthalten sind.
Jmoreno
30

Im Allgemeinen geht es beim Programmieren als Job nicht um Algorithmen. Sie können Jahre damit verbringen, CRUD-Anwendungen zu programmieren, ohne umfassende algorithmische Kenntnisse zu benötigen.

Beim Programmieren als Job geht es um:

  1. Kommunikation:

    • Ihr Quellcode ist ein Mittel, um Ihre Ideen Ihren Kollegen mitzuteilen. Wenn niemand Ihren Code lesen / verstehen kann, ist er wertlos.

    • Ein einzelner Entwickler, der mit keinem anderen Entwickler spricht, würde wahrscheinlich Fehler im Code machen und glauben, dass sein eigener Ansatz der einzig akzeptable ist.

    • Sie müssen wissen, wie Sie mit Stakeholdern, QA-Abteilungen, Benutzern, visuellen Designern, DBAs usw. kommunizieren können.

    • Als erfahrener Entwickler müssen Sie weniger erfahrene Kollegen unterrichten, die ihre Fähigkeiten verbessern möchten.

  2. Kenntnisse über die richtigen Tools: Versionskontrolle, Fehlerverfolgungssystem, IDEs, welche Sprache für eine bestimmte Aufgabe besser geeignet ist und warum, wie Code analysiert wird usw.

  3. Breites Wissen und Kultur: Was sind funktionale Sprachen? Wie interpretieren Computer Code? Warum ist LOC eine bedeutungslose Maßnahme? usw.

  4. Vertiefte Kenntnisse der Sprache (n), mit denen Sie arbeiten.

  5. Algorithmen.

Die Informatik ist dagegen eher auf Algorithmen ausgerichtet. Wenn Sie als Wissenschaftler arbeiten, hat dies möglicherweise nichts mit der Arbeit eines Entwicklers zu tun, und Sie werden mehr darüber nachdenken, wie Sie einen Algorithmus optimieren, eine Datendarstellung in eine andere umwandeln usw.

Arseni Mourzenko
quelle
12
-1: "CRUD-Anwendungen" sind Algorithmen. Sie sind (im Allgemeinen) einfach. Es gibt keine "edle Bedeutung".
S.Lott
2
und der Quellcode ist Ihr einziger Kommunikationskanal zum Computer, der genau das tut , was Sie ihm sagen (und fast nie, was Sie wollen)
Ratschenfreak
5
Es ist erstaunlich, wie gut der Markt für die Bereinigung von CRUDdy-Anwendungen ist, deren Entwicklungsteams die Grundlagen von Algorithmen ignoriert (oder nie gelernt) haben.
JasonTrue
2
@ S.Lott: "CRUD-Anwendungen sind Algorithmen" ist analog zu "Ich bin Amerika". ;)
Jim G.
1
@JimG: Wie Steven Colbert sagt "Ich bin Amerika und du auch". CRUD-Anwendungen enthalten, basieren auf, beinhalten, sind Implementierungen von, sind Realisierungen von, verkörpern, reflektieren Algorithmen. Sie haben sich nur beschwert, ohne eine bestimmte Präposition vorzuschlagen. Was hätte dich glücklicher gemacht?
S.Lott
16

Ich denke, dass Fragen zu Algorithmen in Interviews eine der Hauptmethoden sind, mit denen Unternehmen versuchen, das Verständnis der Kandidaten für die Grundlagen der Informatik zu beurteilen. Dies ist nicht das einzige wichtige Fachgebiet für einen professionellen Programmierer, sondern eine der Kernkompetenzen eines guten Programmierers.

Ich denke, der Grund, warum viele große Unternehmen CS-Grundlagen in ihrem Interviewprozess betonen, ist, dass diese Kernkompetenz nach ihrem Abschluss und dem Eintritt in die Belegschaft am wenigsten entwickelt wird. Praktische Programmierkenntnisse, Designfähigkeiten, Softwareentwicklungspraktiken und dergleichen werden in erster Linie durch Erfahrung entwickelt, während Ihre CS-Grundlagen in erster Linie im Verlauf Ihrer Ausbildung entwickelt werden.

Steve Yegge empfiehlt Skienas The Algorithm Design Manual in seinem hervorragenden Leitfaden für Interviews als Programmierer .

Andrew B
quelle
4
+1: Programmiersprachen, Frameworks, Betriebssysteme, Editoren, Toolsets - allesamt ein und aus, aber zu wissen, wie man Probleme effektiv löst, hat alles damit zu tun, die Grundlagen von Datenstrukturen und Algorithmen zu kennen. Diese Dinge bleiben immer bei uns.
Adam Crossland
"Steve Yegge empfiehlt Skienas The Algorithm Design Manual in seinem hervorragenden Leitfaden für Interviews als Programmierer." Entschuldigung, aber dies trifft möglicherweise nicht auf die Person zu, die diese Frage gestellt hat, da sie zufällig ein Student ist. Google / MS ist von Skiena (für Studenten) zu Fragen übergegangen, die bei internationalen College-Programmierwettbewerben aufgetaucht sind. (Das weiß ich sicher aus anekdotischer Erfahrung). Das Buch von Skiena wird immer noch verwendet - aber hauptsächlich für Kandidaten für das Undergrad-Level.
user396089
Was die Fragen , die in den Programmierwettbewerben erscheinen - Sie ziemlich viel abgespritzt werden , wenn Sie die Frage nicht gesehen haben , bevor (es sei denn , Ihr IQ kommt auch aus dem normalen 3 SD weg zu sein)
user396089
11

Als erfolgreicher Softwareentwickler, der Autodidakt ist und nur wenige Informatikkurse am College belegt hat, kann ich sagen, dass die größten Probleme, denen Unternehmen heute gegenüberstehen, nicht darin bestehen, dass alle Programmierer einen Blasensortierungsalgorithmus auf die effizienteste Weise schreiben können möglich. Die wahren Probleme, mit denen Unternehmen konfrontiert sind:

  • Entwickler, die nicht schnell lernen und sich an neue Domänen anpassen können

  • Entwickler, die nicht auf sinnvolle Weise sozial mit Kunden oder Stakeholdern interagieren können

  • Entwickler, die falsche oder schlecht durchdachte Geschäftsanforderungen nicht erraten und hinterfragen können

  • Entwickler, die nicht verstehen, wie sie ihren Code und ihre Funktionen gründlich testen können

  • Entwickler, die keine aussagekräftigen Schätzungen rechtzeitig bereitstellen können

  • Entwickler, die keine klare und präzise Dokumentation erstellen können

  • Entwickler, die nicht selbstständig sind oder die Situation selbst in die Hand nehmen können

In neun von zehn Fällen wette ich, dass fast alle Umstände, unter denen ein Entwickler in einem Unternehmen ins Wanken gerät, darauf zurückzuführen sind, dass sie eine der oben genannten Eigenschaften hoffnungslos nicht erfüllen. Vergessen Sie Google und Facebook, sie sind Ausnahmefälle und brauchen Menschen, die sich mit Informatik auskennen.

Echte Unternehmen haben jedoch nicht mit den Komplexitäten der Informatik zu kämpfen, sondern mit den Komplexitäten der Menschheit. Das Problem ist, dass es WIRKLICH schwierig ist, die oben genannten Eigenschaften zu testen. Die meiste Zeit müssen Sie Menschen anhand Ihrer Bauchreaktion nach diesen Eigenschaften beurteilen. Das ist schwierig, wenn Sie nicht über gute Fähigkeiten und Intuition verfügen. Es ist viel einfacher, das Wissen über Algorithmen zu testen.

maple_shaft
quelle
+1 Normale und nicht google-artige Unternehmen benötigen Mitarbeiter mit guten Geschäftskenntnissen, die in erster Linie wissen, wie Prozesse zu erfinden, anzuwenden, zu verwalten und zu ändern sind. Es ist kein Fehler, dass Google-ähnliche Unternehmen die Agile-Bewegung nicht hervorgebracht haben, weil es in der Informatik nicht darum geht, geschäftliche Probleme zu lösen.
S.Robins
10

Ich persönlich sehe "Standard" -Algorithmen und Datenstrukturen als Teil des Vokabulars eines Programmierers. Und viele der praktischen Probleme, mit denen Sie als Programmierer konfrontiert sind, haben oft eine Lösung, die in diesem Vokabular (zumindest teilweise) zum Ausdruck kommt.

Wenn Sie dieses Vokabular zur Verfügung haben, müssen Sie keine "eigenen" Lösungen finden (sozusagen das Rad neu erfinden). So können Sie intelligenter und oft schneller arbeiten.

"Ich kann mich nicht dafür interessieren, scheinbar zu komplizierte Probleme zu lösen, die in den meisten Lehrbüchern oder Websites zu finden sind."

"Ich finde es immens schwierig, mich an sie zu erinnern und sie später wiederzuverwenden"

Zwinge dich, sie zu vervollständigen. Sie werden sich später bedanken. Auch wenn Sie sich nicht genau an sie erinnern (obwohl Sie es mit genügend Übung sicherlich tun werden), wird es Ihnen enorm helfen, sagen zu können, "Ich erinnere mich, dass ich etwas Ähnliches mit Algorithmus X oder Datenstruktur Y gelöst habe". Auch wenn Sie die Details nachschlagen und Ihr Gedächtnis auffrischen müssen.

Bart
quelle
+1 für Datenstrukturen. Sie sind die andere Hälfte der algorithmischen Münze.
Spencer Rathbun
9

Obwohl Sie kein guter Programmierer sein können, ohne Ihre Algorithmen zu kennen, ist es unfair, andere Aspekte des Programmierberufs außer Acht zu lassen. Zum Beispiel sind strenge Disziplin und gute Beherrschung Ihrer Muttersprache mindestens genauso wichtig, um ein guter Programmierer zu sein, wie Ihre Kenntnisse der Algorithmen. Man sollte auch nicht unterschätzen, wie wichtig es ist, die grundlegenden Tools wie Programmiersprachen, Quellcodeverwaltungssysteme, Testumgebungen usw. zu verstehen.

Wenn es um Interviews geht, ist es jedoch viel einfacher, Ihr Verständnis von Algorithmen zu messen, als Ihre anderen Fähigkeiten im Zusammenhang mit der Arbeit als Programmierer. Aus diesem Grund konzentrieren sich Interviewer häufig darauf, nach Algorithmen zu fragen, und achten genau darauf, wie Sie sie während des Interviews erklären. Das liegt nicht daran, dass andere Dinge weniger wichtig sind, sondern daran, dass es schwierig ist, diese anderen Dinge in den 30 Minuten, die für das Interview vorgesehen sind, zu bewerten.

dasblinkenlight
quelle
1
+1 Perfekte Antwort! Es ist einfacher, Algorithmuskenntnisse zu testen.
maple_shaft
"Ihre Algorithmen" - Ich bin Autodidakt. Gibt es irgendwo eine Quelle oder Liste, aus der hervorgeht, welche dieser allgemeinen Algorithmen jeder Programmierer kennen sollte? Ich würde sie gerne durchlesen. Vielen Dank!
Ominus
2
@Ominus Obwohl es keinen allgemeinen Konsens über die "Gentleman's List" von Algorithmen gibt, würde sie in den meisten Fällen das Suchen, Sortieren, Durchlaufen von Datenstrukturen ohne räumliche Kontinuität (verknüpfte Listen, Binärbäume usw.) und rudimentär (falsch) umfassen. Rekursionsanwendungen (rekursive Fakultät, Fibonacci-Folge usw.)
dasblinkenlight
@Ominus - Ich bin auch Autodidakt, aber ich denke, "Einführung in Algorithmen" - CLRS ist eine gute Möglichkeit, sich mit dem Gebiet vertraut zu machen. Auch Skienas Buch "The Algorithm Design Manual" ist gut.
Tod
5

Ja, bei der Programmierung geht es hauptsächlich um Algorithmen.

Aber vielleicht nicht in dem Sinne, wie Sie denken.

Ich habe den Eindruck, dass wir alle unterschiedliche Definitionen von Algorithmen verwenden. Um ehrlich zu sein, ist diese Frage schwer zu beantworten, da der Algorithmus ein vager Begriff ist. Ich werde die Definition von Wikipedia verwenden, um diese Frage zu beantworten:

Ein Regelsatz, der eine Abfolge von Vorgängen genau definiert.

Dies ist das Herz und die Seele der Programmierung. Wenn Sie schreiben jeden Code, setzen Sie einfach einen Algorithmus. Wenn Sie einige CRUD-Anwendungen schreiben, implementieren Sie einen einfachen Algorithmus. In der Lage zu sein, einen Algorithmus zur Lösung eines Problems zu entwickeln, ist das, was Programmierung bedeutet. Der Rest sind nur Details.

Ich bin mit dem vorherigen Poster nicht einverstanden, dass ein tiefes Verständnis einer Sprache wichtiger ist als das Verstehen von Algorithmen. Jeder gute Programmierer sollte in der Lage sein, eine Sprache gründlich zu lernen, aber ohne Algorithmen können Sie sich keinen Code selbst ausdenken.

Casey Patton
quelle
Aus einer anderen Perspektive sind in der Mathematik das Herz und die Seele vielleicht Algorithmen, aber für die Programmierung ist es etwas anderes. Sie können Software schreiben, ohne Algorithmen an sich zu benötigen (vielleicht keine gute Software), aber Sie können keine Software ohne Logik und abstraktes Denken schreiben. Im Kern geht es jedoch darum, Probleme zu lösen. Das Finden der Lösung ist ein algorithmischer Prozess, die Lösung selbst ist jedoch nicht unbedingt ein Algorithmus.
S.Robins
4

Die Antwort hängt ganz von der Arbeit ab, die Sie ausführen. Einige Felder sind besonders algorithmisch ausgerichtet als andere. Als ich zu dieser Notiz sprach, hatte ich das Vergnügen, mehrmals mit Amazon zu interviewen. Auch wenn die Position mit diesen komplexen Algorithmen wenig zu tun haben würde, wurde mir überlegt, wie man eine Aufgabe amortisiert, um konstante Zeit zu sparen.

Ein solides Verständnis der Algorithmen ist ein Beweis für Ihren potenziellen Arbeitgeber, dass Sie ein geeigneter Problemlöser sind. Es ist nicht wirklich ein guter Indikator (IMO) für einen guten Mitarbeiter, aber einige Arbeitgeber verwenden dies für das Screening. Wenn Sie sich für eine Stelle bewerben, für die ein Hochschulabschluss erforderlich ist, wird erwartet, dass Sie eine strengere Grundlage für Algorithmen haben.

Was (IMO) in der Praxis immens hilfreich ist, ist nicht, sich bestimmte Algorithmen zu merken, aber wenn Sie verstehen, wie einige Algorithmen funktionieren, haben Sie dieses kleine Nugget im Hinterkopf, in dem Sie sagen werden: "Ich habe das schon einmal gesehen" oder "Ich weiß, ich habe es gesehen." kann dies besser ", was ein wenig Nachforschungen über die Lösung Ihres Problems hervorruft.

Rig
quelle
+1 für die Einstellung Bar für Studenten. Einige Unternehmen sind viel umständlicher bei der Einstellung von Studenten als Studenten. Um fair zu sein, werden Absolventen auch besser bezahlt und in der Regel intern auf einem höheren Niveau eingestellt.
user396089
1

Ich denke immer, dass das Programmieren mehr datengetrieben ist als Algorithmen. Aber was nützt es dann Daten, wenn man nichts dagegen unternimmt? All diese Manipulationen sind Algorithmen. Tatsächlich basiert die Programmierung also fast ausschließlich auf Algorithmen.

Es sieht vielleicht nicht nach Mathematik aus, und eine Menge algorithmischer Arbeit, die Sie täglich erledigen würden, ist sehr einfach, wie das Senden von Daten zwischen einer GUI und einem Programm, aber das zählt auch als Algorithmus. Das Einfügen eines Elements in eine Listbox ist ein Standard-Einfügealgorithmus, der mit eigenen Problemen wie der Leistung und der Manipulation der Listenstruktur verbunden ist.

gbjbaanb
quelle
1

Nur Programmierer, die für diese Unternehmen arbeiten, können Ihre Frage wirklich beantworten. Die in "Einführung in Algorithmen" behandelten Algorithmen haben in den letzten 25 Jahren wahrscheinlich eine Rolle in 0,01% meines Programmierlebens gespielt. Wenn ich eine Datenstruktur oder eine Sortierung benötige, haben die mitgelieferten Bibliotheken oder Frameworks normalerweise das, was ich brauche. Wenn ich eine superschnelle FFT brauche, finde ich etwas wie die Intel Math lib, anstatt selbst eine zu schreiben. Ich kann jedoch feststellen, dass das, was sie bei Google tun, sich von dem unterscheidet, was ich in meiner Karriere getan habe. Skienas Buch "The Algorithm Design Manual" war wegen der Kriegsgeschichten, die er erzählt, aufschlussreich. Man merkt, dass er in seinem Job VIELE Algorithmen einsetzt.

Nach meiner Erfahrung als unabhängiger Programmierberater ist der Erfolg auf drei Dinge zurückzuführen: 1. Effektiv mit Kunden kommunizieren 2. Code schreiben, der funktioniert. 3. Komplexität managen

Nur die Zahlen 1 und 2 zu tun, reicht nicht aus. Wenn Code nicht gewartet werden kann (von jemand anderem als den Programmierern, die ihn geschrieben haben), ist er zum Scheitern verurteilt.

Nummer 3 ist die am schwersten zu beherrschende Programmierfähigkeit. Es erfordert Überlegungen zu Architektur, Design und Programmierung. Das Refactoring muss gemeistert werden. Es erfordert ein Verständnis der SOLID / DRY-Prinzipien. Wenn ich einen Programmierer einstellen müsste, der das Intro zu Algorithmen gelesen und sich der Beherrschung verschrieben hat, oder einen, der den Pragmatischen Programmierer gelesen und sich der Beherrschung verschrieben hat, würde ich den letzteren jedes Mal einstellen. (Nicht, dass sie sich gegenseitig ausschließen müssten).

Tod
quelle
1

Ja.

Informatik besteht hauptsächlich aus Algorithmen (prozentual).

Nein.

Aber das ist die "Wissenschaft" der Computer. Die häufigste Anwendung der Informatik ist das Software-Engineering. Software Engineering besteht nicht hauptsächlich aus Algorithmen. Es geht hauptsächlich um die Kunst des Schaffens, das Streben nach Perfektion, und es geht darum, das Leben realer Menschen, die heute existieren, positiv zu beeinflussen. Auch wenn die Informatik eine ähnliche Motivation hat, ist sie von der Softwareentwicklung weit entfernt.

Fragen Sie einen ordentlichen Professor an einer großen Universität für Informatik, was am wichtigsten für das Verständnis der Programmierung ist, und er wird Ihnen wahrscheinlich "Algorithmen und Datenstrukturen" mitteilen.

Fragen Sie einen leitenden Entwickler eines großen Softwareunternehmens, was das wichtigste am Programmieren ist, und er wird Ihnen wahrscheinlich sagen: "Kunden begeistern lernen" ununterbrochen Dinge machen, die funktionieren , etc)

Es mag wie eine Semantik erscheinen, aber meines Erachtens unterscheiden sich die beiden sowohl in der Praxis als auch in der Theorie erheblich.

Paul Hazen
quelle
1

Wenn ich eine Sache in der Informatik als den wichtigsten Teil davon auswählen müsste, würde ich Abstraktionen auswählen , keine Algorithmen.

Thomas Eding
quelle
1

In der Informatik werden die Konzepte, die Sie lernen, erst dann von Nutzen sein, wenn Sie sie zeigen. Das Problem ist ein Hauptanliegen, das gelöst werden muss, daher ist der Algorithmus eine kurze Planung, wie das Problem im Allgemeinen gelöst wird. Daher ist es in der Welt der Informatik von größter Bedeutung.

Ich denke, fast jeder Aspekt der Informatik braucht Algorithmen. Lassen Sie mich dies zeigen. Die folgende Liste würde verschiedene Bereiche der Informatik und die von ihnen verwendeten Algorithmen umfassen.

Automaten

Powerset-Aufbau. Algorithmus zur Umwandlung eines nicht deterministischen Automaten in einen deterministischen Automaten. Todd-Coxeter-Algorithmus. Prozedur zum Erzeugen von Nebenmengen.

Künstliche Intelligenz

Alpha Beta. Alpha Max plus Beta Min. Weit verbreitet in Brettspielen. Ant-Algorithmen. Die Ameisenkolonie-Optimierung ist eine Reihe von Algorithmen, die vom Verhalten der Ameisen inspiriert sind, um ein Problem zu lösen und den besten Weg zwischen zwei Orten zu finden. DE (Differential Evolution). Lösen Sie das Chebyshev-Polynom-Anpassungsproblem. Halbüberwachte Erkennung von sarkastischen Sätzen in Online-Produktbewertungen. Algortithmus, der Sakarsmen oder Ironie in einem Tweet oder einem Online-Dokument erkennt. Ein solcher Algorithmus wird auch für die Programmierung humanoider Roboter von wesentlicher Bedeutung sein.

Computer Vision

Inbegriff. Stellen Sie ein Bild oder Video durch ein kleineres dar. Objekte in einem Bild zählen . Verwendet den Beschriftungsalgorithmus für verbundene Komponenten, um zuerst jedes Objekt zu beschriften und dann die Objekte zu zählen. O'Carroll-Algorithmus. Ausgehend von einer mathematischen Umrechnung des Insektensehens bewertet dieser Algorithmus, wie Objekte umgangen werden können.

Genetische Algorythmen

Sie verwenden drei Operator. auswahl (lösung wählen), reproduktion (verwende gewählte lösungen, um andere zu konstruieren), ersatz (lösung ersetzen, wenn besser).

Fitness proportionale Auswahl. Diese Funktion wird auch als Roulette-Rad-Auswahl bezeichnet und dient zur Auswahl von Lösungen. Auswahl der Kürzung. Eine andere Methode zur Auswahl von Lösungen, geordnet nach Fitness. Turnierauswahl. Wählen Sie die beste Lösung für eine Art Turnier. Stochastische Universalabtastung. Die Individuen werden auf zusammenhängende Segmente einer Linie abgebildet, so dass jedes Individuumsegment genauso groß ist wie seine Fitness, genau wie bei der Roulette-Rad-Auswahl.

Neuronale Netze

Hopfield-Netz. Wiederkehrendes künstliches neuronales Netzwerk, das als inhaltsadressierbare Speichersysteme mit binären Schwelleinheiten dient. Sie konvergieren zu einem stabilen Zustand. Rückausbreitung. Betreute Lerntechnik zum Trainieren künstlicher neuronaler Netze. Selbstorganisierende Karte (Kohonen-Karte). Neuronale Netze, die mit unbeaufsichtigtem Lernen trainiert wurden, um eine niedrigdimensionale (2D, 3D) Darstellung der Trainingsmuster zu erstellen. Gut zur Visualisierung von hochdimensionalen Daten.

Bioinformatik

Needleman-Wunsch. Führt ein globales Alignment an zwei Sequenzen für Protein- oder Nukleotidsequenzen durch. Smith-Waterman. Variation des Needleman-Wunsch.

Kompression

Verlustfreie Kompressionsalgorithmen

Burrows-Wheeler verwandeln. Vorverarbeitung zur Verbesserung der verlustfreien Komprimierung. Luft ablassen. Von ZIP verwendete Datenkomprimierung. Delta-Codierung. Hilfe bei der Komprimierung von Daten, bei denen sequentielle Daten häufig vorkommen. Inkrementelle Codierung. Delta-Codierung für Folgen von Zeichenfolgen. LZW. (Lempel-Ziv-Welch). Nachfolger von LZ78. Erstellt aus den zu komprimierenden Daten eine Übersetzungstabelle. Wird vom GIF-Grafikformat verwendet. LZ77 und 78. Die Basis weiterer LZ-Varianten (LZW, LZSS, ...). Sie sind beide Wörterbuch-Codierer. LZMA. Abkürzung für Lempel-Ziv-Markov Chain-Algorithmus. LZO. Datenkomprimierungsalgorithmus, der auf Geschwindigkeit ausgerichtet ist. PPM(Vorhersage durch partielles Matching). Adaptive statistische Datenkompressionstechnik basierend auf Kontextmodellierung und Vorhersage. Shannon-Fano-Codierung. Konstruiert Präfixcodes basierend auf einer Reihe von Symbolen und deren Wahrscheinlichkeiten. Binär abgeschnitten. Eine Entropiecodierung, die typischerweise für gleichmäßige Wahrscheinlichkeitsverteilungen mit einem endlichen Alphabet verwendet wird. Verbessere die binäre Kodierung. Lauflängencodierung. Primäre Komprimierung, die eine Sequenz desselben Codes durch die Anzahl der Vorkommen ersetzt. Sequitur. Inkrementelle Grammatikinferenz für eine Zeichenfolge. EZW (Embedded Zerotree Wavelet). Progressive Codierung zum Komprimieren eines Bildes in einen Bitstrom mit zunehmender Genauigkeit. Kann auch bei besseren Ergebnissen verlustbehaftet sein.

Entropiecodierung Codierungsschema , das Symbolen Codes zuweist, um die Codelängen mit den Wahrscheinlichkeiten der Symbole abzugleichen.

Huffman-Codierung. Einfache verlustfreie Komprimierung unter Ausnutzung der relativen Zeichenfrequenzen. Adaptive Huffman-Codierung. Adaptive Codierungstechnik basierend auf Huffman-Codierung. Arithmetische Codierung. Erweiterte Entropiecodierung. Bereichskodierung. Wie arithmetische Codierung, jedoch etwas anders betrachtet. Unäre Kodierung. Code, der eine Zahl n mit n Einsen gefolgt von einer Null darstellt. Elias Delta, Gamma, Omega-Codierung. Universeller Code, der die positiven ganzen Zahlen codiert. Fibonacci-Codierung. Universeller Code, der positive ganze Zahlen in binäre Codewörter codiert. Golomb-Codierung. Form der Entropiecodierung, die für Alphabete nach geometrischen Verteilungen optimal ist. Reis-Codierung. Form der Entropiecodierung, die für Alphabete nach geometrischen Verteilungen optimal ist.

Verlustbehaftete Kompressionsalgorithmen

Lineare Vorhersagekodierung. Verlustkomprimierung durch Darstellung der spektralen Hüllkurve eines digitalen Sprachsignals in komprimierter Form. A-Law-Algorithmus. Standardkompandierungsalgorithmus. Mu-Law-Algorithmus. Standardanalogsignalkomprimierungs- oder -kompandierungsalgorithmus. Fraktale Kompression. Methode zum Komprimieren von Bildern mithilfe von Fraktalen. Codierung transformieren. Art der Datenkomprimierung für Daten wie Audiosignale oder fotografische Bilder. Vektorquantisierung. Technik, die häufig bei der verlustbehafteten Datenkomprimierung angewendet wird. Wavelet-Kompression. Form der Datenkomprimierung, die sich gut für die Bild- und Audiokomprimierung eignet.

Kryptographie

Geheimschlüssel (symmetrische Verschlüsselung)

Verwenden Sie einen geheimen Schlüssel (oder ein Paar direkt verwandter Schlüssel) sowohl für die Entschlüsselung als auch für die Verschlüsselung.

Advanced Encryption Standard (AES) , auch bekannt als Rijndael. Kugelfisch. Entworfen von Schneier als Allzweckalgorithmus, der als Ersatz für das alternde DE gedacht ist. Data Encryption Standard (DES) , ehemals DE-Algorithmus. IDEA (Internationaler Datenverschlüsselungsalgorithmus) . Früher IPES (Improved PES), ein weiterer Ersatz für DES. Wird von PGP (Pretty Good Privacy) verwendet. Führt mithilfe eines Schlüssels Transformationen für in Blöcke aufgeteilte Daten durch. RC4 oder ARC4. In Protokollen wie SSL für den Internetverkehr und WEP für drahtlose Netzwerke häufig verwendete Stream-Verschlüsselung. Winziger Verschlüsselungsalgorithmus. Einfach zu implementierender Algorithmus zur Blockverschlüsselung mit einigen Formeln. PES (Vorgeschlagener Verschlüsselungsstandard). Älterer Name für IDEA.

Öffentlicher Schlüssel (asymmetrische Verschlüsselung)

Verwenden Sie ein Schlüsselpaar, das als öffentlicher und privater Schlüssel bezeichnet wird. Der öffentliche Schlüssel verschlüsselt die Nachricht, nur der private Schlüssel ermöglicht die Entschlüsselung.

DSA (Digital Signature Algorithm). Generieren Sie Schlüssel mit Primzahlen und Zufallszahlen. Wurde von US-Agenturen verwendet und ist nun gemeinfrei. ElGamal. Basierend auf Diffie-Hellman, das von GNU Privacy Guard-Software, PGP und anderen kryptografischen Systemen verwendet wird. RSA (Rivest, Shamir, Adleman). Weit verbreitet in E-Commerce-Protokollen. Verwenden Sie Primzahlen. Diffie-Hellman (Merkle) Schlüsselaustausch (oder exponentieller Schlüsselaustausch). Methode und Algorithmus zur Weitergabe eines Geheimnisses über einen ungeschützten Kommunikationskanal. Wird von RSA verwendet. NTRUEncrypt. Verwenden Sie Polynomringe mit Faltungsmultiplikationen.

Message Digest-Funktionen

Ein Message Digest ist ein Code, der sich aus der Verschlüsselung einer Zeichenfolge oder von Daten beliebiger Länge ergibt und von einer Hash-Funktion verarbeitet wird.

MD5. Dient zum Überprüfen von ISO-Images von CDs oder DVDs. RIPEMD (RACE Integrity Primitives Evaluation Message Digest). Basierend auf den Prinzipien von MD4 und SHA-1 ähnlich. SHA-1 (Sicherer Hash-Algorithmus 1). Am häufigsten verwendet aus dem SHA-Satz verwandter kryptografischer Hash-Funktionen. Wurde von der NSA-Agentur entworfen. HMAC. Keyed-Hash-Nachrichtenauthentifizierung. Tiger (TTH). Wird normalerweise in Tigerbaum-Hashes verwendet.

Kryptografie mit Pseudozufallszahlen Siehe. Zufallszahlengeneratoren

Techniken in der Kryptographie

Geheime Freigabe, Geheime Aufteilung, Schlüsselaufteilung, M von N Algorithmen.

Shamirs geheimes Teilungsschema. Dies ist eine Formel, die auf Polynominterpolation basiert. Blakleys geheimes Teilungsschema. Ist geometrischer Natur, ist das Geheimnis ein Punkt in einem m-dimensionalen Raum.

Andere Techniken und Entschlüsselung

Teilmenge Summe. Ist bei einer Menge von ganzen Zahlen eine Teilmenge gleich Null? Wird in der Kryptographie verwendet. Shors Algorithmus. Quantenalgorithmus zum Entschlüsseln eines Codes basierend auf asymetrischen Funktionen wie RSA.

Geometrie

Geschenkpapier. Bestimmung der konvexen Hülle einer Punktmenge. Gilbert-Johnson-Keerthi Entfernung. Bestimmen des kleinsten Abstands zwischen zwei konvexen Formen. Graham scannt. Bestimmen der konvexen Hülle einer Reihe von Punkten in der Ebene. Schnittpunkt der Liniensegmente. Ermitteln, ob sich Linien mit einem Sweep-Linien-Algorithmus schneiden. Punkt im Polygon. Prüft, ob ein bestimmter Punkt in einem bestimmten liegt. Ray / Plane Kreuzung. * Schnittpunkt Linie / Dreieck. * Sonderfall Schnittpunkt Strahl / Ebene. Polygonisierung impliziter Flächen. Annähern einer impliziten Fläche mit einer polygonalen Darstellung. Triangulation.Methode zur Auswertung der Entfernung zu einem Punkt aus Winkeln zu anderen Punkten, deren Entfernung bekannt ist.

Diagramme 3D Surface Tracker-Technologie. Verfahren zum Hinzufügen von Bildern zu Wänden in einem Video, wobei verborgene Oberflächen berücksichtigt werden. Bellman-Ford. Berechnet die kürzesten Pfade in einem gewichteten Diagramm (wobei einige der Kantengewichte negativ sein können). Dijkstra's Algorithmus. Berechnet die kürzesten Pfade in einem Diagramm mit nicht negativen Kantengewichten. Störungsmethoden. Ein Algorithmus, der lokal kürzeste Pfade in einem Diagramm berechnet. Floyd-Warshall. Löst das Problem des kürzesten Pfades aller Paare in einem gewichteten, gerichteten Graphen. Floyds Fahrradsuche. Findet Zyklen in Iterationen. Johnson. Alle Paare kürzester Weg Algorithmus in dünn gewichteten gerichteten Graphen. Kruskal.Findet einen minimalen Spannbaum für ein Diagramm. Prim's. Findet einen minimalen Spannbaum für ein Diagramm. Wird auch als DJP-, Jarník- oder Prim-Jarník-Algorithmus bezeichnet. * Boruvka. * Findet einen minimalen Spannbaum für einen Graphen. Ford-Fulkerson. Berechnet den maximalen Durchfluss in einem Diagramm. Edmonds-Karp. Implementierung von Ford-Fulkerson. Nonblocking Minimal Spanning Switch. Für eine Telefonzentrale. Woodhouse-Sharp. Findet einen minimalen Spannbaum für ein Diagramm. Frühling basiert. Algorithmus zum Zeichnen von Graphen. Ungarisch. Algorithmus zum Finden einer perfekten Übereinstimmung. Färbealgorithmus. Graph Färbealgorithmus. Nächster Nachbar.Finde den nächsten Nachbarn. Topologische Sortierung. Sortieren Sie einen gerichteten azyklischen Graphen so, dass jeder Knoten vor allen Knoten steht, zu denen er Kanten hat (nach Richtungen). Tarjans Offline-Algorithmus der am wenigsten verbreiteten Vorfahren. Berechnen Sie die niedrigsten gemeinsamen Vorfahren für Knotenpaare in einem Baum.

Grafik

Bresenhams Linienalgorithmus. Verwendet Entscheidungsvariablen, um eine gerade Linie zwischen zwei angegebenen Punkten zu zeichnen. Landschaft Zeichnen Sie eine 3D-Landschaft. * DDA-Linienalgorithmus. * Zeichnet mit Gleitkomma-Mathematik eine gerade Linie zwischen zwei angegebenen Punkten. Fülle es. Füllt einen verbundenen Bereich mit einer Farbe. Image-Wiederherstellung. Foto wiederherstellen, Bilder verbessern. Xiaolin Wu Linienalgorithmus. Zeilen-Antialiasing. Algorithmus des Malers. Erkennt sichtbare Teile einer dreidimensionalen Szenerie. Ray-Tracing. Realistische Bildwiedergabe. Phong-Schattierung. Ein Beleuchtungsmodell und eine Interpolationsmethode in der 3D-Computergrafik. Gouraud-Schattierung.Simulieren Sie die unterschiedlichen Effekte von Licht und Farbe auf der Oberfläche eines 3D-Objekts. Scanline-Rendering. Konstruiert ein Bild durch Verschieben einer imaginären Linie. Globale Beleuchtung. Betrachtet direkte Beleuchtung und Reflexion von anderen Objekten. Interpolation. Erstellen neuer Datenpunkte, z. B. im Digitalzoom. Resynthesizer. Entfernen Sie ein Objekt auf einem Foto und erstellen Sie den von Photoshop und The Gimp verwendeten Hintergrund neu. Resynthesizer-Tutorial. Slope-Intercept-Algorithmus. Es ist eine Implementierung der Steigungsschnittformel zum Zeichnen einer Linie. Spline-Interpolation. Reduziert den Fehler beim Runge-Phänomen. 3D Surface Tracker-Technologie. Hinzufügen von Bildern oder Videos an Wänden in einem Video, wobei verborgene Oberflächen berücksichtigt werden.

Listen, Arrays und Bäume

Suchen

Wörterbuchsuche. Siehe vorausschauende Suche. Auswahlalgorithmus. Findet das k-größte Element in einer Liste. Binärer Suchalgorithmus. Sucht ein Element in einer sortierten Liste. Breitensuche. Durchläuft einen Graphen Level für Level. Tiefensuche. Durchläuft ein Diagramm Zweig für Zweig. Best-First-Suche. Durchläuft ein Diagramm in der Reihenfolge der wahrscheinlichen Wichtigkeit unter Verwendung einer Prioritätswarteschlange. Eine Baumsuche. * Sonderfall der Best-First-Suche, bei der Heuristiken verwendet werden, um die Geschwindigkeit zu verbessern. Suche nach einheitlichen Kosten. Eine Baumsuche, die die Route mit den niedrigsten Kosten findet, bei der die Kosten variieren. Vorausschauende Suche.Binär-ähnliche Suche, bei der die Größe des Suchbegriffs im Vergleich zu den hohen und niedrigen Werten bei der Suche berücksichtigt wird. Hash-tabelle. Ordnen Sie Schlüssel Elementen in einer unsortierten Sammlung zu, um sie in einer linearen Zeit abzurufen. Interpolierte Suche. Siehe vorausschauende Suche.

Sortierung

Binäre Baumsorte. Sortierung eines binären Baums, inkrementell, ähnlich der Sortierung beim Einfügen. Bogosort. Ineffiziente zufällige Art einer Tischkarte. Blase sortieren. Tauschen Sie die Elemente für jedes Indexpaar aus, wenn sie nicht in Ordnung sind. Eimer sortieren. Teilen Sie eine Liste in Eimer auf und sortieren Sie sie einzeln. Verallgemeinert die Sortierung der Schubladen. Cocktail Art (oder bidirektionale Blase, Shaker, Welligkeit, Shuttle, Happy Hour Art). Variation der Blasensortierung, die in beide Richtungen sortiert wird, durchläuft die Liste. Kamm sortieren. Effiziente Variation der Blasensorte, die "Schildkröten" eliminiert, die kleinen Werte am Ende der Liste und Lücken zwischen den Werten nutzt. Zählen sortieren.Es verwendet den Zahlenbereich in der Liste A, um ein Array B dieser Länge zu erstellen. Indizes in B werden verwendet, um zu zählen, wie viele Elemente in A einen Wert kleiner als i haben. Gnome Art. Ähnlich wie beim Sortieren nach Einfügung, mit der Ausnahme, dass das Verschieben eines Elements an die richtige Stelle durch eine Reihe von Tauschvorgängen wie beim Sortieren nach Bläschen erfolgt. Heapsort. Konvertieren Sie die Liste in einen Heap, entfernen Sie weiterhin das größte Element aus dem Heap und fügen Sie es am Ende der Liste hinzu. Sortieren durch Einfügen. Bestimmen Sie, wo das aktuelle Element in der Liste der sortierten Elemente enthalten ist, und fügen Sie es dort ein. Introsort. Oder nachdenkliche Art. Es beginnt mit Quicksort und wechselt ab einer bestimmten Rekursionsstufe zu Heapsort. Zusammenführen, sortieren.Sortieren Sie die erste und zweite Hälfte der Liste getrennt und führen Sie die sortierten Listen zusammen. Pfannkuchen sortieren. Kehren Sie Elemente eines Präfixes einer Sequenz um. Pigeonhole Art. Füllen Sie ein leeres Array mit allen Elementen eines Arrays, die sortiert werden sollen, in der angegebenen Reihenfolge. Briefträger sortieren. Hierarchische Variante der Eimersortierung, die von Postämtern verwendet wird. Schnelle Sorte. Teilen Sie die Liste in zwei Teile, wobei alle Elemente der ersten Liste vor allen Elementen der zweiten Liste stehen .; Sortieren Sie dann die beiden Listen. Oft die Methode der Wahl. Radix Art. Sortiert Schlüssel, die mit Elementen oder Ganzzahlen verknüpft sind, nach der Verarbeitung von Ziffern. Auswahl sortieren. Wählen Sie das kleinste der verbleibenden Elemente aus und fügen Sie es am Ende der sortierten Liste hinzu. Shell sortieren.Verbessert die Einfügesortierung durch Verwendung von Lücken zwischen Werten. Smoothsort. Siehe Heapsort. Stochastische Art. Siehe Bogosort.

und viele mehr...

Chitrank Dixit
quelle
0

Sie haben im Fragenkopf zwei Fragen gestellt, daher beantworte ich beide Fragen.

Ja, in der Informatik dreht sich alles um Algorithmen. Naja ... eigentlich ist das ein bisschen irreführend, weil die Informatik viele Aspekte hat, also werde ich es umformulieren. In der Informatik, wie sie in der Arbeitswelt angewendet wird, geht es hauptsächlich um Algorithmen. Unternehmen wie Google, Facebook und all die verrückten Orte an der Wall Street, die Physiker und Entwickler einstellen, wollen hochkomplexe Probleme auf eine einfache Form bringen, die an sich ein tiefes Verständnis der Mathematik und des Algorithmus-Designs erfordert.

Nein, beim Programmieren geht es nicht nur um Algorithmen. Beim Programmieren geht es darum, Spezifikationen zu übernehmen und in Code umzuwandeln, der zur Ausführung kompiliert werden kann.

Der zusätzliche Teil der Antwort: Softwareentwicklung ist keine Programmierung, und dennoch scheinen viele die Begriffe zu verwechseln und synonym zu verwenden. Programmierung ist lediglich eine Funktion oder eine Technik des größeren Prozesses der Softwareentwicklung. Bei der Softwareentwicklung geht es sicherlich nicht nur um Algorithmen, sondern auch um das Lösen von Softwareproblemen und die Anwendung solider, geschäftskompatibler Prozesse, damit Probleme effizient gelöst werden können. Während Software - Entwicklungsprozess - und die Programmierung selbst auch - algorithmische Prozesse in ihrer Natur sein könnte, ist dies nicht dasselbe wie etwa Algorithmen.

S.Robins
quelle