it-swarm.com.de

Geht es bei Programmierung oder Informatik im Allgemeinen nur um Algorithmen?

Als Student finde ich es immer häufiger, dass renommierte Unternehmen (wie Google, Facebook, Microsoft, ...) Algorithmusfragen in ihre Tests und Interviews aufnehmen. Einige Startups, bei denen ich mich beworben habe, fragten auch nach Algorithmen. Ich frage mich, ob die Fließfähigkeit von Algorithmen für Softwareentwickler in diesen Unternehmen das Wichtigste ist.

Wenn die Antwort Ja lautet, welche Methode oder Ressourcen sind am besten geeignet, um Algorithmen effektiv zu lernen und zu üben? Ich kann mich anscheinend 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, fällt es mir immens schwer, sie später zu merken und wiederzuverwenden.

Vielen Dank.

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

41
wakandan

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 viel formalisiert wie die Metriken für die Qualität der Lösung.

Wenn ich Ihnen also sage, dass Sie einen Algorithmus entwickeln sollen, 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 durchschnittliche Qualität der Absolventen. Dies wurde mit dem FizzBuzz Test veranschaulicht, der lautet:

Schreiben Sie ein Programm, das die Zahlen von 1 bis 100 durchläuft und "Fizz" druckt, wenn die Zahl durch 3 teilbar ist, "Buzz", wenn es durch 5 teilbar ist, und die Zahl selbst, wenn es durch keine teilbar ist.

Anscheinend kann die Mehrheit aller Absolventen von Comp Sci dieses Problem nicht lösen. Bitte beachten Sie, dass dies eine algorithmische Frage ist, obwohl sie natürlich peinlich einfach ist. Wenn Sie jemanden finden, der die in Google Code Jam oder Project Euler angegebenen Probleme 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 Ihre Algorithmusfähigkeiten nicht mehr als 1% der Zeit einsetzen.

Bevor Sie überhaupt mit dem Schreiben von Code beginnen, müssen Sie zunächst die Anforderungen erfassen und analysieren. Dann müssen Sie Ihr Design basierend darauf synthetisieren. Dann müssen Sie das Design implementieren. Dann müssen Sie die Implementierung anhand der ursprünglichen Anforderungen bewerten, dann die Anforderungen iterieren, dann das Design iterieren, dann die Implementierung iterieren und so weiter.

