机器学习|快速排序思想求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的主要内容,如果未能解决你的问题,请参考以下文章

线性时间求取第 K 大数

字节大佬问我TopK,我反手来一句我这有几种解法,您想要哪种?

topK问题

topK问题

深夜来到校花学姐家,帮她解决了TopK,她竟然......

排序算法——快速排序