昨天的topK的两种思路的伪代码实现

topK的伪代码如下(堆思想的实现)
print topK()
    int k //输入k个数
    int index = 0 用来计数输入了多少个元素
    int [] heap 数组大小
    
    k = scanner.nextInt()
    x = scanner.nextInt()
    while (x!=-1)
      deal(x)
      x = scanner.nextInt()  
    //当大小不足k的时候则添加元素,
     如果等于k则进行建堆,而后再与k+1
    个元素比较,如果小于不免,大于的话替换
    并进行向下调整成小顶堆
    private static void deal(int x)
        if (index<k)
            heap[index++] = x //当加满了立即堆化
            if (index ==k)
                //堆化
                makeMinHeap(heap)
        else {
            if (heap[0]<x)
                heap[0]=x;
                minHeapFixDown(heap,0,k);
                print heap
         }
            
堆化
makMinHeap(arr)
   n = (arr.length)/2-1
   for (int i=n;i<=0;i--) //从最后一个父亲节点处开始调整
      minHeapFixDown(arr,i,n)
minHeapFixDown(arr,i):
    left = 2*i+1
    right = 2*i+2
    
    min = 0
    //边界条件判断
    if(left>=n)
       return;
    min = left;
    if (right>=n)
       min = left
    else
       if (arr[right]<arr[left])
           min = right
    //如果arr[i]比两个孩子小,不用调整
      if(arr[i]<=arr[min])
         return;
    //否则,进行交换
    temp  = arr[i]
    arr[i] = arr[min]
    arr[min] = temp;
    minHeapFixDown(arr,min,n)                    

总结partition和堆都能解决顺序统计量问题,但是
堆更适用于海量数据流,parttition需要把所有数据
装入内存当中。


topK的另外实现构造数组大小k
void topK()
    k = scanner.nextInt()
    x = scanner.nextInt()
    index = 0
    int [] heap 
    while (x!=-1)
      dealHeap(x)
      x = scanner.nextInt()  
void dealArray(x)
    if (index<k)
      heap[index++]=x
      if (index==k)
          min = minArr(heap)
    else
       if x>A[min]
          A[min] =x
          min = minArr(heap)


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值