Ich hatte den Eindruck, dass die Konzepte von Zeit und Gedächtniskomplexität ein Muss für Absolventen von Compsci-Kursen sind, aber nachdem ich Ingenieurwissenschaften studiert habe, weiß ich nicht, ob dies der Fall ist. Ich war kürzlich überrascht, einige Absolventen eines örtlichen Colleges zu interviewen, die das Konzept nicht einmal kennen. Ich denke meine Frage ist:
Ist das Konzept der Rechenkomplexität für Softwareentwickler wichtig? Und sollte es in Grundstudiengängen unterrichtet werden?
education
complexity
Muhammad Alkarouri
quelle
quelle
O(n^2)
bedeutet.Antworten:
An den meisten Universitäten gehe ich davon aus (ich hoffe!), Dass Zeit- und Gedächtniskomplexität definitiv Teil ihrer Kurse sind.
Diese "Komplexität" ist ein sehr elastisches Thema. Ob die Leute wirklich alle Theorien wie "ZPP" kennen sollten, ist die Komplexitätsklasse von Entscheidungsproblemen, die auf einer probabilistischen Turing-Maschine in Polynomzeit fehlerfrei gelöst werden können. und solche Sachen sind fraglich. Ich persönlich halte diese fortgeschrittenen Theorien für irrelevant für die Softwareentwicklung.
Im Gegenteil, ich bin der Meinung, dass jeder Entwickler die zeitliche / räumliche Komplexität der von ihm verwendeten Datenstrukturen und Algorithmen kennen sollte.
quelle
Viele Anfänger leiden unter der Besessenheit der Mikrooptimierung. Lernkomp. Komplexität führt die Schüler meiner Erfahrung nach zu einer viel praktischeren Methode zur Einschätzung von Leistung und Skalierbarkeit.
quelle
Nach allem, was ich gesehen habe, scheinen Big-O-Notation sowie Zeit- und Gedächtniskomplexität im formalen Informatikunterricht stark betont zu werden. Da diese Wahrnehmung jedoch Autodidakt ist, basiert sie darauf, zu hören und zu lesen, was Menschen mit solchen Ausbildungen tun sagen und schreiben.
Obwohl ich glaube, dass die allgemeinen Ideen und Konzepte wichtig sind, glaube ich nicht, dass die Formalisierung (wie die Big-O-Notation und verschiedene Begriffe) fast genauso wichtig ist, außer für die Zwecke der Kommunikation. Nur weil jemand mit der formalen Notation und Terminologie nicht vertraut ist, heißt das nicht, dass er nicht sehen kann, wie und warum ein Algorithmus in einem bestimmten Fall schneller als ein anderer wäre. Menschen können sehen, dass die Zeit, die für die Suche nach einem ausgeglichenen Binärbaum benötigt wird, sich auf den Basis-2-Logarithmus der Anzahl der Knoten bezieht, ohne zuerst etwas über die Komplexitätstheorie in einem formalen Sinne zu lernen, wenn sie verstehen, wie der Baum funktioniert, und ein vernünftiges Verständnis von Hoch haben Schulmathematik. Es ist wichtig zu wissen, wann man auf Komplexität und Speichernutzung achten muss, und typische und schlimmste Fälle zu berücksichtigen ... aber einige Leute tun dies nicht.
Die Notation und Terminologie werden für die Kommunikation wichtig. Sie bieten eine gute Möglichkeit, jemand anderem eine Quantifizierung der Leistung eines Algorithmus zu vermitteln. Da es häufig in Artikeln und Erklärungen vorkommt, ist es nützlich, zumindest ein vages Verständnis davon zu haben, damit sie leichter zu befolgen sind.
Ja, die Konzepte sind wichtig (allerdings weniger, wenn Ressourcen und Zeit ausreichend sind, Daten jedoch nicht). Obwohl die Konzepte wichtig sind, ist ihre Formalisierung oft nicht so wichtig - und man muss bedenken, dass Notation und Terminologie nicht mit den Konzepten selbst identisch sind.
Bearbeiten:
Ich würde nicht behaupten, die Konzepte so detailliert zu verstehen wie jemand, der formell studiert hat, aber viele der allgemeinen Ideen sind einfach sinnvoll. Ich denke, es ist wertvoll, dies formal zu studieren, aber ein Teil dieses Wertes kann immer noch ohne existieren.
Was die Einführung der Konzepte (außerhalb des formalen Studiums) betrifft, denke ich, dass ein guter Anfang darin besteht, die Leute zu ermutigen, darüber nachzudenken, wie viel Speicheraufwand die Datenstrukturen haben, welche Schritte die Algorithmen beinhalten und wie sich diese Dinge mit unterschiedlichen Daten ändern.
Es ist auch hilfreich, hypothetische Situationen und Änderungen zu berücksichtigen, z. B. zu überlegen, was passiert, wenn ein Baum ausgeglichen ist, und was passiert, wenn er so unausgeglichen wie möglich ist, oder wie viele Ebenen im Baum die meisten Knoten wären oder wie viele weitere Knoten es können halten, wenn die Tiefe um eine Ebene erhöht wird. Diese Denkweise ist für Programmierer im Allgemeinen ohnehin nützlich, nicht nur, wenn es um Komplexität geht. und wenn es darum geht, darüber nachzudenken, wie Algorithmen und Datenstrukturen unter verschiedenen Umständen funktionieren, weist es natürlich in die gleiche Richtung wie eine formellere Untersuchung der Komplexität.
quelle
Ja
Das Verständnis der Grundlagen der Komplexität ist wichtig und sollte etwas sein, das Sie als Student lernen. Tatsächlich denke ich, dass es normalerweise in jeder Klasse angesprochen wird, die Sie über Datenstrukturen unterrichtet. Ich kann Absolventen verstehen, die nicht verstehen oder sich nicht erinnern, aber ich kann nicht sehen, dass ihnen die Grundlagen der Komplexität nicht beigebracht wurden.
Update: Warum ist es wichtig?
Ich war bei einer Datenbank bei einem bestimmten Job. Wir hatten eine Frist, wann die Migration abgeschlossen sein musste. Die Person, die das Drehbuch schrieb, hatte keine fundamentale Komplexität. Leider hat sich niemand die Logik, die er im Drehbuch verwendet hat, genau angesehen. Ich erinnere mich nicht an die Besonderheiten, außer dass er eine doppelt verschachtelte Schleife anstelle einer Hashtabelle verwendet hat. Nachdem eine Woche lang das Skript ununterbrochen lief, haben wir uns das Aussehen der Logik angesehen und das Problem erkannt. Nach dem Wechsel dauerte es ungefähr 5 Stunden. Wir haben die Frist für den Abschluss der Migration fast verpasst, weil jemand die Komplexität nicht verstanden hat.
Der Punkt ist, dass es leicht ist, versehentlich etwas zu machen, das um Größenordnungen langsamer ist oder dem immer der Speicher ausgeht, bevor der Job abgeschlossen ist. Während schnellere Maschinen mit mehr Speicher kleine Fehler mindern können, können sie Komplexitätsprobleme häufig nicht mindern.
quelle
Ich finde die Frage, ob es "wichtig ist oder nicht", ziemlich vage.
Sie werden viele Menschen finden, die evangelisieren, wie jedes kleinste Stück Wissen auf dieser Welt ihrer Meinung nach unbedingt benötigt wird. Aber das ist ein bisschen sinnlos, weil man nie alles wissen kann und man es nicht erwarten sollte, es sei denn, es hilft einem, die Anforderungen zu erfüllen, die sein Job stellt. Ich bevorzuge im Allgemeinen einen pragmatischeren Ansatz in Bezug auf Bildungsvoraussetzungen, es sei denn, es handelt sich um ein Hobby oder eine willkürliche persönliche Präferenz.
Ist es wichtig für Programmierer, von denen erwartet wird, dass sie äußerst effizienten Code oder innovative Infrastrukturalgorithmen schreiben? Ja.
Ist es wichtig für Programmierer, die herkömmliche Webanwendungen entwickeln? Sie können ohne sie auskommen oder effiziente Implementierungen in der Open Source-Welt erhalten.
Ist es wichtig für Programmierer, die GUIs für Anwendungen entwickeln? Wahrscheinlich nicht, denn erfolgreiche GUI-Frameworks abstrahieren all diese kleinen Details.
Es ist immer schön zu wissen, genau wie alles andere, aber es hält viele (oder sogar die meisten) Programmierer nicht davon ab, ihre Arbeit einfach zur Zufriedenheit ihrer Arbeitgeber zu erledigen.
Wenn man sich dagegen auf der Suche nach grundlegender und theoretischer Ausbildung für ein höheres Studium anmeldet, sollte man erwarten, dass man Fächer lernt, die per Definition eher theoretisch als praktisch sind. Meiner Meinung nach ist es wichtig, dass CompSci. Die Schüler lernen etwas über Komplexität, genauso wie es wichtig ist, dass sie etwas über Kalkül lernen.
Aber seit wann CompSci. Programme lehren Menschen, wie man gute Programmierer ist? Dafür haben Sie spezielle Schulungsprogramme und praktische Erfahrungen (entweder Ihre oder Ihre Programmierkollegen, die ihre mit Ihnen teilen können).
quelle