数据结构与算法-堆树

news2024/12/23 11:06:44

一:引入

        1.优先队列:大家还记得我们上节课讲的赫夫曼树,我使用了一个优先队列大大减轻了我们的开发任务,但是大家知道这个优先队列内部是如何实现的呢?

        解决: 大顶堆,优先删除

        2.如何实现一个用户热门搜索排行榜功能(微博热搜)?给你一个包含1亿关键词的用户检索的日志,如何取出排行前10的关键词。 给你的处理机器:2CPU 2G内存 一台。年龄,0~200

        解决: 1.统计出现的频率   2.维护一个大小为10的大顶

        3.2.TOP K问题,比如给你一串1000万的数字 求前k大的数。 一种是静态的数据 一种是动态的的数据

二:堆的定义

        堆是什么?堆是一种特殊的树,他需要满足以下两点:

                1.是一颗完全二叉树(除了最后一层,其他层每个节点都是满的且最后一层的节点都要靠左排列。

                2.其每一个节点的值都大于等于或者小于等于其左右子节点的值。

        但是和二叉搜索树不同: 左节点小于根节点,右节点大于根节点

小顶堆
大顶堆

三:堆的操作

       3.1 堆的存储 

        如果大家还记得我之前讲的,那肯定都很清楚完全二叉树的最佳存储结构就是数组。因为它有着特殊的属性,直接利用下标就可以表示左右节点

        比如右边的结构:

        1:10

        2:8

        3:7

        4:6

        5:4

        6:3

        还记得我之前讲的那个左右子节点的公式吧: 左=2*I i就是我们当前点所在数组的下标。 右=2*i+1

                        如果下标从0开始开始 ,这两个公式:2*i+1,2*i+2

3.2 堆的插入(两种插入方式:从上往下,从下往上)

        堆插入的位置就叫堆化

        从上往下:其实就是把插入的点放到堆顶,然后依次往下比较即可。

        从下往上:加入我们在右图插入9,很显然此时插入9后我们是不满足堆树的性质的,那怎么办呢? 其实只要做下交换就可以了,直到依次往上做到不能交换为止,看下图。

完全二叉树。类似于满二叉树,32层就可以21亿+个点,n个数交换多少 次?

顶多交换次数就是书的高度,又因为最后一层不用管,所以最多交换Logn-1

9插入过程

3.3 堆的删除

        1.删除堆顶: 就把堆顶的数与最后一个做交换,然后再堆排序,最终还能保证是一课完全二叉树,否则会少结点。

四:堆树应用

        1.堆排序

                大家还记得我之前讲排序的时候我们还有一个堆排序没讲,今天我们来看看,如果利用这个堆树进行排序呢?

假设给你一个序列: 8 4 20 7 3 1 25 14 17

        利用堆树进行排序:

                1.先按照序列顺序存储在完全二叉树中。

                建堆:

                2.从最后一个非叶子节点堆化。为什么是最后一个非叶子节点而不是最后一个叶子节点呢? 看例子:

一种:从无到右,就是从头往后建

二种:修正,从后往前。从数组的后面往前走

        排序:那么我们如何实现排序的呢?
我们将堆顶和最后一个元素进行交换,交换完后进行一次堆化,依次执行这个操
作即可,大家来看。同时每次排完序后已经排好的就不需要再次排序了。

        

        

package tree.堆树;

import java.util.Arrays;

public class HeapSort {
	public static void main(String[] args) {
		int data[] = { 8, 4, 20, 7, 3, 1, 25, 14, 17 };
		heapSort(data);
		System.out.println(Arrays.toString(data));
	}

	/**
	 * 有int start, int end:参数是因为已经建好的就不需要再比较了,所以每次都有范围
	 * @param data
	 * @param start
	 * @param end
	 */
	public static void maxHeap(int data[], int start, int end) { // 建一个大顶堆,end表示最多建到的点 lgn

		int parent = start;
		int son = parent * 2 + 1; // 下标是从0开始的就要加1,从1就不用
		while (son < end) {
			int temp = son;
			// 比较左右节点和父节点的大小     son:表示左结点  son+1:表示右结点
			if (son + 1 < end && data[son] < data[son + 1]) { // 表示右节点比左节点到
				temp = son + 1; // 就要换右节点跟父节点
			}
			// temp表示的是 我们左右节点大的那一个
			if (data[parent] > data[temp])
				return; // 不用交换
			else { // 交换
				int t = data[parent];
				data[parent] = data[temp];
				data[temp] = t;
				parent = temp; // 继续堆化
				son = parent * 2 + 1;
			}
		}
		return;

	}

	public static void heapSort(int data[]) {

		int len = data.length;
		for (int i = len / 2 - 1; i >= 0; i--) { //o(nlgn)   len / 2 - 1:代表最后一个非叶子结点开始
			maxHeap(data, i, len);		//
		}
		for (int i = len - 1; i > 0; i--) { //o(nlgn)
			int temp = data[0];
			data[0] = data[i];
			data[i] = temp;
			maxHeap(data, 0, i);	//这个i能不能理解?因为len~i已经排好序了
		}
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生Kubernetes:pod资源管理与配置

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是kubernetes中…

PWA及小程序在系统生态方面的支持对比

PWA代表“渐进式网络应用”&#xff08;Progressive Web Application&#xff09;。它是一种结合了网页和移动应用程序功能的技术概念。PWA旨在提供类似于原生应用程序的用户体验&#xff0c;包括离线访问、推送通知、后台同步等功能&#xff0c;同时又具有网页的优势&#xff…

Linux自动化构建项目工具——Makefile/makefile

目录 一&#xff0c;背景知识 二&#xff0c;makefile/Makefile的编写 1.创建makefile/Makefile文件 2.在Makefile文件里写编译代码 3.伪目标——.PHONY 1.伪目标的特点 2.怎样实现总是被执行 4.Makefile/makefile文件的不同编写风格 1.背景知识 2.改写 一&#xff0c;背…

kali安装volatility及插件mimikatz

1.准备工作 kali安装pip2 wget https://bootstrap.pypa.io/pip/2.7/get-pip.py python2 get-pip.py 查看pip2版本 python2 -m pip -v pip2安装升级 pip2 install --upgrade setuptools 安装2个库 pip2 install construct2.10.54 pip2 install pycryptodome 下载文件d…

python开发之个微的二次开发

简要描述&#xff1a; 自动通过群&#xff08;url&#xff09; 请求URL&#xff1a; http://域名地址/acceptUrl 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;Authorization值&#xff08;…

同一台电脑安装两个版本的idea

在同一台电脑中安装两个idea&#xff0c;例如idea2019和idea2023都正常安装&#xff0c;但是第二个idea2023版本&#xff0c;双击打不开程序&#xff0c;那就就需要安装下面的操作流程进行解决。 第一步&#xff1a;创建 .IntelliJIdea2023.2.1文件夹 在C:\Users\用户\目录下…

企业面对负面舆论时应当如何有效应对?

随着网络的快速发展&#xff0c;网络舆情已经成为影响企业形象的重大因素&#xff0c;一条不起眼的负面新闻报道&#xff0c;如果不注意的话&#xff0c;其影响是难以预料的。当负面舆论来临&#xff0c;企业应该怎么做才能化解消极影响呢&#xff1f;接下来媒介盒子就来告诉大…

【Redis】深入探索 Redis 的数据类型 —— 列表 List

文章目录 一、List 类型介绍二、List 类型相关命令2.1 LPUSH 和 RPUSH、LPUSHX 和 RPUSHX2.2 LPOP 和 RPOP、BLPOP 和 BRPOP2.3 LRANGE、LINDEX、LINSERT、LLEN2.4 列表相关命令总结 三、List 类型内部编码3.1 压缩列表&#xff08;ziplist&#xff09;3.2 链表&#xff08;lin…

铝及铝合金产品标识知识学习记录

声明 本文是学习GB-T 42916-2023 铝及铝合金产品标识. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1— 圆铸锭表面&#xff1b; 2——切完头尾的圆铸锭尾端(引锭头端)。 图 9 圆铸锭刻痕标识示意图(一) 示 例 2 : 5A06 牌号、铸态、尺寸规格为…

4.4-Spring源码循环依赖终极讲解

回顾上期内容 new 容器 new AnnotateBeanDefinitionReader 的时候创建很多创世纪的类&#xff0c;其中有一个ConfigurationPostProcessor是用来解析配置类的&#xff0c;将其注册起来存到Bean定义的Map中【这个类是基于Bean工厂后置处理器的】 这一步是将配置类注册到Bean定…

VUE之滚动条参数设置

/*css主要部分的样式*/ /*定义滚动条宽高及背景&#xff0c;宽高分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar {width: 6px; /*对垂直流动条有效*/height: 6px; /*对水平流动条有效*/ }/*定义滚动条的轨道颜色、内阴影及圆角*/ ::-webkit-scrollbar-track{border-radius: 4…

Linux学习笔记-Ubuntu系统下配置用户ssh只能访问git仓库

目录 一、基本信息1.1 系统信息1.2 git版本[^1]1.2.1 服务器端git版本1.2.2 客户端TortoiseGit版本1.2.3 客户端Git for windows版本 二、创建git用户和群组[^2]2.1 使用groupadd创建群组2.2 创建git用户2.2.1 使用useradd创建git用户2.2.2 配置新建的git用户ssh免密访问 2.3 创…

Cglib代理和JDK代理原理的区别

一、JDK Jdk动态代理&#xff0c;拿到目标类所继承的接口&#xff0c;生成代理类&#xff0c;并且代理类也会实现和目标类一样的接口。 二、Cglib Cglib代理功能更强&#xff0c;无论目标类是否实现接口都可以代理&#xff0c;他是基于继承的方式类代理目标类&#xff0c;如果…

23下半年学习计划

大二上学期计划 现在已经是大二了&#xff0c;java只学了些皮毛&#xff0c;要学的知识还有很多&#xff0c;新的学期要找准方向&#xff0c;把要学的知识罗列&#xff0c;按部就班地完成计划&#xff0c;合理安排时间&#xff0c;按时完成学习任务。 学习node.js&#xff0c…

Python Opencv实践 - HoG特征计算

参考资料&#xff1a;https://www.cnblogs.com/alexme/p/11361563.html https://blog.csdn.net/qq_43348528/article/details/108638030 import cv2 as cv import numpy as np import matplotlib.pyplot as plt from skimage import exposure from skimage.feature i…

线段树上树剖再拿线段树维护:0914T4

cp 一种常见套路&#xff1a; 如果在线段树上进行一段区间修改&#xff0c;那么必然是一段右节点一段左节点 这个过程其实就是zkw的本质 下面都要用zkw来理解 考虑原题&#xff0c;有一棵不规则的线段树 类似zkw&#xff0c;在这类题目中&#xff0c;我们要先把开区间变成闭…

华为云Stack的学习(六)

七、华为云Stack计算服务介绍 1.计算服务整体介绍 2.弹性云服务器ECS ECS&#xff08;Elastic Cloud Server&#xff09;&#xff0c;即弹性云服务器&#xff0c;是由vCPU、内存、磁盘等组成的&#xff0c;获取方便、弹性可扩展、按需使用的、虚拟的计算服务器。 ECS只需要花…

【深度学习】 Python 和 NumPy 系列教程(十四):Matplotlib详解:1、2d绘图(下):箱线图、热力图、面积图、等高线图、极坐标图

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 0. 设置中文字体 1-5. 折线图、散点图、柱状图、直方图、饼图 6. 箱线图&#xff08;Box Plot&#xff09; 7. 热力图&#xff08;Heatmap&#xff09; 8. 面积图&#xff08;Area Plot&#xff09; 9. 等…

Zabbix“专家坐诊”第203期问答汇总

问题一 Q&#xff1a;用的模板&#xff0c;没用创建动作&#xff0c;但是触发器触发了我钉钉直接被通知了&#xff0c;怎么取消模板自带的动作&#xff1f; A&#xff1a;没有动作是不会触发事件告警的 &#xff0c;确定是从这个平台推出的钉钉消息&#xff1f;或者看下zabbix…

【操作系统】进程的通信IPC

进程通信是指进程之间的信息交换。 低级通信方式&#xff1a;PV操作 高级通信方式&#xff1a;1.共享存储2.消息传递3.管道通信 共享存储 低级数据结构共享&#xff0c;高级存储区共享。 对共享空间进行读写操作时&#xff0c;需要用到互斥工具。 消息传递 利用发送消息和…