Heaps scheinen sehr geeignet, und es scheint, als ob Sie falsch verfahren.
Sagen Sie bitte die oben x Elemente wollte (wie funktioniert x dies n zu vergleichen, btw?)
Was Sie tun, ist alles in einem max-Heap setzen und die Top-x zu bekommen.
Ich schlage stattdessen vor, Sie verwenden einen Min-Heap von genau x Elementen.
Erste x Elemente, die Sie in Heap einfügen.
Als nächstes einkommendes Element vergleichen Sie mit dem min, das sehr schnell (O (1) mal) im Heap erledigt werden kann. Wenn Sie kleiner sind, ignorieren Sie einfach das eingehende Element.
Wenn das eingehende Element größer als min ist, erhöhen Sie die min auf das eingehende Element und sieben es im Heap auf. Dies sollte schlimmstenfalls die logarithmische Zeit sein.
Sobald Sie fertig sind (in nlogx Zeit), können Sie die Elemente aus dem Heap in sortierter Reihenfolge in O (xlogx) Zeit abrufen.
Je nachdem, wie Ihre Daten sind (und wie klein x ist), kann die Verwendung dieser Min-Heap-Lösung sehr schnell sein.
Wenn Sie wirklich wollen wirklich die Einsätze super-schnell zu sein und kümmern sich nicht viel über das Retrieval, dann können Sie auch Folgendes tun.
Fügen Sie die Elemente in der angegebenen Reihenfolge in einen Vektor (Array mit amortisierter O (1) Einfügezeit) ein.
Verwenden Sie den Auswahlalgorithmus, um das x-te größte Element zu finden (in O (n) -Zeit, aber die Konstanten könnten groß sein). Sagen Sie, dass Zahl S.
nun das Array gehen jedes Element mit S zu vergleichen und wählen Sie die, die so groß ist wie S.
Wenn x eine vernünftige Größe und vergleichbar mit n (wie n/2 oder etwas) diese mag gut funktionieren, aber wenn x im Vergleich zu n klein ist, würde ich vorschlagen, mit dem Min-Heap zu gehen.
Wie viele Artikel? Werden sie irgendwo festgehalten, wenn ja wie? – Lazarus
Sagen Sie mehr darüber, wie effizient * Einfügung *, * Abruf * (von Prioritätspunkten) und * Entfernung * relativ zueinander sein sollen. – Artelius
Ich möchte die Artikel zuerst bewerten und dann die ersten x Top-Scoring-Artikel in der richtigen Reihenfolge abrufen. Da es viele Einfügungen gibt, sollte die Einfügung ziemlich effizient sein. Die Rückverfolgung könnte weniger effizient sein. – ladi