Sortiere eine Reihe von n Zahlen zwischen [0,2k], wobei zwischen jedem Paar existiert: | Ai-Aj | = k / n

8

Sei A1,A2,...,An reelle Zahlen zwischen [0,2k] (k ist konstant). Es ist bekannt, dass für jedes Paar von Ai,AJ dann |Ai-Aj|>=k/n ,

Beschreiben Sie einen Algorithmus, der die Zahlen in O(n) runtime worst-case sortiert.

Ich weiß, dass die Antwort Eimer-Art sein sollte. Kann nicht verstehen, warum, Und wenn ja, wie wähle ich die richtige Menge an Eimern? Wie hilft das |Ai-Aj|>=k/n tatsächlich?

    
StationaryTraveller 04.07.2013, 18:45
quelle

1 Antwort

7

Die Bedingung | A i - A j | ≥ k / n bedeutet, dass, wenn Sie den Bereich [0, 2k] in 2n verschiedene Buckets aufteilen (jeder hat die Größe 2k / 2n = k / n), dann kann es höchstens eine Zahl in jedem Bereich geben (außer möglicherweise if) die Zahlen befinden sich an den Endpunkten der Buckets.) Wenn Sie die Buckets enger erstellen (z. B. durch Erstellen von 3n Buckets), hat jeder Bucket eine Größe kleiner als k / n und kann daher höchstens eine Zahl enthalten.

Sie können die Zahlen dann mithilfe eines Bucket-Sortieralgorithmus sortieren:

  • Erstellen Sie ein Array von 3n-Buckets, die jeweils den Bereich [(2k / 3n) i, ​​(2k / 3n) (i + 1))
  • darstellen
  • Für jede Nummer:
    • Teilen Sie diese Zahl mit (2k / 3n), um zu bestimmen, in welchen Bucket sie platziert werden soll.
    • Platziere die Nummer in diesem Bucket.
  • Für jeden Eimer:
    • Wenn dieser Bucket nicht leer ist, schreiben Sie die Nummer in diesem Bucket in das Ergebnis-Array.

Der erste Schritt dauert O (n) Zeit, da Sie ein Array der Größe 3n erstellen. Der nächste Schritt benötigt Zeit O (n), da Sie jede der O (n) -Zahlen einmal besuchen und O (1) bei jedem Schritt arbeiten. Der letzte Schritt dauert auch O (n) Zeit, da Sie insgesamt 3n Eimer besuchen.

Hoffe, das hilft!

    
templatetypedef 04.07.2013, 19:05
quelle