Beeinflusst Hardware / Implementierung die zeitliche / räumliche Komplexität von Algorithmen?

32

Ich bin noch nicht einmal ein CS-Student, also ist das vielleicht eine blöde Frage, aber bitte trage sie mit mir ...

Im Zeitalter vor dem Computer können wir eine Array-Datenstruktur nur mit so etwas wie einem Array von Schubladen implementieren. Da man die Schublade mit dem entsprechenden Index lokalisieren muss, bevor man den Wert daraus extrahiert, ist die zeitliche Komplexität der Array-Suche , unter der Annahme einer binären Suche.O(log(n))

Die Erfindung der Computer machte jedoch einen großen Unterschied. Moderne Computer können so schnell aus ihrem RAM lesen, dass wir die zeitliche Komplexität der Array-Suche als (auch technisch nicht, da es länger dauert, das Register über eine größere Entfernung zu bewegen usw.).O(1)

Ein weiteres Beispiel sind Python-Wörterbücher. Während man eine Wörterbuchzugriffskomplexität von mit einer falsch geschriebenen überladenen Magiemethode (oder einem lächerlichen Pech, dh Schlüsseln mit vielen Hash-Kollisionen) erhält , wird normalerweise angenommen, dass es sich um O ( 1 ) handelt . In diesem Fall hängt die zeitliche Komplexität sowohl von der Implementierung der Hash-Tabellen in Python-Wörterbüchern als auch von der Implementierung der Hash-Funktionen durch die Schlüssel ab.O(n)__hash__O(1)

Bedeutet dies, dass Hardware / Implementierung die zeitliche Komplexität von Algorithmen beeinflussen kann? (Während es in beiden Beispielen um Datenstrukturen statt Algorithmen geht, bauen die letzteren auf den ersteren auf, und ich habe noch nie von der zeitlichen Komplexität von Datenstrukturen gehört, weshalb ich hier den Begriff "Algorithmen" verwende.)

Algorithmen sind für mich abstrakt und konzeptionell. Ihre Eigenschaften wie die Komplexität von Zeit und Raum sollten nicht davon abhängen, ob sie auf eine bestimmte Art und Weise implementiert werden, aber sind sie dies?

nalzok
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Gilles 'SO- hör auf böse zu sein'

Antworten:

42

Sicher. Bestimmt. Hier erfahren Sie, wie Sie Ihre Beschwerden in Einklang bringen können.

Wenn wir die Laufzeit von Algorithmen analysieren, tun wir dies in Bezug auf ein bestimmtes Rechenmodell . Das Berechnungsmodell gibt Dinge wie die Zeit an, die für die Ausführung jeder Grundoperation benötigt wird (ist eine Array-Lookup- oderO(Logn) -Zeit?). Die Laufzeit des Algorithmus hängt möglicherweise vom Berechnungsmodell ab.O(1)

Sobald Sie ein Rechenmodell ausgewählt haben, ist die Analyse des Algorithmus eine rein abstrakte, konzeptionelle, mathematische Übung, die nicht mehr von der Hardware abhängt.

In der Praxis möchten wir jedoch in der Regel ein Berechnungsmodell auswählen, das die Realität unserer Hardware widerspiegelt - zumindest zu einem vernünftigen Grad. Wenn sich also die Hardware ändert, können wir uns dazu entschließen, unsere Algorithmen unter einem anderen Berechnungsmodell zu analysieren, das für die neue Hardware besser geeignet ist. So kann die Hardware die Laufzeit beeinflussen.

Der Grund, warum dies nicht offensichtlich ist, liegt darin, dass wir in Einführungskursen häufig nicht über das Rechenmodell sprechen. Wir machen nur implizit einige Annahmen, ohne sie jemals explizit zu machen. Das ist aus pädagogischen Gründen vernünftig, hat aber Kosten - es verbirgt diesen Aspekt der Analyse. Jetzt wissen Sie.

