Einfach "der maximale Wert in array" und Komplexität von Berechnungen
Ich bin ziemlich neu auf dieses Zeug und ich brauche deine Hilfe.
Ich sollte den Aufbau einer effizienten einfache Algorithmus gibt den maximalen Wert in einem array mit Größe n enthält die zahlen 1,2,...n mit Wiederholungen.
Dann habe ich bestimmt die beste Laufzeit, die Durchschnittliche Laufzeit und die schlechteste Laufzeit.
Also ich habe zwei Fragen:
-
Zunächst bin ich versucht zu verstehen, was ist die Idee, dass eine effiziente Lösung für diese einfachen Algorithmus. Soweit ich das verstanden habe, sollte ich nur eine einfache Schleife von 1 bis n und suchen nach dem maximalen Wert. Ist die "effizienteste" Algorithmus weist darauf hin, dass, Wenn ich den Wert von n in dem array kann ich aufhören zu suchen, mehr Werte, denn dies ist der höchste Wert im array?
-
Wie Ermittle ich die beste Laufzeit und die Durchschnittliche Laufzeit mit der Tatsache, während in die Berechnung der durchschnittlichen Laufzeit, dass Es eine gleichmäßige Verteilung.
Das heißt, jede Zelle im array hat eine chance von 1/n der maximale Wert.
Vielen Dank im Voraus!
- Klingt wie Hausaufgaben... was haben Sie kommen mit so weit? Hinweis: sortierte arrays O(1) Laufzeit, um die max - /min-Werte.
- Aber die Bestimmung der array sortiert O(n) 😐
- so einfach ziehen Sie die max/min-Werte auf beliebige array.
- das array ist nicht sortiert. Ich bin nicht die eine Lösung, aber eine Erklärung für die konkrete Antwort. Als für das, was ich kam so weit, ich schrieb in meiner Frage.
- wahrscheinlich mit #1 ist, dass man NICHT wissen KANN, was die max/min-Werte im array sind, bis Sie haben gescannt, das gesamte array, oder im Voraus wissen, dass das array vorsortiert. z.B. für beliebige "weiß nicht, ob sortierten arrays", es ist eine O(n) - operation zu bekommen, dass die max/min-Wert gesetzt.
- Ja, natürlich, Es ist O(n). aber die Tatsache, es sind nur zahlen zwischen 1..n ermöglicht es mir, dass der Algorithmus ein wenig effizienter, indem Sie aufhören zu suchen, in Fall fand ich den Wert n ein. richtig?
- "Der maximale Wert in einem array mit Größe n enthält die zahlen 1,2,...n mit Wiederholungen" ist offensichtlich n, nicht wahr?
- Es enthält zahlen zwischen 1...n (nicht alle). Auch die Tatsache, dass es sein könnte, Wiederholungen impliziert nicht alle zahlen immer zeigen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besten Fall - das finden der max-element als das erste (
O(1)
), worst-case - es ist das Letzte element überprüft (O(n)
).Der schwierige Teil ist der Durchschnitt der Fall ist.
Finden Sie die durchschnittlichen Fall - wir müssen die erwartet Anzahl der Iterationen!
Da kann man aufhören, nachdem Sie finden das maximum, das wir teilen das problem in zwei Teile:
[0,n-1)
: Da im Durchschnitt (unter der Annahme gleichmäßige unabhängigen Verteilung für jedes element) - Anzahln
hat Wahrscheinlichkeit 1/n in jedem Ort, dann ist die erwartete Anzahl der Iterationen, die für diesen Teil ist1/n + 2*((n-1)/n)/n + 3 * ((n-1)/n)^2/n + ... + (n-1) * ((n-1)/n)^(n-2)/n
1Die obige Formel ergibt sich eine hässliche Formel, die
O(n)
n
: so müssen Sie zu den oben genanntenn* ((n-1)/n)^(n-1)
, dieO(n)
sowie (lim unendlich ist1/e * n
).Diese Summen in
O(n)
Durchschnittliche Zeit, die Lösung.(1): Die Formel für jedes element ist
j*((n-1)/n)^(j-1) * (1/n)
weil:j
- für die Anzahl der Elemente zu überprüfen (Anzahl der Iterationen)((n-1)/n)^(j-1)
- Die Wahrscheinlichkeit, dass es keinen
im vorherigen Elemente(1/n)
- Wahrscheinlichkeit, diese Zahl istn
.1..n
.1/n
chance, die max, und(n-1)/n
nicht, um es zu sein. Ich werde die richtige Terminologie. Vielen Dank für Ihren Kommentar.contains the numbers 1,2,...n with repetitions
. Der beste Fall ist eigentlich: Lesen Sie das erste element, es ist n, und gibt es zurück. Das ist O(1).Der Algorithmus funktioniert wie folgt: zunächst wählen Sie eine Nummer (in diesem Fall wähle ich die erste Zahl des Arrays und so tun, es ist das max, dann Vergleiche ich es mit der nächsten Nummer und wenn es größer ist nehme ich, dass als der neue max, bis ich fertig bin mit der Suche im array), wird der nächste code ist in C:
Wenn es keine Vorherige information über die array - (es ist z.B. sortiert), dann gibt es auch keine worst-case oder best-case, und Sie müssen scan alle Elemente, um herauszufinden, die Max, und es dauert O(n) Zeit.
Auch die Kenntnis der Wahrscheinlichkeitsverteilung der erste max-Wert für jede Zelle ist nutzlos, im Allgemeinen (es sei denn, es verringert Ihre Suche Raum. z.B., Wenn Sie wissen, dass nur Konstante Anzahl von Zellen nicht-null-Wahrscheinlichkeit, das max-Wert, dann brauchen Sie nur zu suchen, die Zellen und es dauert Konstante Zeit). So, in der Regel
Best-case-Laufzeit = Worst-case-Laufzeit = Durchschnittliche Laufzeit = O(n)
Die schlechtesten und die besten Fälle sind einfach. Der Durchschnittliche Fall ist interessanter. Blick auf die Wikipedia-Seite für Die Geometrische Verteilung.