>  기사  >  백엔드 개발  >  최대 K 수 문제에 대한 Python 솔루션

최대 K 수 문제에 대한 Python 솔루션

高洛峰
高洛峰원래의
2017-03-02 11:16:161132검색

TopK 문제, 즉 가장 큰 K 숫자를 찾는 문제입니다. 천만 검색 기록에서 가장 인기 있는 키워드 10개를 찾는 등 매우 흔한 문제입니다.

방법 1:
먼저 정렬한 다음 처음 k개 숫자를 가로챕니다.
시간 복잡도: O(n*logn)+O(k)=O(n*logn).
이 방법은 비교적 간단하고 투박하니 언급만 해주세요.

방법 2: 최대 힙

K 크기의 데이터 컨테이너를 만들어 가장 작은 K 숫자를 저장한 다음 전체 배열을 반복하고 각 숫자를 추가할 수 있습니다. 이를 컨테이너의 최대값과 비교합니다. 이 숫자가 컨테이너의 최대값보다 크면 계속 이동하고, 그렇지 않으면 컨테이너의 최대값을 이 숫자로 바꿉니다. 이 방법에 대한 이해도 매우 간단합니다. 컨테이너를 선택할 때 많은 사람들의 첫 번째 반응은 최대 힙입니다. 그런데 Python에서 최대 힙을 구현하는 방법은 무엇입니까? 최소 힙을 구현한 heapq 라이브러리를 사용할 수 있는 이유는 배열에서 각 숫자를 반전시키면 최대 숫자가 최소 숫자가 되고 전체 숫자의 순서가 바뀌므로 배열의 각 숫자가 반전될 수 있기 때문입니다. , 그리고 최종적으로 결과를 반환할 때 최소 힙을 사용하여 결과를 무효화합니다.

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)

방법 3: 빠른 선택

빠른 선택 알고리즘은 실제로 빠른 선택과 유사하지만 각 이동마다 한 방향으로만 이동하면 된다는 점이 다릅니다.
시간 복잡도: 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)


최대 K 문제의 Python 버전과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 참고하세요. !

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.