Sind alle Programmierprobleme Algorithmusprobleme? [geschlossen]

13

Mir gefällt, wie "Introduction to Algorithms" von Cormen et al. vermittelt Wissen. Ein Grund ist, dass alles mit Programmierproblemen zu tun hat und das Buch nicht in einer bestimmten Programmiersprache implementiert ist. Diese Sprachunabhängigkeit bietet einen Fokus auf die Ideen im Allgemeinen.

Also meine Frage ist, wie es im Titel heißt. Ist jedes lösbare Programmierproblem lösbar, wenn man auf diese algorithmische Weise denkt? Egal in welcher Sprache, auf welchem ​​Gebiet usw.? Wenn ja, geben Sie Argumente an, sonst geben Sie Argumente an!

Ich habe nicht viele komplexe Programme mit GUI, AI, Graphics usw. implementiert. Aber sind diese Arten von Problemen auch eine Frage des Denkens über gute Algorithmen?

Wittgenstein
quelle
6
Das häufigste Problem für einen Programmierer, imho, ist: "Oh, das haben Sie gemeint? Jetzt verstehe ich. Es ist jedoch nicht das, was ich implementiert habe, sorry." Ist das ein Programmierproblem?
Keppla
1
Diese Frage ist sehr ähnlich.
back2dos
Sie müssen einen Bericht mit dem Kunden erstellen, dessen Anforderungen beschreiben und auf dieser Grundlage die Software entwerfen, testen, implementieren, umgestalten, optimieren und warten. Sie benötigen Umgebungen zum Testen, Entwickeln, Bereitstellen, Ausführen und Messen der Software. In diesem System ist ein einzelner Algorithmus nur ein Implementierungsdetail.
Inf3rno
@Keppla (plus eins) ope, es ist ein Anforderungsproblem, die Ursache aller Softwareprobleme
Mawg sagt, Monica

Antworten:

29

Dies hängt davon ab, wie Sie "Programmierproblem" definieren.

In realen Projekten lautet die Antwort definitiv NEIN. Die meisten Probleme sind nicht einmal technische Probleme, sondern Kommunikationsprobleme, unklare Anforderungen usw.

Dann haben Sie ganze Fächer von Problemklassen, die so gut wie keine Algorithmen benötigen. Zum Beispiel sind GUIs oft einfach zu "programmieren", aber das eigentliche Problem besteht darin, ein gutes Design zu haben (unter dem Gesichtspunkt der Benutzerfreundlichkeit, nicht nur des grafischen Erscheinungsbilds).

Es gibt jedoch einige Bereiche, in denen die Probleme aufgrund der Art des Feldes viel algorithmischer sind. Zum Beispiel ist KI ein Hauptfach, in dem Algorithmen im Mittelpunkt stehen. Grafiken können algorithmintensiv sein, aber es kommt darauf an, was genau mit "Grafikprogrammierung" gemeint ist.

Wenn das Problem, das Sie programmgesteuert lösen, für eine mathematische Darstellung geeignet ist, betreten Sie im Allgemeinen den algorithmischen Bereich. Dies ist natürlich nur ein grober Indikator, da Sie für so ziemlich alles mathematische Modelle erstellen können. Aber für die meisten Dinge würden Sie normalerweise nicht in Betracht ziehen, dies zu tun.

Letztes Beispiel: Wenn das Problem darin besteht, eine GUI zu erstellen, mit der Daten für Geschäftsobjekte eingegeben werden können, würden Sie nicht viel über mathematische Formulierungen nachdenken. Wenn das Problem jedoch darin besteht, eine grafische Benutzeroberfläche zu erstellen, die sich dynamisch ändert und Elemente basierend auf einem bestimmten Wichtigkeitswert verschiebt, ist es viel wahrscheinlicher, dass Sie ein mathematisches Modell und eine algorithmische Implementierung erhalten.

Frank
quelle
2
Anscheinend hängt es auch davon ab, wie Sie "Algorithmus" definieren. Ich würde sagen, dass nur sehr wenige Probleme neuartige Algorithmen erfordern, aber da ein Computerprogramm nur aus zwei Teilen besteht - Algorithmen und Datenstrukturen - erfordern alle Probleme einige Algorithmen, auch wenn diese Algorithmen trivial sind. Ein Algorithmus ist kein mathematisches Modell, sondern eine Folge von Anweisungen.
Philosodad
Das ist im engsten Sinne wahr, aber ich akzeptiere es nicht i++als unseren neuen Overlord .. ähm .. Algorithmus.
Frank
Aber was wäre, wenn wir nichts über Addition wüssten? Dann wäre die Einführung der Addition eine große Neuerung in unseren Algorithmenstudien! Und so weiter, bis wir auf immer komplexere Algorithmen stoßen.
CMCDragonkai
8

