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

南京自助建站软件wordpress 建站教程

南京自助建站软件,wordpress 建站教程,黄岩区住房保障建设局网站,营销型网站什么意思1、概念 前面介绍过队列,队列是一种先进先出(FIFO)的数据结构 ,但有些情况下, 操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列 ,这时候,使用队列显然不合适了。 在这种…

1、概念

        前面介绍过队列,队列是一种先进先出(FIFO)的数据结构 ,但有些情况下, 操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列 ,这时候,使用队列显然不合适了。
        
        在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象 。这种数据结构就是优先级队列 (Priority Queue)

2、优先级队列的模拟实现

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

2.1 堆的概念 

        堆在逻辑上是一棵完全二叉树,物理上存储在数组中,满足根比子树的节点大称为大根堆,反之,根比子树节点小称为小根堆。堆的基本作用是:快速找到集合中的最值。

2.2 堆的存储方式

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

        将元素存储在数组中后可以根据二叉树章节(二叉树 1-CSDN博客)讲解过的性质5进行还原。

假设i为节点在数组的下标,则有:

        1、若i==0,则i下标的节点是整棵树的根节点,否则i的双亲节点为(i-1)/2。

        2、若i有左孩子,则左孩子下标为2*i+1。

        3、若i有右孩子,则右孩子下标为2*i+2。

2.3 堆的创建 

        这是创建堆的所需成员变量和构造方法和堆的初始化:

public class TestHeap {private int[] elem;private int usedSize;public TestHeap() {this.elem = new int[10];}public void initHeap(int[] array){for (int i = 0; i < elem.length; i++) {elem[i] = array[i];usedSize++;}}

        下面我们将创建一个大根堆:

        如下图,将一棵普通的完全二叉树,调整为了大根堆,其方法为,找到最下面的一棵子树,然后将其根结点与子树进行比较,调整每一棵子树根结点的位置,该方法称为向下调整

        首先我们找到最后一个父亲结点,需要用到我们刚才讲得性质5,公式为:(数组长度-1(也就是最后一个叶子节点)-1)/2。

        调整过程:设p是最后一个父亲结点的下标,那么p--就可以把每棵子树调整结束,再设置一个c来获取左右子树的最大值,根据大小根堆的性质分别进行调整。

public void creatHeap(){for (int parent = (usedSize-1-1) / 2; parent >= 0 ; parent--) {shiftDown(parent,usedSize);}}

        向下调整的方法:

    private void shiftDown(int parent,int usedSize){int child = (2*parent)+1;//左孩子//判断左孩子是否合法while(child < usedSize){if(child+1 < usedSize && elem[child] < elem[child+1]){//右孩子是否合法child++;}//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;}

        向下调整创建堆的时间复杂度是O(N),如果使用向上调整时间复杂度是O(n*log2n)。

        下面是向下调整时间复杂的计算过程: 

    

 2.4 堆的插入

        插入要考虑两件事:
        1. 将元素往哪里放?(堆是否满? -- > 扩容)

        2. 放进去怎么放到合适的位置?

       将新插入的元素放入到最底层的空间中,空间不够的时候需要扩容,然后将最后插入的结点按照堆的性质向上调整。

 

 public  void offer(int val){if(isFull()){this.elem = Arrays.copyOf(elem,2*elem.length);}this.elem[usedSize] = val;//useSize=0//向上调整shiftUp(usedSize);usedSize++;}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;}}}

        时间复杂度:O(log2N)。 

2.5 堆的删除

        注意:这里删除的一定是堆顶元素。

        1、将堆顶元素和最后一个元素交换位置。

        2、useSized--。

        3、对堆顶元素进行向下调整。

        代码如下: 

   public  int poll(){int tmp = elem[0];//0下标元素和最后一个元素交换swap(0,usedSize-1 );//向下调整0~usedsize-1usedSize--;//删除shiftDown(0,usedSize);return tmp;}
 private void shiftDown(int parent,int usedSize){int child = (2*parent)+1;//左孩子//判断左孩子是否合法while(child < usedSize){if(child+1 < usedSize && elem[child] < elem[child+1]){//右孩子是否合法child++;}//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;}

       时间复杂度:O(log2N)。

 2.6 获取堆顶元素

 public int peek(){return  this.elem[0];}
}


文章转载自:

http://5grCnXkF.ggfdq.cn
http://04EHluNg.ggfdq.cn
http://Wcp0nxpb.ggfdq.cn
http://TL8ww6jL.ggfdq.cn
http://MYgjWdqD.ggfdq.cn
http://nFH0w2Qa.ggfdq.cn
http://ceXDq8E0.ggfdq.cn
http://FOywCMdU.ggfdq.cn
http://EamfPBmo.ggfdq.cn
http://T0XBYwsQ.ggfdq.cn
http://IfEU2paE.ggfdq.cn
http://aSiFzvnR.ggfdq.cn
http://XEszCVfn.ggfdq.cn
http://D4J9oxbX.ggfdq.cn
http://w9Yw4K8E.ggfdq.cn
http://6FIM3XIj.ggfdq.cn
http://V0bAime3.ggfdq.cn
http://f2kFEvqZ.ggfdq.cn
http://ccKf7RLT.ggfdq.cn
http://UdtzYWHj.ggfdq.cn
http://tYRpvffN.ggfdq.cn
http://YdPt9fZF.ggfdq.cn
http://jFEwFv5y.ggfdq.cn
http://ypU8q6LN.ggfdq.cn
http://YyQZycXm.ggfdq.cn
http://fEGcI39n.ggfdq.cn
http://a4sDBpdW.ggfdq.cn
http://9QoEemFf.ggfdq.cn
http://uZDcjJB0.ggfdq.cn
http://AG3KFk1x.ggfdq.cn
http://www.dtcms.com/wzjs/692314.html

相关文章:

  • 制作自己的网站 域名怎么弄商户网站唯一订单号
  • xuzhou网站制作创意产品设计书
  • 淘宝做基础销量网站深圳网站制作长沙
  • 检测网站点击量成全视频观看免费高清第6季
  • 广西旅游网站建设百度知道小程序
  • 鄂尔多斯 网站制作邯郸专业网站建设公司
  • 图片站 wordpress个人备案做视频网站
  • 深圳市建筑有限公司台州关键词优化哪家好
  • 深圳市建设项目seo优化查询
  • 网站建设板块如何分类天津 网站建设
  • 网页站点怎么命名企业官方网站推广
  • 朱能源做网站营销代码是什么
  • 驻马店公司做网站北京的网页设计
  • wordpress网站怎么打开很慢上海详细地址大全
  • 织梦怎么修改网站标题做公司网站的模板
  • seo wordpress主题齐三seo顾问
  • 德州网站有哪些营销手机系统安装
  • 无锡网站的优化那个网站能找到人
  • wordpress建立论坛网站个人网站可以做百度推广么
  • 织梦网站栏目是做什么用的宜春网站建设公司联系方式
  • 烟台外贸网站建设公司都匀网站制作公司
  • 南通市住房和建设局网站微信系统平台开发
  • 网站改版设计思路永久免费网址在线观看电视剧
  • 兰州微网站建设策划案模板
  • 品牌软文兰州seo优化
  • 网站与网页设计河南23个岗位无人报考
  • 四川建设网站首页wordpress 科技类主题
  • 公司网站建设ihanshi网站制作视频教程下载百度云
  • 安徽工程建设信息网新网站网站的推广和宣传方式
  • 论mvc框架在网站开发的应用友情链接多少钱一个