TopK

Posted wenbochang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TopK相关的知识,希望对你有一定的参考价值。

网易面试挂了,伤心。

一面面试官不是搞技术的,二面面试官搞ios,全程不问JVM,并发的知识,运气真差

而且手撸代码硬伤,没得编译

准备先在IDE敲一遍,在再纸上面写一遍。

 1 package com.qiuzhao.test;
 2 
 3 import java.util.PriorityQueue;
 4 import java.util.Queue;
 5 
 6 /**
 7  * @Auther: Chang
 8  * @Date: 2018/8/27
 9  */
10 public class topK {
11     public static void main(String[] args) {
12 
13         int[] a = {489, 500, 111, 100, 2, 7, 3, 8, 66, 888};
14         int k = 3;
15         // 第一种 推排序
16         prioritySort(a, k);
17         // 第二种 快速排序
18         quickSort(a, k);
19     }
20 
21     // 堆排序 int[] a = {489, -5, 111, 100, 2, 7, 3, 8, 66, 88};
22     private static void prioritySort(int[] a, int k) {
23         Queue<Integer> pq = new PriorityQueue<>(k);
24         for (int i = 0; i < a.length; i++) {
25             int n = pq.size();
26             if (n >= k && a[i] > pq.peek()) {
27                 pq.poll();
28             }
29             n = pq.size();
30             if (n < k) pq.add(a[i]);
31         }
32         pq.forEach(x -> System.out.print(x + "  "));
33         System.out.println();
34     }
35 
36     private static void quickSort(int[] a, int k) {
37 
38         int left = 0;
39         int right = a.length - 1;
40         int mid = partition(a, left, right);
41         while (mid != k) {
42             if (mid > k) {
43                 right = mid - 1;
44                 mid = partition(a, left, right);
45             } else {
46                 left = mid + 1;
47                 mid = partition(a, left, right);
48             }
49         }
50         for (int i = 0; i < mid; i++) {
51             System.out.print(a[i] + "  ");
52         }
53         System.out.println();
54     }
55 
56     private static int partition(int[] a, int left, int right) {
57 
58         int temp = a[left];
59         while (left < right) {
60             while (left < right && a[right] <= temp) right--;
61             a[left] = a[right];
62             while (left < right && a[left] >= temp) left++;
63             a[right] = a[left];
64         }
65         a[left] = temp;
66         return left;
67     }
68 }

 

以上是关于TopK的主要内容,如果未能解决你的问题,请参考以下文章

堆排序和TopK问题

从海量数据中寻找出topK的最优算法代码

解决TopK问题的方式

TopK

堆的运用——有序元素的多路归并topk问题

Top K Frequent Elements 之 topk问题