机器学习|快速排序思想求topk
Posted Python与算法社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习|快速排序思想求topk相关的知识,希望对你有一定的参考价值。
交流群:QQ 646901659
01
—
Topk by quicksort
问题是求出数据集中,按照某个规则定义的元素大小,取前k个元素。
为了简化起见,直接求数值型数组的前k个最大元素。
'''
topk by quick sort
assert: k <= len(arr)
'''
def topkByQuickSort(k,arr=None):
topk=[]
return quickSort(0,len(arr)-1,k,topk,arr)
'''
quick sort to find top k for an unsorted array
'''
def quickSort(lo,hi,k,topk,arr):
# this is worst condition for topk
if lo>=hi:
index = len(arr) - k
while index < len(arr):
topk.append(arr[index])
index+=1
return topk
#following basic quick sort idea
i = lo
j = hi
pivot = arr[lo]
while i < j:
while j > i and pivot <= arr[j]:
j-=1
arr[i] = arr[j]
while i < j and arr[i] < pivot:
i+=1
arr[j] = arr[i]
#put pivot to i index
arr[i] = pivot
# following is important, if i less than length of array minus k, then iterator to high part;
# elif bigger, then iterator to low part
# else equal, get it!
if i < len(arr) - k :
quickSort(i+1,hi,k,topk,arr)
elif i > len(arr) - k:
quickSort(lo,i-1,k,topk,arr)
else:
index = i
while index < len(arr):
topk.append(arr[index])
index+=1
return topk
02
—
Test
topk = topkByQuickSort(1,arr=[3,5,1,6,9,8,5,12])
[print(item) for item in topk]
12
topk = topkByQuickSort(2,arr=[3,5,1,6,9,8,5,12])
[print(item) for item in topk]
9
12
topk = topkByQuickSort(8,arr=[32,5,7,6,13,9,8,4,12])
[print(item) for item in topk]
5
7
6
8
9
12
13
32
03
—
总结
快速排序思想求topk,优点是时间复杂度小,缺点是大数据时,全部一次加入内存放不下时,不太适合用这种方法,可以基于堆排序思想求topk,详细请参考:
算法channel会有系统地,认真地推送:机器学习(包含深度学习,强化学习等)的理论,算法,实践,源码实现。期待您的参与!
以上是关于机器学习|快速排序思想求topk的主要内容,如果未能解决你的问题,请参考以下文章