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

html5博客网站模板云主机玩游戏怎么样

html5博客网站模板,云主机玩游戏怎么样,滨江区做网站公司,首饰网站模板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://www.dtcms.com/wzjs/586666.html

相关文章:

  • wordpress站点信息修改版权在国外做网站网站犯法吗
  • 网站建设市场报价网站建设公众号管理
  • 上海门户网站怎么登录东西湖建设局网站
  • 什么网站做英语翻译练习不关闭网站备案
  • 网站制作常见问题上海快速建站平台
  • 安全员怎么网站中做备案搜狗网站入口
  • 网站流量如何盈利开发网站软件
  • 网站板块的策划方案国家重点项目建设库网站
  • 直通车关键词怎么选 选几个桌子seo关键词
  • 文明网站建设总结网站套餐报价 模版
  • 化工网站关键词优化厦门公司网页制作
  • 响应式 网站 设计软件seo搜索排名优化
  • 海宁市住房与建设规划局网站制作钓鱼网站属于什么罪
  • 影视网站视频接口怎么做圣沃建设集团官方网站
  • 凡科可以做返利网站吗新品牌推广方案
  • 网站根目录 本地共享提供建站服务的网络公司的比较
  • 科技资讯 哪个网站好百度快速排名技术培训教程
  • 没网站怎么做京东联盟天津做网站找哪家公司好
  • 忻州网站建设公司网页设计实训报告主要内容
  • 建设家居网站买个域名后怎么做网站
  • 网站开发制作平台免费微信小程序商城
  • 用友加密狗注册网站网站建设模板制作是什么意思
  • 网站建设优化公司呼和浩特搞笑视频网站建设策划书
  • 商标设计网站免费开网店哪个电商平台好
  • 网站建设经济成本分析汾阳今天重大新闻
  • 响应式商业网站开发实训报告昆明建设
  • 无域名建网站湖州网站设计公司
  • 网站怎么做轮幕企业cms建站
  • 浅谈博物馆网站建设的意义莱芜信誉好的网络推广公司
  • 网站建设方式可行性分析网站精神文件建设专栏