2009-02-17 2 views
5

Ich wurde gerade mit einer Frage interviewt, und ich bin gespannt, was die Antwort sein sollte. Das Problem war im Wesentlichen:Optimale Suche nach k Minimalwerten in unsortierten Liste von ganzen Zahlen

Angenommen, Sie haben eine unsortierte Liste von n ganzen Zahlen. Wie finden Sie die k Mindestwerte in dieser Liste? Das heißt, wenn Sie eine Liste von [10, 11, 24, 12, 13] haben und nach den 2 Mindestwerten suchen, erhalten Sie [10, 11].

Ich habe eine O (n * log (k)) Lösung, und das ist mein Bestes, aber ich bin gespannt, was andere Leute kommen. Ich werde davon absehen, die Gehirne der Leute zu verschmutzen, indem ich meine Lösung poste und sie in kurzer Zeit bearbeiten werde.

EDIT # 1: Zum Beispiel eine Funktion wie: Liste getMinVals (Liste & l, int k)

EDIT # 2: Es sieht aus wie es ein Auswahlalgorithmus ist, also werde ich in meiner Lösung werfen auch; Iterieren über die Liste und Verwenden einer Prioritätswarteschlange zum Speichern der Mindestwerte. Die Spezifikation für die Prioritätswarteschlange bestand darin, dass die Maximalwerte an der Spitze der Prioritätswarteschlange landen würden. Beim Vergleich des Oberteils mit einem Element würde daher der Oberkopf aufgeklappt und das kleinere Element verschoben. Dies nahm an, dass die Prioritätswarteschlange einen O (log n) -Push und einen O (1) -Pop hatte.

+0

Ich erinnere mich daran, diese Fragen vor über einem Jahr zu tun und die Antwort, die ich bekam, war nicht besser als O (n * log (k)), also denke ich, dass du es vielleicht schon hast. – achinda99

+0

Zufälligerweise musste ich dies erst gestern auf dem Job implementieren. Es ist O (n * log (k)), obwohl es ein paar verschiedene Wege gibt, dorthin zu gelangen. – Crashworks

+0

Es ist immer schön zu hören, dass ich das Interview nicht gemacht habe. Das heißt, die 2-3 Lösungen, die ich vorher probiert habe, haben mir wahrscheinlich nicht viel geholfen. –

Antwort

6

Dies ist der quickSelect Algorithmus. Es ist im Grunde eine schnelle Art, bei der Sie nur für einen Teil des Arrays rekursiv sind. Hier ist eine einfache Implementierung in Python, die eher der Kürze und Lesbarkeit halber geschrieben wurde als der Effizienz.

def quickSelect(data, nLeast) : 
    pivot = data[-1] 
    less = [x for x in data if x <= pivot] 
    greater = [x for x in data if x > pivot] 
    less.append(pivot) 

    if len(less) < nLeast : 
     return less + quickSelect(greater, nLeast - len(less)) 
    elif len(less) == nLeast : 
     return less 
    else : 
     return quickSelect(less, nLeast) 

Dies wird in O (N) im Durchschnitt läuft, bei jeder Iteration, da Sie erwartet werden, um die Größe von data durch eine multiplikative Konstante zu reduzieren. Das Ergebnis wird nicht sortiert. Der schlechteste Fall ist O (N^2), aber dies wird im Wesentlichen genauso gehandhabt wie eine schnelle Sortierung, die Dinge wie Median-von-3 verwendet.

+0

Die Frage war wegen der Effizienz. – starblue

Verwandte Themen