Effizientes Auswählen des Medians und der Elemente links und rechts davon

14

Angenommen, wir haben eine Menge von N Codierern.S={a1,a2,a3,,aN}N

Jeder Codierer hat die Bewertung und die Anzahl der Goldmedaillen E i , die er bisher gewonnen hat.RiEi

Ein Softwareunternehmen möchte genau drei Programmierer einstellen, um eine Anwendung zu entwickeln.

Für die Einstellung von drei Programmierern entwickelten sie die folgende Strategie:

  1. Sie ordnen die Codierer zunächst in aufsteigender Reihenfolge der Bewertungen und absteigender Reihenfolge der Goldmedaillen an.
  2. Aus dieser geordneten Liste wählen sie die drei mittleren Codierer aus. Wenn die geordnete Liste beispielsweise , wählen sie ( a 2 , a 3 , a 1 ) Codierer aus.(a5,a2,a3,a1,a4)(a2,a3,a1)

Jetzt müssen wir der Firma helfen, indem wir ein Programm für diese Aufgabe schreiben.

Eingang:

Die erste Zeile enthält , dh die Anzahl der Codierer.N

Dann wird die zweite Zeile enthält die Ratings des i - ten Codierer.Rii

Die dritte Zeile enthält die Anzahl der Goldmedaillen, die vom ten Kodierer eingesackt wurden.i

Ausgabe:

Zeigen Sie nur eine Zeile an, die die Summe der Goldmedaillen der drei vom Unternehmen ausgewählten Codierer enthält.

Jack
quelle
3
So höher bewertete Codierer gewinnen immer weniger Medaillen? Wenn nicht, in welcher Reihenfolge sortieren Sie tatsächlich?
JeffE

Antworten:

16

Dies ist ein Problem des Auswählens des ten kleinsten Elements aus der Liste, das durch eine Klasse von Algorithmen gelöst wird, die Auswahlalgorithmen genannt werden . Es gibt deterministische Auswahlalgorithmen für die lineare Zeit, sodass Ihr Problem in linearer Zeit gelöst werden kann, indem Sie die n / 2 , n / 2 - 1 , n / 2 + 1 kleinsten Elemente aus der ursprünglichen unsortierten Liste auswählen .kn/2,n/21,n/2+1

Opt
quelle
6
Wenn Sie möchten, können Sie den Auswahlalgorithmus einmal ausführen, um den Median zu ermitteln, und dann das Minimum und Maximum in der rechten und linken Partition auf einen Schlag ermitteln.
Zach Langley
@Sid @ Zach Langley Hallo, kannst du bitte den Pseudo-Code bereitstellen?
Jack,
@Jack kennst du dich mit quicksort aus? Der randomisierte Auswahlalgorithmus ist im Wesentlichen derselbe, außer dass er nur auf einer Seite jedes Pivots wiederholt wird.
Zach Langley
6
@Jack: Der Wikipedia-Artikel über Auswahlalgorithmen (in Sids Antwort verlinkt) enthält Pseudocode. Google funktioniert auch.
JeffE
@Sid :: Ich lese den Wiki-Algorithmus (Partitionsbasierter allgemeiner Auswahlalgorithmus). Müssen wir die Auswahlfunktion dreimal mit k = n / 2, k = n / 2-1, k / 2 aufrufen der Wert von left, right beim Aufruf der Funktion select.Auch in der Partitionsfunktion, welcher Wert der Partitionsindex sein wird.
Jack