Was meinst du mit Programmierproblem?

Laut Wikipedia:

Computerprogrammierung (oft als Programmieren oder Codieren abgekürzt) ist der Prozess des Entwerfens, Schreibens, Testens, Debuggens und Verwaltens des Quellcodes von Computerprogrammen.

Dies bedeutet, dass die Programmierung im Allgemeinen von Natur aus größer ist als das Übersetzen von Algorithmen durch Code.

Um ein Beispiel zu nennen: Ein Programmierproblem, das ich gerade habe, besteht darin, dass ich mich mit einem alten Spaghetti-Quellcode befassen muss, indem ich Komponententests hinzufüge und ihn dann umgestalte . Es geht auch darum, Kommentare an der richtigen Stelle einzufügen, die Groß- und Kleinschreibung von Namen zu normalisieren usw. Es hat nichts oder wenig mit Algorithmen zu tun.

Ebenso hängen viele Entwickleraufgaben nicht mit Algorithmen zusammen. Beispiel: Internationalisierung. Auf die gleiche Weise verwenden viele Anwendungen (z. B. CRUD) im Quellcode nicht zu viele Algorithmen (und sprechen nicht über den zugrunde liegenden Code des Frameworks).

Wenn Sie nun annehmen, dass in "Programmierproblem" "Programmieren" das Synonym für die Übersetzung von Algorithmen durch Code ist, dann wäre logischerweise jedes Problem ein Algorithmusproblem: A × n = B × nwenn A = B.

Arseni Mourzenko
quelle
Es gibt einen Unterschied zwischen einer Aufgabe und einem Problem . Ihr Problem besteht nicht darin , Komponententests hinzuzufügen oder Legacy-Code zu verwalten. Es ist die Lösung für das Problem, das in der Codebasis liegt, nicht das Programmverhalten selbst, das der Code durch Algorithmen darstellt.
zxcdw
Ihre Aufgabe ändert, wie beschrieben, nichts am Verhalten des Programms. Vermutlich ist es Vorarbeit für einige andere Änderungen, die Algorithmen beinhalten könnten oder nicht. Ich glaube nicht, dass irgendjemand dafür bezahlt wird, den ganzen Tag über Arbeitscode umzugestalten.
MarkJ
6

Ich denke, die Antwort lautet nachdrücklich nein . Algorithmen sind nur Bausteine ​​in einem viel größeren Kompetenzbereich.

Ich habe meinen Abschluss in CS gemacht und mich auf KI spezialisiert

Dort bestand das grundlegende Problem, zumindest so wie ich es sah, darin, gute Darstellungen für Informationen zu finden . Diese Darstellungen sollten versuchen, gut zu den Wissensstrukturen in den Köpfen der Menschen zu passen und die Art der Manipulationen und Änderungen zu erleichtern, die an ihnen vorgenommen werden.

Für die tägliche Programmierung bedeutet dies, dass das Hauptproblem darin besteht, die richtige domänenspezifische Sprache (DSL) für die jeweilige Situation zu ermitteln. Es gibt viele Möglichkeiten, DSLs zu erstellen. Eine gewöhnliche Programmierung, bei der Klassen, Variablen und Methoden definiert werden, schafft in der Tat eine DSL, weil Sie damit Dinge sagen können (Ihre mentalen Strukturen dem Code zuordnen), die Sie ohne sie nicht sagen könnten.

Algorithmen sind ebenfalls wichtig, aber sie sind nur ein Teil der Geschichte.

Mike Dunlavey
quelle
5

Ich nehme an, Sie könnten sagen, dass alle Computerprogramme Algorithmen sind, weil Sie eine Abfolge von Anweisungen vorschreiben, um das gewünschte Ergebnis zu erzielen. Einige der schwierigsten Probleme bestehen jedoch nicht in der Kommunikation eines Programms mit einem Computer, sondern in der Kommunikation eines Programms mit Menschen, die die Software testen und modifizieren.

Mit anderen Worten, es ist Computern egal, ob Ihr Code für Menschen völlig unverständlich ist. Sie werden es so oder so gut laufen lassen. Die Herausforderung besteht darin, den Code so klar zu machen, dass alle Fehler wie ein Daumenschmerzen auffallen.

