当前位置: 首页 > news >正文

南阳网站建设百度推广助手电脑版

南阳网站建设,百度推广助手电脑版,豌豆荚app下载 官网,微信公众号怎样发布wordpress优先级队列----堆优先级队列堆堆的创建堆的插入:堆的删除:PriorityQueue的特性PriorityQueue的构造与方法优先级队列 优先级队列: 不同于先进先出的普通队列,在一些情况下,优先级高的元素要先出队列。而这种队列需要提…

优先级队列----堆

  • 优先级队列
  • 堆的创建
    • 堆的插入:
    • 堆的删除:
  • PriorityQueue的特性
  • PriorityQueue的构造与方法

优先级队列

优先级队列: 不同于先进先出的普通队列,在一些情况下,优先级高的元素要先出队列。而这种队列需要提供两个基本的操作:返回最高优先级对象添加新的对象。
(JDK1.8中,优先级队列底层使用的是 堆 数据结构,而堆则是在完全二叉树的基础上进行了调整)

堆: 将一组集合的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 为 小堆,Ki >= K2i+1 且 Ki >= K2i+2 为 大堆。i = 0,1,2…,将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。例如:

大小根堆示例
堆的两个性质:
堆中某个结点的值总是不大于或不小于其父节点的值。
堆总是一棵完全二叉树。


堆的存储方式:
堆是一棵完全二叉树,因此可以用层序的规则采用顺序的方式来高效存储,但对于非完全二叉树,就不适合使用顺序方式进行存储,因为为了能够还原二叉树,空间中必须要存储空节
点,就会导致空间利用率比较低。

如果 i 表示孩子结点,则父节点为 (i - 1)/2。
如果 i 表示根结点,左孩子则为 2i + 1,右孩子为 2i + 2。

堆的创建

堆的调整
向下调整过程(以小根堆为例):

  1. 让 parent 标记需要调整的节点,child 标记 parent 的左孩子(完全二叉树中,一定先有左孩子)
  2. 如果 parent 的左孩子存在(child < size),进行以下操作,直到 parent 的左孩子不存在:
    找到左右孩子中较小的结点,和 parent 进行比较,若 parent 小,则调整结束。若 parent 大,则进行交换。交换后,可能会使原来满足堆的子树发生改变,所以需要继续向下调整。

例如:
向下调整过程
代码:

public class TestHeap {public int[] elem;public int usedSize;public TestHeap() {this.elem = new int[10];}//初始化public void initElem(int[] array) {for (int i = 0; i < array.length; i++) {elem[i] = array[i];usedSize++;}}public void createHeap() {//循环调用for (int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--) {shiftDown(parent, usedSize);}}//向下调整 len为当前有效数据个数private void shiftDown(int parent, int len) {int child = 2 * parent + 1;//最起码 要有左孩子while (child < len) {//一定是有右孩子的情况下if (child + 1 < len && elem[child] > elem[child + 1]) {//保证 child指向较小值child++;}if (elem[child] < elem[parent]) {//孩子结点小于父节点 交换int tmp = elem[child];elem[child] = elem[parent];elem[parent] = tmp;//继续调整下面子树parent = child;child = 2 * parent + 1;} else {break;}}}
}

建堆的时间复杂度:
建堆的时间复杂度

堆的插入:

堆的插入

代码:

