欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求Top K问题

程序员文章站 2024-03-15 21:38:30
...

1、问题描述

从数组 arr[1,n] n个数中,找出最大的K个数,这个是经典的求Top K的问题 。


例如从数组 int [] arr = {3,4,5,67,34,56,3,2,4,66,546} 中找到top5的数

解法一: 排序求最大的五个数

思路:将数组进行排序,最大个5个数即为所求的数。
代码

import java.util.Arrays;

public class TopK1 {
	public static void main(String[] args) {
		int[] arr = {3,4,5,67,34,56,3,2,4,66,546};
		// 数组排序
		Arrays.sort(arr);
		int len = arr.length;
		int[] topk = new int[5];
		// 数组后5个数为topk的数
		System.arraycopy(arr, len-5, topk, 0, 5);
		System.out.println(Arrays.toString(topk));
	}
}

分析:时间复杂度为O(n*logn),时间复杂度非常高,因为要对整个数组进行排序。


解法二:K次冒泡排序

思路:冒泡排序每冒泡一次就会找到一个最大的数,既最大的数在数组最大索引处,因此冒泡排序K次,既找到了Top k,而且不需要进行整个数组的排序。
代码

import java.util.Arrays;

public class TopK2{
	public static void main(String[] args) {
		int[] arr = {3,4,5,67,34,56,3,2,4,66,546};
		int len = arr.length;
		// 5次冒泡求top 5 
		for (int i=0; i<5; i++) {
			for (int j=0; j<len-1-i; j++) {
				if(arr[j] > arr[j+1]){
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
					System.out.println(Arrays.toString(arr));
				}
			}
		}
		// top 5
		int[] topk = new int[5];
		System.arraycopy(arr, len-5, topk, 0, 5);
		System.out.println(Arrays.toString(topk));

	}
}

分析:时间复杂度O(n*k),将全局排序优化为局部排序。


后续算法理解再写
相关标签: top k