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.
quelle
Antworten:
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:
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!
quelle
fizzbuzz
wenn die Zahl durch beide teilbar war, und dass viele darauf schlüpften, weil Sie bestellen müssen, um Schecks sorgfältig zu modulieren.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:
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.
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.
Breites Wissen und Kultur: Was sind funktionale Sprachen? Wie interpretieren Computer Code? Warum ist LOC eine bedeutungslose Maßnahme? usw.
Vertiefte Kenntnisse der Sprache (n), mit denen Sie arbeiten.
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.
quelle
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 .
quelle
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.
quelle
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.
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.
quelle
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.
quelle
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:
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.
quelle
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.
quelle
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.
quelle
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).
quelle
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.
quelle
Wenn ich eine Sache in der Informatik als den wichtigsten Teil davon auswählen müsste, würde ich Abstraktionen auswählen , keine Algorithmen.
quelle
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...
quelle
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.
quelle