IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 优先级队列(堆) -> 正文阅读

[数据结构与算法]优先级队列(堆)

二叉树的顺序存储

存储方式

使用数组保存二叉树结构,方式即将二叉树用层序遍历方式放入数组中。
一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。
这种方式的主要用法就是堆的表示。

下标关系

  1. 已知双亲(parent)的下标,则:
    左孩子(left)下标 = 2 * parent + 1;
    右孩子(right)下标 = 2 * parent + 2;
  2. 已知孩子(不区分左右)(child)下标,则:
    双亲(parent)下标 = (child - 1) / 2;

概念

  1. 堆逻辑上是一棵完全二叉树
  2. 堆物理上是保存在数组中
  3. 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆。反之,则是小堆,或者小根堆,或者最小堆。

基本操作

建堆

在这里插入图片描述

 public void creatBigHeap(int[] array) {
    	for(int i=0;i<array.length;i++) {
    		elem[i]=array[i];
    		 usedSize++;
    	}
    	for(int parent=(usedSize-1-1)/2;parent>=0;parent--) {
    		//调整
    		shiftDown(parent,usedSize);
    	}
    }
  //parent:每颗树的根节点   len:每颗树调整的结束位置
    public void shiftDown(int parent,int len) {
    	int child=2*parent+1;
    	while(child < len) {
    		if( child+1 < len &&elem[child] < elem[child+1]) {
    			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, elem.length *2);
    		
    	}
    	elem[usedSize]=val;
    	usedSize++;
    	//注意这里传入的是usedSize-1
    	shiftUp(usedSize-1);
    }
    public boolean isFull() {
    	return usedSize==elem.length;
    }

 //向上调整
    public 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 int poll() {
    	if(isEmpty()) {
    		throw new RuntimeException("优先级队列为空");
    	}
    	 int tmp=elem[0];
		 elem[0]=elem[usedSize-1];
		 elem[usedSize-1]=tmp;
		 usedSize--;
    	 shiftDown(0,usedSize);
    	 //返回要出队的元素
    	 return tmp;
    }
    public boolean isEmpty() {
    	return usedSize==0;
    }
  public void shiftDown(int parent,int len) {
    	int child=2*parent+1;
    	while(child < len) {
    		if( child+1 < len &&elem[child] < elem[child+1]) {
    			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 int peek() {
    	if(isEmpty()) {
    		throw new RuntimeException("优先级队列为空");
    	}
    	return elem[0];
    }
    

top-K问题

在这里插入图片描述

堆排序

在这里插入图片描述

 public void heapSort() {
    	int end=usedSize-1;
    	while(end>0) {
    		 int tmp=elem[0];
    		 elem[0]=elem[end];
    		 elem[end]=tmp;
    		 shiftDown(0,end);
    	     end--;
    	}
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:25:47  更:2022-02-14 21:26:37 
 
开发: 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/26 17:19:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码