求Top K问题

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),将全局排序优化为局部排序。


后续算法理解再写

你可能感兴趣的:(算法,Java)