Interessanterweise sind die technischen Dinge, die ich im College über Algorithmen gelernt habe, seit langem von dem, was ich seitdem selbst gelernt habe, in den Schatten gestellt worden. Wenn ich zu diesem Zeitpunkt einen dritten College-Abschluss machen wollte, um mir bei meinem Job zu helfen, dann wäre dies in englischer Komposition.

Karl Bielefeldt
quelle
2

Die meisten Programmierprobleme sind tatsächlich Systemverwaltungsprobleme.

Das ist eine flippige Antwort, aber ich habe festgestellt, dass dies öfter zutrifft, als man erwarten könnte. Ich weiß nicht, wie oft ich auf Fehler gestoßen bin, weil DNS auf dem Testcomputer falsch konfiguriert wurde, ein veralteter Prozess noch ausgeführt wird, der CPU / Speicher / Ports überlastet, das Programm mit der falschen Benutzer-ID ausgeführt wird und daher die falsche hat Berechtigungen, die Festplatte wurde falsch partitioniert und so lief der Speicherplatz aus, die falsche Version der Konfigurationsdatei wurde installiert usw.

Die Algorithmen richtig zu machen, ist normalerweise nur ein kleiner Teil des Problems. Der Rest des Problems besteht darin, das Programm zur Lösung realer Probleme in der realen Welt einzusetzen.

Stuart Marks
quelle
"Die richtigen Algorithmen zu finden, ist normalerweise nur ein kleiner Teil des Problems." Probleme bei kaggle.com passen NICHT in diese Beschreibung.
Gandalf
Ich stimme zu, ich habe sie nur in die Kategorie "Sanitär" eingestuft. Die Arbeit mit den Diensten anderer Programmierer, APIs und manchmal Frameworks bringt die Dinge nur so zusammen, wie jemand anderes gedacht hat, dass sie funktionieren sollten.
JeffO
2

Ich würde denken, dass ja, alle Programmierprobleme durch algorithmisches Denken lösbar sind. Schließlich ist ein Algorithmus nur eine Reihe von Anweisungen, die dem Computer mitteilen, was zu tun ist.

Nehmen Sie einige Beispiele von oben

Zum Beispiel sind GUIs oft einfach zu "programmieren", aber das eigentliche Problem besteht darin, ein gutes Design zu haben (unter dem Gesichtspunkt der Benutzerfreundlichkeit, nicht nur des grafischen Erscheinungsbilds).

In Bezug auf die Programmierung und sogar das Design, das Muster / Regeln kennt, die zu effektiven GUI-Designs führen, die benutzerfreundlich und effizient sind. Diese Regeln müssen auf einen Algorithmus reduziert werden, der bei der Erstellung einer benutzerfreundlichen Benutzeroberfläche hilfreich ist. Tatsächlich können die tatsächlichen Schritte zum Platzieren der Steuerelemente auf der GUI auch auf einen Algorithmus reduziert werden

Um ein Beispiel zu nennen: Ein Programmierproblem, das ich gerade habe, besteht darin, dass ich mich mit einem alten Spaghetti-Quellcode befassen muss, indem ich Komponententests hinzufüge und ihn dann umgestalte. Es geht auch darum, Kommentare an der richtigen Stelle einzufügen, die Großschreibung von Namen zu normalisieren usw. Es hat nichts oder wenig mit Algorithmen zu tun.

Die Vorgehensweise beim Hinzufügen von Komponententests kann jedoch durch einen Algorithmus wie z

  1. Identifizieren Sie den neuen Komponententest
  2. Unit Test schreiben
  3. Anwenden des Algorithmus zur Normalisierung der Großschreibung
  4. Kommentaralgorithmus anwenden

Beispiel: Internationalisierung Dies ist ein perfektes Beispiel für eine Algorithmuslösung. Am einfachsten ist es, wenn Sie ein bekanntes Wort in einem Wörterbuch suchen und durch die andere Sprachform ersetzen. (Natürlich beinhaltet das wirkliche Leben Sätze und Kontext und der Algorithmus kann Schritte beinhalten, um mit Muttersprachlern zu verifizieren, aber die Grundlagen gelten)

Das Problem bei den meisten Ja-Antworten ist, dass die Leute an Algorithmen denken, die QuickSort und Bubble-Sortierung anstelle einer Reihe von Anweisungen verwenden, die eine ausführliche und vage Beschreibung eines Problems auf eine Reihe klar definierter Logik / Regeln reduzieren.

Armitage
quelle