zoukankan      html  css  js  c++  java
  • TOP K问题的若干实现

    问题描述:在长度为n的序列中,找出其最大的K个数

    1.冒泡排序

    每冒泡一次,可将最大的数放到序列尾部,冒泡K次即可。

    时间复杂度:O(K*n)

    空间复杂度:O(1)

    2.扫描数组,将最大的N个数存在缓存中,当有更大的数到来时替换缓存中的数

    TOP_K(A,K)
        n = length of A
        create array T[K] = {-∞}
        t = 0
    
        for i = 0, n-1
        do
            if T[K-1] < A[i] then
                INSERT A[i] TO  SORTED ARRAY T[]

    时间复杂度:O(n*K)

    空间复杂度:O(K)

    可以考虑用最小堆代替缓存数组存储最大的K个数,这样当A[i] 大于堆顶元素时,使用A[i]代替堆顶元素,然后调整堆,复杂度为 O(n*lgK)

    3.堆排序,优先级队列

    构造一个堆,从堆顶取出N个元素

    时间复杂度: O(n+K*lgn)

    空间复杂度: O(1)

     4.用选择法找出第K个元素,然后对前K个元素进行排序

     1 FIND_K( A ,K)
     2     n = length of A
     3     i = random index of n
     4     swap A[i] A[n-1]
     5     
     6     a = 0
     7     b = n-2
     8     while true
     9         while A[a] <= A[n-1]
    10             a++
    11         while A[b] >= A[n-1]
    12             b++
    13         if a>= b then break
    14         swap A[a] A[b]
    15     swap A[b] A[n-1]
    16     
    17     if b == K then return b
    18     else if b > K then return FIND_K(A[0:b],K)
    19     else return FIND_K(A[b:n],K-b)
    20 
    21 TOP_K(A,K)
    22     p = FIND_K(A,K)
    23     sort(A,0,p)

    FIND_K的时间复杂度为O(n),则TOP_K的时间复杂度为 O(n + K*lgK)

  • 相关阅读:
    初学者常用的LINUX命令
    logging模块全总结
    logging模块初识
    xpath知多少
    selenium常用的API
    系统测试基础(适合入门)
    JavaScript正则表达式(一)
    webpack2学习(二)
    webpack2学习(一)
    SQL语句学习
  • 原文地址:https://www.cnblogs.com/stormli/p/topn.html
Copyright © 2011-2022 走看看