DW
quelle
Wie Sie sagten, verwenden wir das Direktzugriffsmodell als Berechnungsmodell, aber wenn wir die GPU für bestimmte Berechnungen verwenden, ändert sich die Zeitkomplexität für einige Algorithmen, wenn die SIMD-Anweisungen verwendet werden.
Deep Joshi
6
Beachten Sie auch, dass die O () - Notation eine Obergrenze ist. Selbst wenn Sie die Schubladenanalogie verwenden, dauert das Auffinden einer Schublade in einer begrenzten Größe (der reale Speicher ist in der Größe begrenzt) O (1) Zeit. Selbst wenn Sie 20 Minuten brauchen, um die am weitesten entfernte Schublade zu erreichen (alle Cache-Ausfälle und Sie müssen sogar die Daten aus dem Swap laden), ist dies immer noch O (1) -Zeit, da 20 Minuten Ihre verborgene Konstante für den Speicherzugriff sind.
Goswin von Brederlow
2
O(1)O(n)
1
@CortAmmon: Selbst in einem großen Array ist die lineare Suche möglicherweise schneller als die Verwendung einer Hash-Karte, wenn sich alle Elemente mit Ausnahme einiger Elemente, nach denen gesucht wird, ganz am Anfang befinden. Wenn zum Beispiel 50% der Elemente mit dem ersten Element übereinstimmen, 25% mit dem zweiten, 12,5% mit dem dritten usw., mit der Ausnahme, dass ein Oddball-Element mit etwas übereinstimmt, das sich an einer beliebigen Stelle im Array befindet, mit der erwarteten Anzahl von Vergleichen M-Lookups für eine Liste der Größe N durchführen, wäre 2M + N.
Supercat
5
@DeepJoshi SIMD-Anweisungen ändern nicht die Komplexität von Algorithmen. Sie ändern nur die multiplikative Konstante.
Gilles 'SO- hör auf böse zu sein'
5

Ich denke, es gibt ein grundlegendes Missverständnis in der Frage. Sie vergleichen eine Person, die ein Objekt in einer sortierten Liste findet (z. B. eine bestimmte Seite in einem Buch, deren Nummer angegeben ist), mit einem Computer, der ein Objekt aus einem Array nachschlägt.

O(Logn)O(1) dass der Computer so schnell ist, dass er die binäre Suche im Handumdrehen ausführen kann. Es liegt vielmehr daran, dass der Computer überhaupt keine binäre Suche verwendet. Der Computer verfügt über einen Mechanismus zum direkten Abrufen von Elementen aus dem Array, ohne zu suchen. Um den Inhalt einer Array-Zelle abzurufen, teilt der Computer dem Speichercontroller lediglich das Analogon "Give me page seventeen" mit, der Speichercontroller setzt die Spannungen an den Adreßkabeln auf die binäre Darstellung von siebzehn und die Daten kommen zurück.

Ja, die Hardware (dh das Berechnungsmodell) beeinflusst die Laufzeit von Algorithmen, wie DW erklärt , aber auf diesem Beispiel scheint Ihr Array-Zugriff nicht zu basieren.

David Richerby
quelle
2
Um fair zu sein, haben Sie alle Teile dazwischen übersprungen: "Der Speichercontroller stellt die Spannungen an den Adreßkabeln auf die binäre Darstellung von siebzehn ein" und "Die Daten kommen zurück". Eines dieser Stücke an Sicherheit grenzender Wahrscheinlichkeit ist ein binärer Suchbaum der Art , durch die OP beschrieben; es wird jedoch in konstanter Zeit ausgeführt, da log n für alle n ungefähr 64 ist .
Quuxplusone
@Quuxplusone Welcher Teil des Speichers verwendet die binäre Suche? Die Adressleitungen selektieren direkt die Speicherzellen.
David Richerby
Wir arbeiten weit außerhalb meines Fachgebiets, aber ich wollte damit sagen, dass ein Adressdecoder in Form eines Demuxerbaums implementiert wird . (Angenommen, wir treffen direkt auf den physischen Speicher und ignorieren alle zusätzlichen Komplikationen, die mit dem Zwischenspeichern einhergehen .) Auch diese zusätzlichen Komplikationen tragen nur dazu bei O(lg size-of-memory), dh sie sind vernachlässigbar - aber genau das hat OP gefragt!
Quuxplusone
2

