Daten, die Struktur zu finden, median

Dies ist eine interview-Frage. Entwerfen Sie eine Klasse, die speichert Ganzzahlen und bietet zwei Operationen:

void insert(int k) 
int getMedian() 

Ich denke, dass ich verwenden können, BST, so dass insert O(logN) und getMedian O(logN) (für getMedian sollte ich hinzufügen-die Anzahl der rechts - /Kinder für jeden Knoten).

Nun Frage ich mich, ob dies ist die die meisten effiziente Lösung und es gibt keine bessere.

  • Mit Ihrer Regelung, die Sie verbessern können getMedian zu O(1): schauen Sie mal nach, nach jedem einfügen (die nicht Schaden, um die Komplexität) und den Wert speichern.
  • Für eine alternative Struktur, denken, priority queueS.
  • Könnten Sie bitte näher erläutern, wie Sie zu verbessern getMedian O(1)?
  • Ich meine, dass Ihre Daten-Struktur haben würde, die Daten Mitglied int currentMedian;. Sofort nach dem einfügen eines Elements in Ihre BST, finden die neuen median, und speichern diesen Wert in currentMedian vor der Rückkehr von insert. Dann können Sie implementieren int getMedian() { return currentMedian; }, die O(1).
  • Weiter nachdenken, können Sie wahrscheinlich etwas zu tun mit einer skip-Liste zu. Einfügungen, die in rechnen/amortisieren O(log(n)), und Sie können verfolgen, die median Knoten (und ob die Anzahl der Elemente gerade oder ungerade ist). Dann jedes mal, wenn Sie einfügen, brauchen Sie nur, um zu überprüfen, ob Sie den median einen Schritt nach Links oder rechts, abhängig davon, ob Sie Bild auf das Links oder rechts von der alten median und ob die neue Größe gerade oder ungerade ist.
InformationsquelleAutor Michael | 2012-07-06
Schreibe einen Kommentar