Eine der Anforderungen ist 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 Frage der einfachen Mikrooptimierung (was ziemlich einfach ist), manchmal aber auch eine Frage der Verwendung besserer Algorithmen (was danach 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 machen. Andernfalls stoßen Sie wahrscheinlich nicht nur auf ein Problem, das nur durch die Implementierung eines besseren Algorithmus gelöst werden kann, sondern können es auch nicht tatsächlich lösen.
Während Sie diese Fertigkeit so gut wie nie benötigen, stellt sie in Ihrer Entwicklungsmethodik ein Single Point of Failure dar. Wenn Sie nicht über diese Fertigkeit verfügen, können Sie nur hoffen, dass die Notwendigkeit niemals besteht entsteht, oder dass jemand anderes einspringt, um es für Sie zu reparieren.

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

44
back2dos

Im Allgemeinen geht es beim Programmieren als Job nicht um Algorithmen. Sie können Jahre damit verbringen, CRUD-Anwendungen zu programmieren, ohne tiefgreifende 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 anfangen, Fehler im Code zu machen und glauben, dass sein eigener Ansatz der einzig akzeptable ist.

    • Sie müssen wissen, wie Sie mit Stakeholdern, QS-Abteilungen, Benutzern, visuellen Designern, Datenbankadministratoren 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 die Codeanalyse verwendet wird usw.

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

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

  5. Algorithmen.

Die Informatik hingegen orientiert sich eher an Algorithmen. Wenn Sie als Wissenschaftler arbeiten, hat dies möglicherweise nichts mit der Arbeit eines Entwicklers zu tun, und Sie werden mehr daran arbeiten, wie Sie einen Algorithmus optimieren, eine Datendarstellung in eine andere umwandeln usw.

30

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

Ich denke, der Grund, warum viele große Unternehmen CS-Grundlagen in ihrem Interviewprozess betonen, ist, dass es die Kernkompetenz ist, die am wenigsten entwickelt wird, nachdem sie ihren Abschluss gemacht und in die Belegschaft eingestiegen sind. Praktische Programmierfähigkeiten, Designfähigkeiten, Softwareentwicklungspraktiken und dergleichen sind alles Dinge, die hauptsächlich durch Erfahrung entwickelt werden, während Ihre CS-Grundlagen hauptsächlich im Verlauf Ihrer Ausbildung entwickelt werden.

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

16
Andrew B

Als erfolgreicher Softwareentwickler, der Autodidakt ist und nur wenige Informatikkurse am College besucht hat, möchte ich sagen, dass die größten Probleme, mit denen Unternehmen heute konfrontiert sind, nicht die Fähigkeit aller Programmierer sind, einen Blasensortierungsalgorithmus auf die effizienteste Weise zu schreiben 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 sein oder eine Situation in den Griff bekommen können

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 er in einer der oben genannten Eigenschaften hoffnungslos versagt. Vergessen Sie Google und Facebook, sie sind Ausnahmefälle und haben ein berechtigtes Bedürfnis nach Menschen, die die Informatik tief verstehen.

Echte Unternehmen kämpfen zwar nicht mit der Komplexität der Informatik, sondern mit der Komplexität der Menschheit. Das Problem ist, dass es WIRKLICH schwierig ist, die oben genannten Eigenschaften zu testen. Meistens müssen Sie Menschen anhand Ihrer Darmreaktion 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.

11
maple_shaft

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 (zumindest teilweise) in diesem Vokabular zum Ausdruck kommt.

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

"Ich kann mich anscheinend 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. Selbst wenn Sie sich nicht im Detail an sie erinnern (obwohl Sie es mit genügend Übung sicherlich tun werden), hilft es Ihnen enorm, sagen zu können, dass ich mich daran erinnere, etwas Ähnliches mit Algorithmus X oder Datenstruktur Y gelöst zu haben. Auch wenn Sie die Details nachschlagen und Ihr Gedächtnis auffrischen müssen.

10
Bart

Obwohl Sie kein guter Programmierer sein können, ohne Ihre Algorithmen zu kennen, ist es unfair, andere Aspekte des Programmierberufs aus dem Bild zu halten. Zum Beispiel sind strenge Disziplin und gute Beherrschung Ihrer Muttersprache für einen guten Programmierer mindestens genauso wichtig wie Ihre Kenntnisse über Algorithmen. Man sollte auch nicht unterschätzen, wie wichtig es ist, die grundlegenden Tools wie Programmiersprachen, Versionsverwaltungssysteme, Testumgebungen usw. zu verstehen.

Wenn es jedoch um Interviews geht, ist das Messen Ihres Verständnisses von Algorithmen viel einfacher als das Messen Ihrer 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.

9
dasblinkenlight

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 des Algorithmus 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 Regelwerk, das eine Abfolge von Operationen genau definiert.

Dies ist das Herz und die Seele der Programmierung. Wenn Sie any Code schreiben, implementieren Sie nur 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 Programmierung. Der Rest sind nur Details.

Ich bin mit dem vorherigen Poster nicht einverstanden, dass ein tieferes 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 keinen eigenen Code erstellen.

5
Casey Patton

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

Ein Beweis für ein starkes Verständnis von Algorithmen ist der 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 diesen Indikator für das Screening. Wenn Sie sich für eine Stelle bewerben, für die ein Abschluss erforderlich ist, wird von Ihnen eine strengere Grundlage für Algorithmen erwartet.

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: "Ich habe das schon einmal gesehen" oder "Ich weiß, dass ich es weiß" kann dies besser machen ", was ein wenig Forschung über die Lösung Ihres Problems hervorbringen wird.

4
Rig

Nur Programmierer, die für diese Unternehmen arbeiten, können Ihre Frage wirklich beantworten. Die Arten von Algorithmen, die in "Einführung in Algorithmen" behandelt werden, haben in den letzten 25 Jahren wahrscheinlich in 0,01% meines Programmierlebens eine Rolle 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 so etwas wie die Intel Math lib, anstatt selbst eine zu schreiben. Ich kann jedoch feststellen, dass das, was sie bei Google tun, ganz anders ist als das, was ich in meiner Karriere getan habe. Skienas Buch "The Algorithm Design Manual" öffnete aufgrund der Kriegsgeschichten, die er erzählt, die Augen. Sie können sagen, dass er Algorithmen in seinem Job VIEL verwendet.

Nach meiner Erfahrung als unabhängiger Programmierberater ist der Erfolg auf drei Dinge zurückzuführen: 1. Effektive Kommunikation mit Kunden 2. Schreiben von Code, der funktioniert. 3. Komplexität verwalten

Nur die Nummern 1 und 2 zu machen ist nicht genug. 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 schwierigsten zu beherrschende Programmierfähigkeit. Es erfordert Überlegungen zu Architektur, Design und Codierung. Es erfordert das Beherrschen des Refactorings. Es erfordert ein Verständnis der SOLID/DRY-Prinzipien. Wenn ich einen Programmierer einstellen müsste, der das Intro to Algorithms gelesen und sich dem Beherrschen gewidmet hat, oder einen, der The Pragmatic Programmer liest und sich dem Sein widmet, würde ich jedes Mal den letzteren einstellen. (Nicht, dass sie sich gegenseitig ausschließen müssten).

1
Tod

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

1
Thomas Eding

Ich denke immer, dass Programmieren datengesteuerter ist als Algorithmen. Aber was nützen Daten, wenn Sie nichts damit anfangen? All diese Manipulationen sind Algorithmen. Ja, die Programmierung basiert 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 ganz einfach 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 Leistung und Manipulationen der Listenstruktur verbunden ist.

1
gbjbaanb

Ja.

Informatik besteht hauptsächlich aus Algorithmen (in Prozent).

Nein.

Aber das ist die "Wissenschaft" der Computer. Die häufigste Anwendung der Informatik ist Software Engineering. Software Engineering besteht nicht hauptsächlich aus Algorithmen. Es geht hauptsächlich um die Kunst des Schaffens, das Streben nach Perfektion und darum, das Leben realer Menschen, die heute existieren, positiv zu beeinflussen. Die Informatik mag zwar die gleiche Motivation haben, ist jedoch weit entfernt von der Softwareentwicklung.

Fragen Sie einen fest angestellten Professor an einer großen Informatikuniversität, was für das Programmieren am wichtigsten ist, und er wird Ihnen wahrscheinlich "Algorithmen und Datenstrukturen" mitteilen.

Fragen Sie einen leitenden Entwickler eines großen Softwareunternehmens, was für das Programmieren am wichtigsten ist, und er wird Ihnen wahrscheinlich sagen: "Lernen, Kunden zu begeistern" (dies bedeutet, agil zu verstehen, wie ein Kunde zu denken, pünktlich zu versenden und kontinuierlich machen Dinge, die arbeiten, etc)

Könnte wie eine Semantik erscheinen, aber nach meinem Verständnis unterscheiden sich die beiden sowohl in der Praxis als auch in der Theorie bemerkenswert.

1
Paul Hazen

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

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

Automaten

Powerset-Konstruktion. Algorithmus zum Konvertieren eines nichtdeterministischen Automaten in einen deterministischen Automaten. Todd-Coxeter-Algorithmus. Verfahren zum Generieren von Cosets.

Künstliche Intelligenz

Alpha-Beta. Alpha Max plus Beta Min. Weit verbreitet in Brettspielen. Ameisenalgorithmen. Die Ameisenkolonieoptimierung ist eine Reihe von Algorithmen, die vom Ameisenverhalten inspiriert sind, um ein Problem zu lösen und den besten Weg zwischen zwei Orten zu finden. DE (Differential Evolution). Lösen Sie das Problem der Chebyshev-Polynomanpassung. Semi-Supervised Recognition 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 unerlässlich 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. Aus einer mathematischen Konvertierung der Insektensicht bewertet dieser Algorithmus, wie man Objekte meidet.

Genetische Algorithmen

Sie verwenden drei Operatoren. Auswahl (Lösung auswählen), Reproduktion (verwenden Sie ausgewählte Lösungen, um andere zu konstruieren), Ersatz (Lösung ersetzen, wenn besser).

Fitness proportionale Auswahl. Auch als Roulette-Rad-Auswahl bekannt, ist eine Funktion zur Auswahl von Lösungen. Auswahl der Kürzungen. 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 universelle Abtastung. Die Individuen werden auf zusammenhängende Segmente einer Linie abgebildet, so dass das Segment jedes Individuums genau so groß ist wie seine Fitness, genau wie bei der Auswahl des Roulette-Rads.

Neuronale Netze

Hopfield net. Wiederkehrendes künstliches neuronales Netzwerk, das als inhaltsadressierbare Speichersysteme mit binären Schwelleneinheiten dient. Sie konvergieren zu einem stabilen Zustand. Backpropagation. Überwachte Lerntechnik zum Training 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 hochdimensionaler Daten.

Bioinformatik

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

Komprimierung

Verlustfreie Komprimierungsalgorithmen

Burrows-Wheeler-Transformation. Vorverarbeitung nützlich zur Verbesserung der verlustfreien Komprimierung. Deflate. Von Zip verwendete Datenkomprimierung. Delta-Codierung. Unterstützung bei der Komprimierung von Daten, bei denen häufig sequentielle Daten auftreten. Inkrementelle Codierung. Delta-Codierung, die auf Folgen von Zeichenfolgen angewendet wird. LZW. (Lempel-Ziv-Welch). Nachfolger von LZ78. Erstellt eine Übersetzungstabelle aus den zu komprimierenden Daten. Wird vom grafischen GIF-Format verwendet. LZ77 und 78. Die Basis weiterer LZ-Variationen (LZW, LZSS, ...). Sie sind beide Wörterbuchcodierer. LZMA. Abkürzung für Lempel-Ziv-Markov-Kettenalgorithmus. LZO. Datenkomprimierungsalgorithmus, der auf Geschwindigkeit ausgerichtet ist. [~ # ~] ppm [~ # ~] (Vorhersage durch partielle Übereinstimmung). Adaptive statistische Datenkomprimierungstechnik basierend auf Kontextmodellierung und Vorhersage. Shannon-Fano-Codierung. Konstruiert Präfixcodes basierend auf einer Reihe von Symbolen und ihren Wahrscheinlichkeiten. Truncated Binary. Eine Entropiecodierung, die normalerweise für gleichmäßige Wahrscheinlichkeitsverteilungen mit einem endlichen Alphabet verwendet wird. Verbessern Sie die binäre Codierung. Lauflängencodierung. Primäre Komprimierung, die eine Folge desselben Codes durch die Anzahl der Vorkommen ersetzt. Sequitur. Inkrementelle Grammatikinferenz auf einer Zeichenfolge. [~ # ~] ezw [~ # ~] (Embedded Zerotree Wavelet). Progressive Codierung zum Komprimieren eines Bildes in einen Bitstrom mit zunehmender Genauigkeit. Kann verlustbehaftete Komprimierung auch mit besseren Ergebnissen 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 Kodierung, jedoch etwas anders betrachtet. Unäre Codierung. 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. Reiscodierung. Form der Entropiecodierung, die für Alphabete nach geometrischen Verteilungen optimal ist.

Verlustkomprimierungsalgorithmen

Lineare Vorhersagecodierung. Verlustkomprimierung durch Darstellung der Spektralhüllkurve eines digitalen Sprachsignals in komprimierter Form. A-Gesetz-Algorithmus. Standard-Kompandierungsalgorithmus. Mu-Gesetz-Algorithmus. Standard-Analog-Signalkomprimierungs- oder Kompandierungsalgorithmus. Fraktale Komprimierung. Methode zum Komprimieren von Bildern mit Fraktalen. Codierung transformieren. Art der Datenkomprimierung für Daten wie Audiosignale oder fotografische Bilder. Vektorquantisierung. Technik, die häufig bei der verlustbehafteten Datenkomprimierung verwendet wird. Wavelet-Komprimierung. Form der Datenkomprimierung, die sich gut für die Bild- und Audiokomprimierung eignet.

Kryptographie

Geheimer Schlüssel (symmetrische Verschlüsselung)

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

Advanced Encryption Standard (AES), auch bekannt als Rijndael. Blowfish. Entwickelt von Schneier als Allzweckalgorithmus, der als Ersatz für das alternde DE gedacht ist. Data Encryption Standard (DES), früher DE-Algorithmus. IDEA (International Data Encryption Algorithm). 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. Stream-Verschlüsselung, die in Protokollen wie SSL für den Internetverkehr und WEP für drahtlose Netzwerke weit verbreitet ist. Winziger Verschlüsselungsalgorithmus. Einfach zu implementierender Blockverschlüsselungsalgorithmus unter Verwendung einiger Formeln. PES (Proposed Encryption Standard). Ä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 erlaubt das Entschlüsseln.

DSA (Digital Signature Algorithm). Generieren Sie Schlüssel mit Prim- und Zufallszahlen. Wurde von US-Agenturen verwendet und ist jetzt gemeinfrei. ElGamal. Basierend auf Diffie-Hellman, verwendet von GNU Privacy Guard-Software, PGP und anderen kryptografischen Systemen. 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 zum Teilen des 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 aus der Verschlüsselung eines Strings oder von Daten beliebiger Länge resultiert und von einer Hash-Funktion verarbeitet wird.

MD5. Wird zum Überprüfen von ISO-Images von CDs oder DVDs verwendet. [~ # ~] ripemd [~ # ~] (RACE Integrity Primitives Evaluation Message Digest). Basierend auf den Prinzipien von MD4 und ähnlich wie SHA-1. SHA-1 (Sicherer Hash-Algorithmus 1). Am häufigsten verwendet von SHA Satz verwandter kryptografischer Hash-Funktionen. Wurde von der Agentur NSA. HMAC. keyed entwickelt -hash Nachrichtenauthentifizierung. Tiger (TTH). Wird normalerweise in Tigerbaum-Hashes verwendet.

Kryptografisch unter Verwendung von Pseudozufallszahlen Siehe. Zufallszahlengeneratoren

Techniken in der Kryptographie

Geheimes Teilen, geheimes Teilen, Schlüssel teilen, M von N Algorithmen.

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

Andere Techniken und Entschlüsselung

Teilmengen-Summe. Ist bei einer Menge von ganzen Zahlen eine Teilmengen-Summe gleich Null? Wird in der Kryptographie verwendet. Shors Algorithmus. Quantenalgorithmus, der einen Code basierend auf asymetrischen Funktionen wie RSA entschlüsseln kann.

Geometrie

Geschenkverpackung. Bestimmen der konvexen Hülle einer Reihe von Punkten. Gilbert-Johnson-Keerthi-Abstand. Bestimmen des kleinsten Abstands zwischen zwei konvexen Formen. Graham Scan. Bestimmen der konvexen Hülle einer Reihe von Punkten in der Ebene. Schnittpunkt des Liniensegments. Ermitteln, ob sich Linien mit einem Sweep-Linien-Algorithmus schneiden. Punkt im Polygon. Testet, ob ein bestimmter Punkt innerhalb eines bestimmten Punktes liegt. Ray/Plane-Schnittpunkt. * Linien-/Dreieck-Schnittpunkt. * Besonderer Fall des Ray/Plane-Schnittpunkts. Polygonisierung impliziter Flächen. Approximieren Sie eine implizite Fläche mit einer polygonalen Darstellung. Triangulation. Methode zur Bewertung des Abstands zu einem Punkt von Winkeln zu anderen Punkten, deren Abstand bekannt ist.

Grafiken 3D Surface Tracker-Technologie. Verfahren zum Hinzufügen von Bildern an Wänden in einem Video, während verborgene Oberflächen berücksichtigt werden. Bellman-Ford. Berechnet kürzeste Pfade in einem gewichteten Diagramm (wobei einige der Kantengewichte negativ sein können). Dijkstra-Algorithmus. Berechnet kürzeste 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 Zyklusfindung. Findet Zyklen in Iterationen. Johnson. Alle Paare kürzester Pfad Algorithmus in dünn gewichteten gerichteten Graphen. Kruskal. Findet einen minimalen Spannbaum für ein Diagramm. Prims. 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 ein Diagramm. Ford-Fulkerson. Berechnet den maximalen Durchfluss in einem Diagramm. Edmonds-Karp. Implementierung von Ford-Fulkerson. Nicht blockierender Minimal Spanning Switch. Für eine Telefonzentrale. Woodhouse-Sharp. Findet einen minimalen Spannbaum für ein Diagramm. Federbasiert. Algorithmus zum Zeichnen von Graphen. Ungarisch. Algorithmus zum Finden einer perfekten Übereinstimmung. Farbalgorithmus. Graph-Farbalgorithmus. Nächster Nachbar. Nächsten Nachbarn finden. Topologische Sortierung. Sortieren Sie einen gerichteten azyklischen Graphen so, dass jeder Knoten vor allen Knoten steht, zu denen er Kanten hat (gemäß den Anweisungen). Tarjans Offline-Algorithmus für die wenigsten gemeinsamen Vorfahren. Berechnen Sie die niedrigsten gemeinsamen Vorfahren für Knotenpaare in einem Baum.

Grafik

Bresenhams Linienalgorithmus. Verwendet Entscheidungsvariablen, um eine gerade Linie zwischen 2 angegebenen Punkten zu zeichnen. Landschaft Zeichnen Sie eine 3D-Szenerie. * DDA-Linienalgorithmus. * Verwendet Gleitkomma-Mathematik, um eine gerade Linie zwischen 2 angegebenen Punkten zu zeichnen. Flood Fill. Füllt einen verbundenen Bereich mit einer Farbe. Bildwiederherstellung. Foto wiederherstellen, Bilder verbessern. Xiaolin Wus Linienalgorithmus. Linien-Antialiasing. Maleralgorithmus. Erkennt sichtbare Teile einer dreidimensionalen Szenerie. Ray Tracing. Realistisches Bild-Rendering. Phong Shading. Ein Beleuchtungsmodell und eine Interpolationsmethode in 3D-Computergrafiken. 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. Berücksichtigt die direkte Beleuchtung und Reflexion von anderen Objekten. Interpolation. Erstellen neuer Datenpunkte wie 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. Dies ist eine Implementierung der Slope-Intercept-Formel zum Zeichnen einer Linie. Spline-Interpolation. Reduziert den Fehler mit dem 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 prädiktive Suche. Auswahlalgorithmus. Findet das k-te größte Element in einer Liste. Binärer Suchalgorithmus. Findet ein Element in einer sortierten Liste. Breitensuche. Durchläuft einen Graphen Level für Level. Tiefensuche. Durchläuft einen Graphen Zweig für Zweig. Best-first-Suche. Durchläuft ein Diagramm in der Reihenfolge der wahrscheinlichen Wichtigkeit mithilfe einer Prioritätswarteschlange. [~ # ~] a [~ # ~] Baumsuche. * Sonderfall der Best-First-Suche, bei der Heuristiken zur Verbesserung der Geschwindigkeit verwendet werden. Suche nach einheitlichen Kosten. Eine Baumsuche, die die Route mit den niedrigsten Kosten findet, auf der die Kosten variieren. Predictive Search. Binäre Suche, die die Größe des Suchbegriffs im Vergleich zu den hohen und niedrigen Werten in der Suche berücksichtigt. Hash-Tabelle. Ordnen Sie Elementen in einer unsortierten Sammlung Schlüssel zu, um sie in einer linearen Zeit abzurufen. Interpolierte Suche. Siehe prädiktive Suche.

Sortieren

Binärbaumsortierung. Sortierung eines Binärbaums, inkrementell, ähnlich der Einfügesortierung. Bogosort. Ineffiziente zufällige Art einer Tischkarte. Blasensortierung. Tauschen Sie die Elemente für jedes Indexpaar aus, wenn sie nicht in der richtigen Reihenfolge sind. Bucket sort. Teilen Sie eine Liste in Buckets auf und sortieren Sie sie einzeln. Verallgemeinert die Sortierung von Taubenlöchern. Cocktail sort (oder bidirektionale Blase, Shaker, Ripple, Shuttle, Happy Hour Sort). Variation der Blasensortierung, die in beide Richtungen sortiert wird, durchläuft jeweils die Liste. Kammsortierung. Effiziente Variation der Blasensortierung, die "Schildkröten", die kleinen Werte am Ende der Liste, eliminiert und Lücken zwischen Werten verwendet. Zählsortierung. 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 sort. Ähnlich wie beim Einfügen sortieren, außer dass das Verschieben eines Elements an die richtige Stelle durch eine Reihe von Swaps erfolgt, wie beim Blasensortieren. Heapsort. Konvertieren Sie die Liste in einen Heap, entfernen Sie das größte Element aus dem Heap und fügen Sie es am Ende der Liste hinzu. Einfügesortierung. Bestimmen Sie, wo das aktuelle Element in die Liste der sortierten Elemente gehört, und fügen Sie es dort ein. Introsort. Oder introspektive Sortierung. Es beginnt in Quicksort und wechselt bei einer bestimmten Rekursionsstufe zu Heapsort. Sortierung zusammenführen. Sortieren Sie die erste und zweite Hälfte der Liste getrennt und führen Sie dann die sortierten Listen zusammen. Pfannkuchensortierung. Elemente eines Präfixes einer Sequenz umkehren. Pigeonhole sort. Füllen Sie ein leeres Array nacheinander mit allen Elementen eines zu sortierenden Arrays. Postman Sort. Hierarchische Variante der Bucket Sort, die von Postämtern verwendet wird. Quicksort. Teilen Sie die Liste in zwei Teile, wobei alle Elemente auf der ersten Liste vor allen Elementen auf der zweiten Liste stehen.; Sortieren Sie dann die beiden Listen. Oft die Methode der Wahl. Radix sort. Sortiert Schlüssel, die Elementen zugeordnet sind, oder Ganzzahlen durch Verarbeiten 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-Sortierung. Verbessert die Einfügesortierung durch Verwendung von Lücken zwischen Werten. Smoothsort. Siehe Heapsort. Stochastische Sorte. Siehe Bogosort.

und viele mehr...

1
Chitrank Dixit

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

Ja, in der Informatik dreht sich alles um Algorithmen. Nun ... eigentlich ist das ein wenig 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 diese verrückten Orte an der Wall Street, die Physiker und Entwickler einstellen, möchten hochkomplexe Probleme auf eine einfache Form reduzieren, die an sich ein tiefes Verständnis der Mathematik und des Algorithmusdesigns erfordert.

Nein, bei der Programmierung geht es nicht nur um Algorithmen. Bei der Programmierung geht es darum, Spezifikationen 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 verwirren und austauschbar zu verwenden. Die 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 darum, Probleme mit Software zu lösen und solide geschäftskompatible Prozesse anzuwenden, damit Probleme effizient gelöst werden können. Während Softwareentwicklungsprozesse - und sogar das Programmieren selbst - ihrer Natur nach algorithmische Prozesse sein können, ist dies nicht dasselbe wie ngefähr Algorithmen.

0
S.Robins