python TopKアルゴリズム
TopKアルゴリズム
配列の中の最小のk個数を探して、topk問題とも言います.
このアルゴリズムが解決すべき問題は,線形時間内に無秩序シーケンスのkk番目に大きい数を見つけることである.
例えば、n個の整数を入力し、その中で最小のK個の数を探し出す.例えば4,5,1,6,2,7,3,8の8つの数字を入力すると、最小の4つの数字は1,2,3,4である.
考え方:
高速ソートのpartition()メソッドは、a[l...j-1]がa[j]以下であり、a[j+1...h]がa[j]以上である整数jを返し、このときa[j]は配列のj番目の大きな要素である.この特性を用いて配列のK番目の要素を見つけることができ,このK番目の要素を探すアルゴリズムを高速選択アルゴリズムと呼ぶ.
配列の中の最小のk個数を探して、topk問題とも言います.
このアルゴリズムが解決すべき問題は,線形時間内に無秩序シーケンスのkk番目に大きい数を見つけることである.
例えば、n個の整数を入力し、その中で最小のK個の数を探し出す.例えば4,5,1,6,2,7,3,8の8つの数字を入力すると、最小の4つの数字は1,2,3,4である.
考え方:
高速ソートのpartition()メソッドは、a[l...j-1]がa[j]以下であり、a[j+1...h]がa[j]以上である整数jを返し、このときa[j]は配列のj番目の大きな要素である.この特性を用いて配列のK番目の要素を見つけることができ,このK番目の要素を探すアルゴリズムを高速選択アルゴリズムと呼ぶ.
# -*- coding: gbk -*-
def partition(seq):
pi, seq = seq[0], seq[1:] #
lo = [x for x in seq if x <= pi]#
hi = [x for x in seq if x > pi]##
return lo, pi, hi
def select(seq, k):
lo, pi, hi = partition(seq)
m = len(lo)#
if m == k: return pi
if m < k: return select(hi, k-m-1)
return select(lo, k)
if __name__ == '__main__':
seq=(1,2,3,4,5)
print(partition(seq))
print(select(seq,3))