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

南京专业做网站公司地址城市门户网站

南京专业做网站公司地址,城市门户网站,网络营销有哪些主要功能,wordpress联系表单插件一.概念 队列是一种先进先出的结构,在一些特殊的情况下,我们需要队列返回的可能不只是第一个那么简单,而是队列中最大或者最小的,这就需要用到优先级队列了。 优先级队列这种数据结构能够提供:返回最高优先级对象&am…

一.概念

队列是一种先进先出的结构,在一些特殊的情况下,我们需要队列返回的可能不只是第一个那么简单,而是队列中最大或者最小的,这就需要用到优先级队列了。

优先级队列这种数据结构能够提供:返回最高优先级对象,添加新对象两种方法。

二.模拟实现

在JDK1.8PriorityQueue底层使用了堆这种数据结构,实现堆实际上就是实现优先级队列,而堆又是在完全二叉树的基础上进行了一些调整。

2.1.堆的概念

堆其实就是将二叉树的每一个树的根节点都设为当前最大/最小,我们称之为小堆/大堆。

2.2.堆的性质

堆中某个结点的值总是不大于或不小于其父节点的值;

堆总是一颗完全二叉树

2.3.堆的存储方式

从堆的概念来看可以用层序的规则来进行存储

2.4.堆的创建

2.4.1堆的向下调整

顾名思义向下调整就是往下调整,根据什么规则呢?这要看是要创建大堆还是小堆,我们以创建大堆来进行举例

我们直接来上手代码

private void shiftDown(int parent, int useSize) {int child = (2 * parent) + 1;while(child < useSize){if( child + 1 < useSize &&  elem[child] < elem[child + 1] ){child++;}if(elem[child] > elem[parent]){swap(child,parent);parent = child;child = 2* parent + 1;}else{break;}}}
 2.4.2向上调整(大根堆)

具体跟小根堆一样,一个向下一个向上。

private void shiftup(int child){int parent = (child - 1) / 2;while(child > 0){if(elem[child] > elem[parent]){swap(child,parent);child = parent;parent = (child - 1) / 2;}else{break;}}}

3.堆的创建(大根堆)

 public void creatHeap(){for (int parent = (useSize - 1 - 1) / 2; parent >= 0 ; parent--) {shiftDown(parent,useSize);}}
3.1堆的插入

堆的插入就是将要插入的元素放到最后一个有效元素的后面,要提前进行空间检查,然后进行向上调整,因为只有一条分支没有进行调整所以不用在进行递归。

 public void offer(int val){if(isFull()){this.elem = Arrays.copyOf(elem,2*elem.length);}this.elem[useSize] = val;shiftup(useSize);useSize++;}
3.2堆的删除

堆的删除实际上就是将最后一个元素和将要删除的元素进行调换,然后进行向下调整,这里在向下调整是我们是不会堆最后一个元素进行向下调整的,所以这个元素就相当于删除了。

 public int poll(){int tmp = elem[0];swap(0,useSize - 1);useSize--;shiftDown(0,useSize);return tmp;}

说了这么多,我们终于可以模拟实现优先级队列了。

public class TestHeap {private  int[] elem;private int useSize;public TestHeap(){this.elem = new int[10];}public void initHeap(int[] array){for (int i = 0; i < array.length; i++) {elem[i] = array[i];useSize++;}}public void creatHeap(){for (int parent = (useSize - 1 - 1) / 2; parent >= 0 ; parent--) {shiftDown(parent,useSize);}}private void shiftDown(int parent, int useSize) {int child = (2 * parent) + 1;while(child < useSize){if( child + 1 < useSize &&  elem[child] < elem[child + 1] ){child++;}if(elem[child] > elem[parent]){swap(child,parent);parent = child;child = 2* parent + 1;}else{break;}}}private void swap(int i, int j){int tmp = elem[i];elem[i] = elem[j];elem[j] = tmp;}public void offer(int val){if(isFull()){this.elem = Arrays.copyOf(elem,2*elem.length);}this.elem[useSize] = val;shiftup(useSize);useSize++;}private void shiftup(int child){int parent = (child - 1) / 2;while(child > 0){if(elem[child] > elem[parent]){swap(child,parent);child = parent;parent = (child - 1) / 2;}else{break;}}}public boolean isFull(){return useSize == elem.length;}public int poll(){int tmp = elem[0];swap(0,useSize - 1);useSize--;shiftDown(0,useSize);return tmp;}

三.priorityqueue特性

1. 使用时必须得导入包

package priorityQueue;

2.队列中放置的元素必须的得是能够比较大小的,否则会抛出异常

3.不能插入null对象,否则会抛出空指针异常

4.没有容量限制,其内部可以自动扩容

5.插入和删除元素的时间复杂度为O(logN)

6,队列底层使用了堆数据结构

7.队列默认情况下是小堆数据结构

如果要改成大堆结构,需要提供比较器

class IntCmp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}
}

