Algorithmus-Zeitanalyse „Eingabegröße“ vs. „Eingabeelemente“


13

Ich bin immer noch ein bisschen verwirrt mit den Begriffen "Eingabelänge" und "Eingabegröße", wenn ich die asymptomatische Obergrenze für einen Algorithmus analysiere und beschreibe

Die Länge der Eingabe für den Algorithmus hängt anscheinend stark von der Art der Daten und dem Algorithmus ab, über den Sie sprechen.

Einige Autoren beziehen sich auf die Länge der Eingabe auf die Größe der Zeichen, die für die Darstellung der Eingabe erforderlich sind. Wenn also "abcde" als Eingabesatz in einem Algorithmus verwendet wird, hat dies eine "Eingabelänge" von 6 Zeichen.

Wenn wir anstelle von Zeichen eine Zahl haben (zum Beispiel ganze Zahlen), wird manchmal die Binärdarstellung anstelle von Zeichen verwendet, sodass die "Eingabelänge" als berechnet wird (wobei L die maximale Zahl in der Eingabemenge ist). .Nlog(L)

Es gibt andere Probleme , dass selbst wenn der Eingangssatz Zahlen sind, sie die „Eingabelänge“ als „Entscheidungsvariablen“ beschreiben, so dass für einen Eingangssatz der Länge N mit Zahlen im Bereich die Eingabelänge ist nur N ( Teilmenge Summe zum Beispiel), oder noch komplizierter die Anzahl der binären Stellenwerte, die es braucht, um das Problem zu erklären (was ich glaube, ist genau das gleiche wie N l o g ( L ) )0232Nlog(L)

So:

  • Kommt es auf den Algorithmus an?
  • Was bedeutet und wann verwendet man die Eingabe Länge "Version"
  • Gibt es eine Regel, nach der ich mich für eine entscheiden kann?

Antworten:


10

Im formalsten Sinne wird die Größe der Eingabe in Bezug auf eine Turing-Maschine-Implementierung des Algorithmus gemessen und es wird die Anzahl der Alphabetsymbole angegeben, die zum Codieren der Eingabe benötigt werden.

Dies ist natürlich eher abstrakt und in der Praxis sehr schwierig oder zumindest sehr ärgerlich - wir müssten uns überlegen, wie wir Delimeter usw. spezifizieren usw. In der Praxis passiert normalerweise, dass wir danach suchen Eine Proxy- Messung der Größe der Eingabe - etwas Bequemeres und Zugänglicheres, das jedoch keine mathematischen Probleme bei unserer Analyse verursacht.

Mit Ihrem "abcde" -Beispiel wäre es normalerweise so, dass das Alphabet, das wir für die Eingabe verwenden, klein ist. Selbst mit der Proxy-Messung von Zeichen wussten wir, dass wir selbst auf einer Turing-Maschine, wenn wir uns die Mühe machen, Geben Sie eine Eingabecodierung an, die "abcde" in eine codierte Form mit einer Länge von höchstens 5 × c für eine Konstante c konvertiert . Diese Erweiterung um eine Konstante würde in unserer asymptotischen Analyse normalerweise keinen Unterschied machen, da wir routinemäßig konstante Faktoren verwerfen.55×c c

In einem anderen Fall messen wir häufig die Größe eines Eingabegraphen anhand der Anzahl der Scheitelpunkte . Wenn wir willkürlich große Graphen spezifizieren wollen, ist die Größe der codierten Eingabe nicht einfach n - was ist zum Beispiel mit den Kanten passiert? Was wir wissen, ist, dass wir ein vernünftiges Codierungsschema verwenden können, das den Graphen in N = c n 2 log n Bits darstellt. Dies ist eher eine Erweiterung als eine Konstante, aber in vielen interessanten Fällen haben wir es nur mit einer Granularität von Polynomen zu tun, und Polynome lassen sich auf vielfältige Weise komponieren - insbesondere als Beispiel, wenn Wir stellen fest, dass unsere Laufzeit O ( p (nnN=cn2logn wo p ein Polynom ist, dann wissen wir, dass es ein Polynom p 'gibt, so dass O ( p ( n ) ) = O ( p ' ( N ) ) , also wenn wir zum formalen Maß der Eingabe zurückkehren Wir sind immer noch in der Polynomzeit.O(p(n))ppO(p(n))=O(p(N))

Ein Ort, an dem dies herunterfallen könnte, ist, wenn Sie mit Zahlen arbeiten. Da eine Zahl mit der Größe in n = O ( log m ) Bits codiert werden kann , wäre dies, wenn unsere Laufzeit O ( m ) wäre, O ( 2 n ) - exponentiell in der tatsächlichen Eingangsgröße -, was die Größe ergeben würde m eine schlechte Wahl für einen Proxy für die Eingabegröße, wenn wir zum Beispiel über die Zugehörigkeit zu P sprechen wollten (wenn Sie zu Strongly- N P -complete und Weakly- N P kommen)mn=O(logm)O(m)O(2n)mPNPNP-komplett, denk dran). Auf der anderen Seite, wenn alles, woran wir interessiert waren, Entscheidbarkeit war, dann wäre es eine ausreichend gute Proxy-Maßnahme.