Nein, die Hardware hat keinen Einfluss auf die Komplexität der Algorithmen.

Aber wirkt sich jedoch auf die Wahl des Algorithmus aus und kann den Nutzen der Komplexitätsanalyse bis zu einem Punkt beeinträchtigen, an dem die Analyse praktisch bedeutungslos wird (oder lediglich von akademischem Interesse ist).

Das Finden der richtigen Schublade (beim Zugriff auf ein Array-Element) verwendet den Algorithmus "Open Nth Element Direct By Index", nicht den Algorithmus "Linear suchen" oder "Binär suchen". Die Algorithmen werden nicht geändert, sondern die Wahl.

Zum anderen ist die Komplexitätsanalyse selbst bzw. deren Aussagekraft betroffen stark von der Hardware.

Viele Algorithmen, die durch ihre Komplexitätsanalyse herausragend sind, sind schlecht oder in der Praxis sogar unbrauchbar, da der unbedeutende konstante Faktor nicht unbedeutend ist, sondern dominiert .

Oder weil Annahmen, die einst wahr waren (oder größtenteils wahr sind), nicht mehr gelten. So ist zum Beispiel jeder Vorgang meistens derselbe (nur kleine konstante Unterschiede, die keine Rolle spielen), oder es spielt keine Rolle, auf welche Speicherorte Sie in welcher Reihenfolge zugreifen. Aus der Komplexitätsanalyse können Sie schließen, dass ein Algorithmus weit überlegen ist, da er nur so viele Operationen benötigt. In der Praxis kann es vorkommen, dass jede Operation einen garantierten Cache-Fehler (oder noch schlimmer einen Seitenfehler) verursacht, der ein k einführt , das so groß ist, dass es nicht mehr unbedeutend ist, sondern alles dominiert.
Wenn der Algorithmus A 500 Operationen für die Verarbeitung eines Datensatzes einer bestimmten Größe benötigt und der Algorithmus B nur 5, B jedoch 5 Fehler verursacht, die jeweils 20 Millionen Zyklen auslösen, ist A besser, ungeachtet dessen, was die Analyse oder der gesunde Menschenverstand aussagen.

Dies hat vor ein paar Jahren zu lustigen Überraschungen geführt, wie zB beim Cuckoo Hashing. Welches war weit überlegen, weil [lange Liste der Vorteile]. Nachdem sich der Hype abgekühlt hatte, stellte sich heraus, dass er erheblich schlechter war, da er bei jedem Zugriff zwei Cache-Fehlschläge (Fehler bei größeren Datenmengen) garantierte .

Ähnliches gilt für die Identifizierung und Verarbeitung von Teilmengen von Daten. Heutzutage lautet die richtige Lösung häufig: "Mach einfach alles" , dh anstatt herauszufinden, was du zu verarbeiten und zu tun hast, verarbeite den gesamten Datensatz linear, auch wenn du vielleicht nur die Hälfte davon benötigst. Denn ob Sie es glauben oder nicht, das geht schneller, da es keine Verzweigungsfehlervorhersagen, keine Cache-Fehlschläge und keine Seitenfehler gibt.
Müssen Sie die ersten 8 KB und die letzten 3 KB einer 3-MB-Datei lesen? Nun, lesen Sie die komplette Datei und werfen Sie weg, was Sie nicht wollen, denn das Suchen dazwischen ist zehnmal langsamer als das Lesen der kompletten Datei.

Verwenden Sie eine Karte, weil sie logarithmisch komplex ist? Oder eine Hash-Tabelle, die eine konstante Zugriffszeit hat? Constant klingt großartig. Nun, für alles, was weniger als tausend Dinge enthält (abhängig von Hardware, Datengröße und Zugriffsmuster), kann eine lineare Suche genauso gut oder besser sein. Überraschung.

Es sind also nicht die Algorithmen an sich, die betroffen sind, sondern ihre Nützlichkeit und Auswahl.

Damon
quelle