找第K大数的一些小算法技巧;

来源:互联网 发布:理智与情感 知乎 编辑:程序博客网 时间:2024/04/20 07:26

 

上述算法功能:

 

输入一系列可重复的数, 找出第K大的数, 重复数字也算作1个.

 

例如: 2 2 1 4, 第3大的数字是2, 而不是1.

 

思想:需要找第K大数,只需要建立一个容量为K的最小堆,初始化所有元素都无穷小.

每次读取一个数据,

如果这个数据比堆顶元素大,那么它可以替代堆顶,并用updateHeap维持最小堆的性质.

如果这个数据比堆顶元素小,那么它一定小于所有堆内的元素,所以不必操作.

如果这个数据和堆顶元素一样大, 由于堆顶元素是堆内最小的元素, 所以不必操作,因为如果插入一个与堆顶一样大的元素去替换某一个结点,被替换的结点不会比插入的元素小,所以不能替换.

 

所以算法主要就是围绕一个最小堆来做的,思想很简单.

 

稍后补充另一个算法,在此基础上不计算重复的第K大元素.

 

 

这个算法的思想是利用空间换时间,当然空间也是相当的小....只要101个位就可以了.

 

逐次输入成绩,给成绩对应的位做标记.  最后从100分开始计数,一旦计数到达3次,就打印出那个成绩就是第3(不重复)大成绩.

 

 

原创粉丝点击