我们就以最小k个值来举例

就是在一堆数据中找到前k个最小的值,我们知道大堆的根结点都是最大的,所以我们可以找到一堆最小的数当中的最大值,我们可以先把k个值放入优先级队列(大堆结构),然后再将k后的这些值于优先级队列最大值进行比较,比根节点小,就交换。

  public  static int[] bigestk(int[] array, int k){int[] ret = new int[k];if(array == null || k <= 0){return ret;}PriorityQueue<Integer> priorityQueue =new PriorityQueue<>(new IntCmp());for (int i = 0; i < k; i++) {priorityQueue.offer(array[i]);}for (int i = k; i < array.length  ;i++) {int top = priorityQueue.peek();if(array[i] < top){priorityQueue.poll();priorityQueue.offer(array[i]);}}for (int i = 0; i < k; i++) {ret[i] = priorityQueue.poll();}return ret;}

我们再这里就提供了一个比较器。

四,常用方法

1.PriorityQueue()     创建一个空的优先级队列

2.PriorityQueue(int initialCapacity) 创建一个初始容量为 initialCapacity 大小的优先级队列,不能小于1

3.PriorityQueue(Collection<? extend E> c) 用一个集合来创建优先级队列

4. boolean offer(E e)  插入元素对象为空则抛出空指针异常

5.E peek()      获取优先级最高的元素

6.E poll();      移除优先级最高的元素,并返回

7.int size()     过去有效元素的个数

8.void clear()  清空

9.boolean isEmpty()  检测优先级队列是否为空


文章转载自:

http://MavWyjkc.wrysm.cn
http://xHacOkZ7.wrysm.cn
http://GJyY9cvG.wrysm.cn
http://6QHeoZUl.wrysm.cn
http://HifnJL9U.wrysm.cn
http://DyEos5Ur.wrysm.cn
http://xJfroqjv.wrysm.cn
http://FcYMe2SL.wrysm.cn
http://ODHPRAsW.wrysm.cn
http://AJFJ52a4.wrysm.cn
http://EGGXS66F.wrysm.cn
http://hX5osiGW.wrysm.cn
http://W42r12GE.wrysm.cn
http://4NSerSuf.wrysm.cn
http://hVzlerXp.wrysm.cn
http://x3DTj94D.wrysm.cn
http://chVjZwBN.wrysm.cn
http://TVSp5OSh.wrysm.cn
http://UOQl118A.wrysm.cn
http://96yws1SN.wrysm.cn
http://G7flvu4b.wrysm.cn
http://hTICbuhd.wrysm.cn
http://k20yimXO.wrysm.cn
http://CxGCvLIV.wrysm.cn
http://lye4f7x5.wrysm.cn
http://ldB5NnNZ.wrysm.cn
http://nVzPsgXE.wrysm.cn
http://n8G4zxz8.wrysm.cn
http://CzbARJ9E.wrysm.cn
http://fG27i6Vz.wrysm.cn
http://www.dtcms.com/wzjs/647727.html

相关文章:

  • 九易建网站的建站模板深圳网站开发服务
  • 定制网站开发冬天里的白玫瑰jsp网站建设项目实战课本内容
  • 无法进入建设银行网站怎呀做网站
  • 昆山网站建设昆山网站的建设的项目介绍怎么写
  • 做第一个网站什么类型企业年金怎么提取
  • 国外文本排版设计网站如归网络营销推广企业
  • 网站域名密码大神自己做的下载音乐的网站
  • 网站 邮箱功能 设置免费网站源码大全
  • 网站开发哪些专业html做的小网站
  • 想设计一个公司的网站集团企业网站建设方案
  • 做网站能用本地的数据库嘛石门网站建设
  • 公司汇报网站建设方案辽阳专业建设网站公司
  • 做图书馆网站模板diy科技制作网站
  • 禹州做网站的公司企业大型网站开发建站教程详解
  • 网站怎样推广 优帮云蒙文网站建设的意义
  • 素材网站哪个值得买大学生二手书网站开发需求
  • 摄影图片素材网站php做网站脑图
  • 网站建设特定开发搜索引擎推广的基本方法有
  • 手机建个人网站国际市场营销案例100例
  • 做百科权威网站有哪些wordpress关闭主题提示
  • 潍坊专升本考试地点抖音视频seo霸屏
  • 小馋网站建设书wordpress 虚拟货币模块
  • 自治区住房和城乡建设部网站网站建设合同英文
  • 闵行网站建设多久能见效果什么网站是专门做评论赚钱的
  • 网站备案核验号网络营销策划推广方案
  • 网站建设企业需要符合哪些建寺庙网站模板
  • 网站建设中请期待青海教育厅门户网站
  • 广东建设工程注册中心网站化妆品网站制作需要
  • wordpress 购物网站主题推广公司产品文案该怎么写
  • 华龙建设部网站查不到销售技巧