| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 堆排序和Top-K问题 -> 正文阅读 |
|
[数据结构与算法]堆排序和Top-K问题 |
目录 堆排序:?步骤总结:?堆排序即利用堆的思想来进行排序,总共分为两个步骤 1、建堆(如果升序就建大根堆,降序就建小根堆) 2、利用堆删除的思想来进行排序 前面我们说到了建堆和堆删除的操作都是需要用到向下调整的思想的,所以当我们掌握了向下调整的思想就可以完成堆排序。 ps:不了解这部分知识的可以看一下博主的这篇博客内容: 建立思想:(以升序为例)首先我们以大根堆的形式建堆,建堆完毕后堆顶元素为当前数组中的最大值,(注意说的是当前数组,因为我们的size一直在减小,这也是为了把最大的值放到原始数组的后面服务)将堆顶元素与堆尾元素进行互换,并向下调整,使其依然为大根堆,这样最大的值就放到了末尾,调整后的堆顶为原数组中的第二大的元素,经过上述过程,放到原数组的倒数第二个位置,依次类推,直至堆中只留一个元素,即可得到数组的升序排列。 特别注意:在进行这些操作的时候,我们只是定义了临时的变量来保存数组的长度,切不可改变原数组的长度!
我们在使用堆排序的时候,其默认排序方式就是升序排序。?? Top-K问题Top-K问题是堆应用的一个非常经典的问题? 问题描述:?TOP-K问题:即求数据集合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大(注意:切不可用简单的排序后取前k个值这种做法,这种方式在数据量不大的时候简单可行,但固然不是最优的方法。) 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 基本思路:?利用分布式思想处理海量数据1. 用数据集合中前K个元素来建堆
?Top-K问题与堆排序有类似之处,我们需要注意的是: 1、当k为0或者数组为空时什么都不返回,即返回[],就是return int[0];这个操作!? 2、由于我们在建大根堆时用到的优先级队列其底层是一个小根堆(默认),所以我们要重写comparator(比较器)接口中的compar方法,使之变成大根堆。这里我们可以用到几种方法: (1)匿名内部类(我就是采用的这种方法) (2)直接自己实现一个比较器重写comparator(比较器)接口中的compar方法 这两种都是可以的。 拓展:那如果是要获取第k小的或者第k大的数(这里以第k小的数为例),我们已经求得了最小的k个数,那么我们只需要在这里面找到最大的那个数(也就是第k小的数即可)。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:50:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |