Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Lösung für das Problem der maximalen K-Zahl

Python-Lösung für das Problem der maximalen K-Zahl

高洛峰
高洛峰Original
2017-03-02 11:16:161132Durchsuche

TopK-Problem, d. h. das Finden der größten K-Zahl. Dieses Problem kommt sehr häufig vor, z. B. das Finden der 10 beliebtesten Schlüsselwörter aus 10 Millionen Suchdatensätzen.

Methode 1:
Zuerst sortieren und dann die ersten k Zahlen abfangen.
Zeitkomplexität: O(n*logn)+O(k)=O(n*logn).
Diese Methode ist relativ einfach und grob, erwähnen Sie sie einfach.

Methode 2: Max Heap

Wir können einen Datencontainer der Größe K erstellen, um die kleinsten K-Zahlen zu speichern, und dann das gesamte Array durchlaufen und jede Zahl hinzufügen Vergleichen Sie es mit der maximalen Zahl im Container. Wenn diese Zahl größer als der maximale Wert im Container ist, fahren Sie mit dem Durchlaufen fort. Andernfalls ersetzen Sie den maximalen Wert im Container durch diese Zahl. Das Verständnis dieser Methode ist ebenfalls sehr einfach. Was die Wahl des Containers betrifft, ist die erste Reaktion vieler Menschen der maximale Heap. Aber wie implementiert man den maximalen Heap? Wir können die Heapq-Bibliothek verwenden, die den minimalen Heap implementiert, denn wenn in einem Array jede Zahl invertiert wird, wird die maximale Zahl zur minimalen Zahl und die Reihenfolge der gesamten Zahl ändert sich, sodass jede Zahl im Array invertiert werden kann. , und verwenden Sie dann den minimalen Heap, um das Ergebnis zu negieren, wenn Sie es schließlich zurückgeben. Der Code lautet wie folgt:

import heapq
def get_least_numbers_big_data(self, alist, k):
  max_heap = []
  length = len(alist)
  if not alist or k <= 0 or k > length:
    return
  k = k - 1
  for ele in alist:
    ele = -ele
    if len(max_heap) <= k:
      heapq.heappush(max_heap, ele)
    else:
      heapq.heappushpop(max_heap, ele)

  return map(lambda x:-x, max_heap)


if __name__ == "__main__":
  l = [1, 9, 2, 4, 7, 6, 3]
  min_k = get_least_numbers_big_data(l, 3)

Methode 3:Schnellauswahl

Schnellauswahlalgorithmus In der Tat ähnelt es der Schnellauswahl. Der Unterschied besteht darin, dass die Schnellauswahl für jede Fahrt nur in eine Richtung gehen muss.
Zeitkomplexität: O(n).

def qselect(A,k): 
  if len(A)<k:return A 
  pivot = A[-1] 
  right = [pivot] + [x for x in A[:-1] if x>=pivot] 
  rlen = len(right) 
  if rlen==k: 
    return right 
  if rlen>k: 
    return qselect(right, k) 
  else: 
    left = [x for x in A[:-1] if x<pivot] 
    return qselect(left, k-rlen) + right 
 
for i in range(1, 10): 
  print qselect([11,8,4,1,5,2,7,9], i)


Weitere Artikel zur Python-Version des Problems mit der maximalen K-Zahl finden Sie hier zur chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn