Frage

Die einfache Antwort (naive?) wäre o (n), wobei n die Länge der kürzeren Zeichenfolge ist. Denn im schlimmsten Fall müssen Sie jedes Paar von Charakteren vergleichen.

so weit so gut. Ich denke, wir können uns alle damit einverstanden, dass die Überprüfung der Gleichheit von zwei gleicher Länge einstriche o (n) Runtime erforderlich ist.

Viele (die meisten?) Sprachen (ich verwende Python 3.7) Speichern Sie die Längen der Zeichenketten, um konstante Time-Lookups zu ermöglichen. Also im Falle von zwei ungleichen Länge Zeichenfolgen können Sie den generellen ARTACDICETAGCODE einfach in konstanter Zeit überprüfen. Sie können bestätigen, dass Python 3 diese Optimierung täft.

Jetzt, wenn wir die Gleichheit von zwei wirklich willkürlichen Saiten (von willkürlicher Länge) überprüft, dann ist es viel wahrscheinlicher (unendlich, ich glaube), dass die Saiten ungleich lang sein werden als gleicher Länge. Welche (statistisch) sicherstellt, dass wir sie fast immer in ständiger Zeit vergleichen können.

So können wir zwei willkürliche Saiten mit einem Durchschnitt von 1 (1) mit einem sehr seltenen schlimmsten Fall von o (n) vergleichen. Sollten wir Saitenvergleiche in Betracht ziehen, um dann o (1) auf dieselbe Weise zu sein, auf dieselbe Weise, wie wir Hash-Tabellensuche in Betracht ziehen, um o (1)?

War es hilfreich?

Lösung

Um die erwartete Zeitkomplexität einer Operation zu diskutieren, müssen Sie eine Verteilung an den Eingängen angeben und erklären auch, was Sie mit $ N $ meinen.

man muss jedoch vorsichtig sein. Berücksichtigen Sie zum Beispiel den Vorschlag in den Kommentaren, um eine Art Verteilung über Wörtern in höchstens 20 in Betracht zu ziehen. In diesem Fall ist der Stringvergleich eindeutig $ O (1) $ , da 20 nur eine Konstante ist. Es gibt mehrere Möglichkeiten, es zu vermeiden:

    .
  • Fragen Sie nach einer nicht asymptotischen Zeitkomplexität. Da die Zeitkomplexität stark von dem Berechnungsmodell abhängt, können Sie (z. B. die Anzahl der zugegriffenen Eingangsspeicherzellen zählen.

  • Sie können eine Eingabeverteilung angeben, die von einem Parameter $ M $ abhängt, und dann nach der asymptotischen Komplexität in Bezug auf $ M $ .

Hier ist ein Beispiel. Bei zwei zufälligen binären Strings der Länge $ n $ werden in Erwartung ungefähr 4 Zugriffe auftreten. Wenn dagegen die Saiten zufällig aus der Sammlung $ 0 ^ I1 ^ {NI} $ ausgewählt werden, ist die Anzahl der Zugriffe in etwa $ (2/3) n $ . Diese beiden Distributionen können auch getrennt werden, selbst wenn wir asymptotische Notation verwenden: Der Algorithmus läuft in $ O (1) $ auf der ersten Verteilung und in $ \ theta (n) $ am zweiten.

Ein anderes Problem ist die Bedeutung von $ n $ . Erwägen Sie zum Beispiel eine Zeichenfolge $ 0 ^ M $ , wobei $ M \ SIM G (1/2) $ ist eine geometrische Zufallsvariable. Wenn Sie mit den Eingängen von Längen ausgeführt werden $ A, B $ , ist die Laufzeit $ \ theta (\ min (A, B )) $ . Wie sollen wir dies in Bezug auf $ n= A + B $ drücken? Eine Wahl ist, nach der erwarteten Laufzeit zu fragen, da die Eingangslänge $ N $ ist. In diesem Fall, $$ \ mathbb {e} [\ min (a, b)]=sum_ {a= 1} ^ {n-1} \ frac {(1/2) ^ a (1/2) ^ {n-1-a }} {\ sum_ {a '= 1} ^ {n-1} (1/2) ^ {a'} (1/2) ^ {n-1-a '}} \ min (a, na)=frac {1} {n-1} \ sum_ {a= 1} ^ {n-1} \ min (a, na) \ ca. \ frac {n} {4}, $$ Die erwartete Laufzeit ist also $ \ theta (n) $ .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top