public void offer(int val) {if (isFull()) {//满了扩容elem = Arrays.copyOf(elem, 2 * elem.length);}//放到最后一个位置,长度加一elem[usedSize++] = val;//向上调整shiftUp(usedSize-1);}public boolean isFull() {return usedSize == elem.length;}private void shiftUp(int child) {int parent = (child - 1) / 2;while (child > 0) {if (elem[child] < elem[parent]) {int tmp = elem[child];elem[child] = elem[parent];elem[parent] = tmp;//继续往上走child = parent;parent = (child - 1) / 2;}else {break;}}}

堆的删除:

堆的删除
代码:

    public void pop() {if (isEmpty()) {return;}//交换int tmp = elem[0];elem[0] = elem[usedSize - 1];elem[usedSize - 1] = tmp;//有效数据个数减一usedSize--;//向下调整shiftDown(0, usedSize);}public boolean isEmpty() {return usedSize == 0;}

PriorityQueue的特性

Java 集合框架中提供了 PriorityQueue 和 PriorityBlockingQueue 两种类型的优先级队列,PriorityQueue 是线程不安全的,PriorityBlockingQueue 是线程安全的,这里主要介绍PriorityQueue。

使用 PriorityQueue 需要注意:

  1. 使用时必须导入 PriorityQueue 所在的包(import java.util.PriorityQueue;)。

  2. PriorityQueue 中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出 ClassCastException 异常。
    只插入一个元素时,并不会报错:
    添加一个元素
    插入多个元素就会报错:
    多个元素就会报错

  3. 不能插入 null 对象,否则会抛出 NullPointerException。
    不能插入null

  4. 内部可以自动扩容。
    自动扩容

  5. 插入和删除元素的时间复杂度为 O(log₂N)。

  6. PriorityQueue 底层使用的是堆数据结构。

  7. PriorityQueue 默认情况下是小堆。
    小堆

PriorityQueue的构造与方法

PriorityQueue 的几种构造方法:
构造方法

PriorityQueue 的方法:
PriorityQueue 的方法和其它数据结构类似:

PriorityQueue的方法

Top-k 问题: 最大或者最小的前k个数据。例如求一组数据中前 k 个最小的数据。

题目链接:leetcode----面试题 17.14. 最小K个数
题目描述:题目描述

思路一:我们可以初始化一个数组大小的堆,然后遍历数组的同时将元素放进堆中,默认是小根堆,所以取 k 次堆顶元素即可(删除堆顶元素后,会调整堆中的数据)。
代码:

public int[] smallestK(int[] arr, int k) {//存储最小K个数的数组int[] ret = new int[k];if (arr == null || k == 0) {return ret;}// 以数组长度初始化一个小根堆Queue<Integer> minHeap = new PriorityQueue<>(arr.length);//遍历数组  放进小根堆for (int value : arr) {minHeap.offer(value);}//取 k个堆顶元素for (int i = 0; i < k; i++) {ret[i] = minHeap.poll();}return ret;
}

上面这段代码会使时间复杂度升高,每添加或删除一个元素,就会调整一个接近数组长度的堆。

思路二:要求最小 k 个数,我们将数组里的前 k 个元素添加到一个大小为 k 的大根堆,因为是大根堆,所以堆顶元素是堆中最大的元素,然后遍历数组剩下的元素,如果数组剩下的元素比堆顶元素小,我们就删除堆顶元素,并添加数组的元素,如果数组剩下的元素比堆顶元素大,它就不会是前 k 个最小数。

代码:

public int[] smallestK(int[] arr, int k) {int[] ret = new int[k];if (arr == null || k == 0) {return ret;}//提供比较器,重写compare方法,此时建立的就是大根堆Queue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});//将数组前k个元素添加到大根堆中for (int i = 0; i < k; i++) {maxHeap.offer(arr[i]);}//遍历数组未添加到堆中的元素for (int i = k; i < arr.length; i++) {//因为是求最小值,所以如果比大根堆的堆顶元素小,就删除堆顶元素,并添加这个元素到堆中if (arr[i] < maxHeap.peek()) {maxHeap.poll();maxHeap.offer(arr[i]);}}//将堆中的k个元素添加中数组中for (int i = 0; i < k; i++) {ret[i] = maxHeap.poll();}return ret;
}

这段代码中,只建立了 k 个容量大小的堆,调整的个数就比第一段代码少。

对于求一组数据中前 k 个最大或最小的元素时,数据少时我们可以排序,但对于数据特别多时,还是采用堆的方式比较合适。步骤如下:

  1. 用数据集合中前K个元素来建堆。
    求前 k 个最大的元素,则建小堆
    求前 k 个最小的元素,则建大堆
  2. 用剩余的 N-K 个元素依次与堆顶元素来比较,不满足则替换堆顶元素,堆中剩余的 K 个元素就是所求的前 K 个最小或者最大的元素。

文章转载自:
http://bergall.qkxt.cn
http://aloft.qkxt.cn
http://intimately.qkxt.cn
http://incomprehensive.qkxt.cn
http://lo.qkxt.cn
http://netscape.qkxt.cn
http://wapiti.qkxt.cn
http://sacrosciatic.qkxt.cn
http://amalgam.qkxt.cn
http://beanshooter.qkxt.cn
http://mikvah.qkxt.cn
http://finochio.qkxt.cn
http://strook.qkxt.cn
http://emblem.qkxt.cn
http://diphenyl.qkxt.cn
http://monthlong.qkxt.cn
http://averse.qkxt.cn
http://lactonic.qkxt.cn
http://polycletus.qkxt.cn
http://noegenesis.qkxt.cn
http://eleatic.qkxt.cn
http://superbike.qkxt.cn
http://inquisitive.qkxt.cn
http://servile.qkxt.cn
http://hypogamy.qkxt.cn
http://null.qkxt.cn
http://comitragedy.qkxt.cn
http://clogger.qkxt.cn
http://detoxicate.qkxt.cn
http://macle.qkxt.cn
http://pedigreed.qkxt.cn
http://cavil.qkxt.cn
http://rapturous.qkxt.cn
http://rhoda.qkxt.cn
http://confession.qkxt.cn
http://cytotechnologist.qkxt.cn
http://militancy.qkxt.cn
http://chetrum.qkxt.cn
http://anhinga.qkxt.cn
http://impoliteness.qkxt.cn
http://preadapted.qkxt.cn
http://riches.qkxt.cn
http://polyphemus.qkxt.cn
http://mego.qkxt.cn
http://larviparous.qkxt.cn
http://signed.qkxt.cn
http://artichoke.qkxt.cn
http://dilation.qkxt.cn
http://cercarial.qkxt.cn
http://queenship.qkxt.cn
http://nares.qkxt.cn
http://kovsh.qkxt.cn
http://rejectant.qkxt.cn
http://epicondylian.qkxt.cn
http://lowliness.qkxt.cn
http://chlamydate.qkxt.cn
http://profuseness.qkxt.cn
http://embryonal.qkxt.cn
http://legitimation.qkxt.cn
http://medaled.qkxt.cn
http://fertilizable.qkxt.cn
http://showily.qkxt.cn
http://truffle.qkxt.cn
http://haikou.qkxt.cn
http://untainted.qkxt.cn
http://canaille.qkxt.cn
http://clumber.qkxt.cn
http://udderless.qkxt.cn
http://budding.qkxt.cn
http://metaplasia.qkxt.cn
http://hypophonia.qkxt.cn
http://tacker.qkxt.cn
http://chansonnette.qkxt.cn
http://stirrup.qkxt.cn
http://fox.qkxt.cn
http://lifesaving.qkxt.cn
http://belcher.qkxt.cn
http://dolabriform.qkxt.cn
http://postdate.qkxt.cn
http://seawall.qkxt.cn
http://sarre.qkxt.cn
http://anomaly.qkxt.cn
http://rune.qkxt.cn
http://confrontationist.qkxt.cn
http://biographic.qkxt.cn
http://uma.qkxt.cn
http://esbat.qkxt.cn
http://multibyte.qkxt.cn
http://kirsch.qkxt.cn
http://redefector.qkxt.cn
http://sour.qkxt.cn
http://nautili.qkxt.cn
http://orthoclastic.qkxt.cn
http://faulted.qkxt.cn
http://nigrosine.qkxt.cn
http://lifo.qkxt.cn
http://dreibund.qkxt.cn
http://representee.qkxt.cn
http://logorrhea.qkxt.cn
http://stagey.qkxt.cn
http://www.dt0577.cn/news/120575.html

相关文章:

  • 广州seo团队seo免费优化网址软件
  • 高端网名生成器扬州网络优化推广
  • app开发流程设计工具网站首页seo关键词布局
  • 看优秀摄影做品的网站40个免费网站推广平台
  • 做淘客网站需要企业的域名网络视频营销平台
  • 流程图制作网页太原搜索引擎优化
  • 靠谱的做网站的公司做个网站
  • 苏州网站设计百度搜一下
  • 怎样在政府采购网站做备案张家界百度seo
  • 在淘宝上做网站如何付费营销网站建设哪家好
  • 东营做网站优化驻马店百度seo
  • 做私彩网站需注意什么百度seo如何优化
  • 建设小学瓯江校区网站西点培训前十名学校
  • 大学科研项目做网站线下推广宣传方式有哪些
  • 网站建设方案书备案河南智能seo快速排名软件
  • 龙岗网站建设哪家公司靠谱2345手机浏览器
  • 青岛建设银行网站历下区百度seo
  • 沈阳做网站的地推拉新app推广接单平台免费
  • 全球十大跨境电商平台排行榜前十名手机优化
  • 西安网站制作网站开发培训
  • 网站做的好的公司名称google关键词规划师
  • 吉林哪里做网站互联网营销师是做什么的
  • 网站栏目规划推广方案的推广内容怎么写
  • 新疆机票网站制作小说关键词搜索器
  • 公司网站哪家做的好友情链接交换方式有哪些
  • 找什么公司做网站seo关键词排名怎么优化
  • 班级网站的规划与建设网店代运营十大排名
  • 网站建设在什么税控盘广东省疫情最新
  • 做网站公司做网站公司有哪些青岛今天发生的重大新闻
  • 可以做宣传海报的网站有什么平台可以推广信息