Es gibt zwar keine festgelegte Regel für die Auswahl eines Proxy-Maßes für die Eingabegröße, die Anforderung besteht jedoch darin, dass die Erweiterung oder Verkleinerung der Proxy-Größe im Vergleich zur Eingabegröße mit dem kompatibel ist, was Sie beweisen möchten. Als Faustregel gilt, dass konstante Faktoränderungen so gut wie keine Rolle spielen. Kleine Polynomfaktoren sind normalerweise in Ordnung und funktionieren für den größten Teil der Grundtheorie, die Sie sehen. Große Polynomfaktoren funktionieren möglicherweise noch in der Theorie, können aber in der Praxis eine böse Überraschung sein. und exponentielle Änderungsbeträge sind normalerweise viel zu extrem.


Danke für die Antwort. Wirklich interessant ist der Teil, den Sie über die Auswahl des richtigen Proxys sprechen, um über die Mitgliedschaft in P oder NP für den Input zu sprechen, das könnte eine komplett neue Frage sein! Ansonsten und zurück zur vorherigen Frage. Welches wäre Ihrer Meinung nach der beste Proxy für einen Algorithmus, dessen Eingabe eine Menge von ganzen Zahlen ist? Ich denke, vielleicht hängt es vom Algorithmus ab? Ich sehe 3 mögliche Optionen: N (Länge der Menge) N * Log (L) (L ist der Maximalwert) und Log (Summe (Menge)).
Jesus Salas

NlogLNN 2logL

5ccn2lognnn2

Möglicherweise hängt die Verwendung von N oder N log L von den Kosten ab, die der Algorithmus für jedes Eingabeelement verursacht. Ich vermute, wenn wir davon ausgehen, dass der Algorithmus eine konstante Zeit verwendet, um seine Arbeit an jedem Eingabeelement unabhängig von seiner Größe in Bits auszuführen (und dies wird nicht missbraucht), dann ist N wahrscheinlich die richtige, was zu O (N) führt. . Wenn andererseits die Größe des Eingabeelements in Bits die Operationskosten erhöht, scheint N log L genauer zu sein, da wir in der oberen Schranke ausdrücken sollten, welche Eigenschaften der Eingabe am Wachstum beteiligt sind
Jesus Salas

5c=1c=log255 O(n2logn)Bits, aber es ist eine ziemlich robuste Obergrenze, die mit beiden normalen Codierungen umgehen kann.
Luke Mathieson

8

Es hängt von Ihrem Rechenmodell und leider auch manchmal vom Algorithmus selbst ab.

  • ababcd
  • Wenn Ihr Modell der RAM ist, entspricht die Größe der Eingabe der Anzahl der Register / Speicherzellen, in denen die Eingabe anfänglich verbleibt. Dies könnte missbraucht werden, da Sie technisch die gesamte Eingabe in ein Register schreiben könnten. Berechnungen sind jedoch dann teurer, wenn Sie das logarithmische Kostenmodell verwenden.
  • ww

Viele Algorithmen werden jedoch nicht in Bezug auf die "tatsächliche" Eingabegröße gemessen. Dann muss man genau hinschauen, worauf sich die Aussage der Analyse bezieht.

  • O(nlogn)nO(1)n
  • n×n

n


1
n ist, unabhängig davon, ob Missverständnisse auftreten können! "Der Algorithmus läuft in der ZeitO(n3)nn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.