ホームページ  >  記事  >  バックエンド開発  >  最大 K 数問題に対する Python の解決策

最大 K 数問題に対する Python の解決策

高洛峰
高洛峰オリジナル
2017-03-02 11:16:161132ブラウズ

TopK 問題、つまり最大の K 数を見つけるこの問題は、1,000 万件の検索レコードから最も人気のある 10 個のキーワードを見つけるなど、非常に一般的です。 k 個の数値。
時間計算量: O(n*logn)+O(k)=O(n*logn)。

この方法は比較的単純で大雑把ですが、言及してください。


方法 2: 最大ヒープ


最小の K 数値を格納するためにサイズ K のデータ コンテナーを作成し、配列全体を走査し、各数値をコンテナー内の最大の数値と比較します (この数値がコンテナ内の最大値より大きい場合は、トラバースを続行します。それ以外の場合は、コンテナ内の最大値をこの数値に置き換えます。この方法を理解するのは非常に簡単です。コンテナの選択に関して、多くの人は最大ヒープを思い浮かべますが、Python で最大ヒープを実装するにはどうすればよいでしょうか。最小ヒープを実装する heapq ライブラリを使用できます。これは、配列内で各数値を反転すると、最大数値が最小数値になり、数値全体の順序が変わるため、配列内の各数値を反転できるためです。を使用し、最終的に結果を返すときに最小ヒープを使用して結果を否定します。 コードは次のとおりです。

メソッド 3: クイック選択


クイック選択アルゴリズムと似ています。重要なのは、クイック選択は各トリップで一方向にのみ実行する必要があるということです。

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)

最大の Python バージョンに関するその他の関連記事については、 K 数の問題は、PHP の中国語 Web サイトに注意してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。