Finden running median aus einem stream von ganzen zahlen

Mögliche Duplikate:

Rolling-median-Algorithmus in C

Gegeben, dass ganze zahlen sind, Lesen aus einem Datenstrom. Finden median der Elemente Lesen so weit in effizienter Weise.

Lösung, die ich gelesen habe: Wir können ein max-heap auf der linken Seite zu repräsentieren Elemente, die kleiner sind als der effektive Mittelwert (median), und ein min-heap auf der rechten Seite zur Darstellung von Elementen, die größer sind als der effektive Mittelwert.

Nach der Verarbeitung einer eingehenden element, die Anzahl der Elemente in den heaps unterscheiden sich höchstens um 1 element. Wenn beide Haufen enthalten die gleiche Anzahl von Elementen, finden wir den Durchschnitt heap Stamm-Daten als effektive median. Wenn der Haufen nicht ausgeglichen sind, wählen wir die effektive median von der Wurzel des heap-enthält mehr Elemente.

Aber wie würden wir konstruieren ein max-heap und min-heap, d.h. wie würden wir wissen, die effektive median hier? Ich glaube, wir würden Sie 1 ein element in max-heap und dann die nächsten 1-element in min-heap, und so weiter für alle Elemente. Korrigieren Sie mich, Wenn ich falsch bin hier.

  • Clevere Algorithmus, mit Haufen. Aus dem Titel konnte ich nicht sofort denken Sie an eine Lösung.
  • Wesir Lösung, sieht gut aus für mich, außer, dass ich war der Annahme (wenn Sie nicht zum Staat), dass dieser Strom kann beliebig lang sein, so dass Sie konnte nicht alles behalten im Gedächtnis. Ist das der Fall?
  • Für beliebig lange streams, kann man den Mittelwert der letzten N Elemente durch die Verwendung von Fibonacci-heaps (Sie erhalten also log(N) löscht) und die Speicherung von Zeigern auf Elemente eingefügt, um (in z.B. ein deque), dann entfernen Sie die älteste element bei jedem Schritt, wenn der Haufen voll sind (vielleicht auch an beweglichen Sachen von einem Haufen auf den anderen). Sie könnten etwas besser als N durch das speichern der Anzahl von wiederholten Elementen (bei vielen Wiederholungen), aber im Allgemeinen, ich denke, Sie haben eine Art von Verteilungsgerechtigkeit Annahmen, wenn Sie möchten, dass der median für den gesamten Strom.
  • Sie können beginnen, mit beiden heaps leer. Erste int geht auf einen Haufen; das zweite geht entweder in die andere, oder bewegen Sie den ersten Artikel in den anderen Haufen und dann einfügen. Dieser Satz verallgemeinert auf "nicht erlauben einen heap zu gehen größer ist als der andere +1" und keine speziellen Gehäuse erforderlich ist (die "root-Wert" eines leeren heap kann definiert werden als 0)
  • NUR ich habe diese Frage auf einem MSFT-interview. Vielen Dank für die Buchung
  • Wieder geöffnet, da die vorgeschlagene doppelte ist zu Fragen, die speziell für eine effiziente Umsetzung, und es geht mehr um die Allgemeine Vorgehensweise. Auch top-stimmten Antwort hier hat weit über zehn mal die Punktzahl des top-stimmten Antwort auf die doppelte, was bedeutet, dass, wenn überhaupt, die anderen posten sollten die sein, die geschlossen werden sollte, oder die Beiträge, die zusammengeführt werden sollen.

InformationsquelleAutor Luv | 2012-05-18
Schreibe einen Kommentar