关于算法设计与分析基之堆的示例
以数组来存放堆数据
package cn.xf.algorithm.ch06ChangeRule; import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * * 功能:堆的构造 * 1、堆可以定义为一颗二叉树,树的节点包含键,并且满足一下条件 * 1) 树的形状要求:这棵二叉树是基本完备的(完全二叉树),树的每一层都是满的,除了最后一层最右边的元素可能缺位 * 2) 父母优势,堆特性,每一个节点的键都要大于或者等于他子女的键(对于任何叶子我们认为这都是自动满足的) * * 对于堆: * 只存在一颗n个节点的完全二叉树他的高度:取下界的 log2的n的对数 * 堆的根总是包含了堆的最大元素 * 堆的一个节点以及该节点的子孙也是一个堆 * 可以用数组的来实现堆,方法是从上到下,从左到右的方式来记录堆的元素。 * @author xiaofeng * @date 2017年7月9日 * @fileName Heap.java * */ public class Heap { /** * 堆的数据存放结构 */ private List<Double> heap; /** * 自下而上构建一个堆 */ private List<Double> createHeadDownToUp(List<Double> heap) { if(heap == null || heap.size() <= 0) return heap; //数据个数 int nums = heap.size(); //吧数组整体后移一位,方便数据的计算,因为从0开始,那么2*0还是0,没有体现出2*n就是n的左孩子的基本设定 heap.add(0, 0d); //构建一个堆,从数组的中间位置开始,因为中间位子mid的两倍正好差不多是这个树的末尾,而在这个2*mid的附近就是mid这个节点的孩子节点 for(int i = nums / 2 + 1; i > 0; --i) { //获取基准节点的地址 int baseIndex = i; //获取这个节点的值 double vBaseValue = heap.get(baseIndex); boolean isHeap = false; //这个用来判断当前遍历的这三个数字是否满足堆的概念 //进行堆变换,交换树的节点和孩子节点数值,使当前树满足堆的概念 //2 * baseIndex <= nums 这个用来判断这颗树的子树也满足堆的定义 while(!isHeap && 2 * baseIndex <= nums) { //获取当前遍历到的数据的左孩子节点的位置 int maxChildIndex = 2 * baseIndex; //从两个孩子节点中获取大的那个位置 if(maxChildIndex < nums) { //如果左孩子的位置比总长还小,由于完全二叉树的属性,那么必定存在右孩子节点 //判断那个孩子节点的数据比较大,使max为大的那个 if(heap.get(maxChildIndex) < heap.get(maxChildIndex + 1)) { //如果右孩子比较大 maxChildIndex += 1; } } //再判断,当前 节点的值是不是比孩子节点的值要大,如果是那么就当前子树是满足堆的属性 //maxChildIndex == nums 那还是瞒住条件,可以进行左子树的比较 if(maxChildIndex > nums || vBaseValue >= heap.get(maxChildIndex)) { isHeap = true; } else { //如果不满住,那么交换,吧大的数据交换到节点上,吧节点的数据换到孩子节点上 heap.set(baseIndex, heap.get(maxChildIndex)); baseIndex = maxChildIndex; heap.set(baseIndex, vBaseValue); } } } //去除第一个0,然后返回 heap.remove(0); return heap; } private void shifHeadDownToUp(int i) { if (heap == null || heap.size() <= 0) return; // 数据个数 int nums = heap.size(); // 吧数组整体后移一位,方便数据的计算,因为从0开始,那么2*0还是0,没有体现出2*n就是n的左孩子的基本设定 heap.add(0, 0d); boolean isHeap = false; int baseIndex = i; double vBaseValue = heap.get(i); while (!isHeap && 2 * baseIndex <= nums) { // 获取当前遍历到的数据的左孩子节点的位置 int maxChildIndex = 2 * baseIndex; // 从两个孩子节点中获取大的那个位置 if (maxChildIndex < nums) { // 如果左孩子的位置比总长还小,由于完全二叉树的属性,那么必定存在右孩子节点 // 判断那个孩子节点的数据比较大,使max为大的那个 if (heap.get(maxChildIndex) < heap.get(maxChildIndex + 1)) { // 如果右孩子比较大 maxChildIndex += 1; } } // 再判断,当前 节点的值是不是比孩子节点的值要大,如果是那么就当前子树是满足堆的属性 // maxChildIndex == nums 那还是瞒住条件,可以进行左子树的比较 if (maxChildIndex > nums || vBaseValue >= heap.get(maxChildIndex)) { isHeap = true; } else { // 如果不满住,那么交换,吧大的数据交换到节点上,吧节点的数据换到孩子节点上 heap.set(baseIndex, heap.get(maxChildIndex)); baseIndex = maxChildIndex; heap.set(baseIndex, vBaseValue); } } // 去除第一个0,然后返回 heap.remove(0); } //创建堆 public Heap() { heap = new ArrayList<Double>(); createHeadDownToUp(heap); } public Heap(List<Double> data) { if(data == null || data.size() <= 0) { data = new ArrayList<Double>(); } heap = data; createHeadDownToUp(heap); } @Override public String toString() { return heap.toString(); } public void add(Double value) { if(value == null) return; heap.add(value); // int insertInedx = heap.size(); //自底向上构建堆 for(int i = heap.size() / 2; i >= 0; --i) { shifHeadDownToUp(i + 1); } } /** * 删除一个元素,获取这个元素的索引位置来删除 * 1、根的键《和》堆的最后一个键K做交换 * 2、堆的规模减一 * 3、严格按照自底向上的够着算法的做法,吧K 向下筛选,堆数据进行堆化 * @param index */ public void delete(int index) { //这个是自底向上进行堆化数据 //吧最后一个数据填入到要删除的数据中 Double lastValue = heap.get(heap.size() - 1); //删除最后一个元素,吧最后一个元素用来取代这个需要删除的元素 heap.set(index, lastValue); heap.remove(heap.size() - 1); //自底向上开始堆化 for(int i = index; i >= 0; --i) shifHeadDownToUp(i + 1); } }
以上是关于算法设计与分析基之堆的示例的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

4月26日消息,中兴5G随身Wi-FiU50S目前已经正式开售,首发899元。外观设计上,中兴U50S随身Wi-Fi简约时尚,易于手持和包装。其尺寸为159/73/18mm,携带方便,让您随时随地畅享5G高速网络,实现畅行无阻的移动办公与娱乐体验。中兴5G随身Wi-FiU50S该设备支持先进的Wi-Fi6协议,峰值速率高达1800Mbps,依托骁龙X55高性能5G平台,为用户提供极速的网络体验。不仅支持5G双模SA+NSA网络环境和Sub-6GHz频段,实测网速更可达惊人的500Mbps,轻松满

4月17日消息,HMD携手知名啤酒品牌喜力以及创意公司Bodega,联袂推出了一款别具一格的翻盖手机——无聊手机(TheBoringPhone)。这款手机不仅在设计上充满新意,更在功能上返璞归真,旨在引领人们回归真实的人际交往,享受与朋友畅饮的纯粹时光。无聊手机采用了独特的透明翻盖设计,展现出一种简约而不失优雅的美感。其内部配备了2.8英寸QVGA显示屏,外部则是一块1.77英寸的显示屏,为用户提供了基本的视觉交互体验。在摄影方面,虽然仅搭载了30万像素的摄像头,但足以应对日常的简

7月12日消息,荣耀MagicV3系列今日正式发布,搭载全新荣耀视力舒缓绿洲护眼屏,在屏幕本身具备高规格和高素质的同时,还开创性的引入AI主动式护眼技术。据悉,传统的缓解近视的方式是“近视镜”,近视眼镜度数均匀分布,保证了视线中心区域成像在视网膜之上,但周边区域成像在视网膜后,视网膜感应到成像在后,促进眼轴向后生长,从而使度数加深。目前主要的缓解近视发展的方式之一是“离焦镜”,其中心区域度数正常,周边区域通过光学设计分区调整,从而使周边区域成像落在视网膜前,

4月3日消息,台电即将推出的M50Mini平板电脑是一款功能丰富、性能强大的设备。这款8英寸小平板新品搭载了8.7英寸的IPS屏幕,为用户提供了出色的视觉体验。其金属机身设计不仅美观,还增强了设备的耐用性。在性能方面,M50Mini搭载了紫光展锐T606八核处理器,拥有两个A75核心和六个A55核心,确保了流畅且高效的运行体验。同时,该平板还配备了6GB+128GB的存储方案,并支持8GB内存扩展,满足了用户对于存储和多任务处理的需求。在续航上,M50Mini配备了5000mAh的电池,支持Ty

在工作中,ppt是职场人士常常使用的办公软件。一个完整的ppt必须有一个好的结束页。不同的职业要求赋予不同的ppt制作特点。关于结束页的制作,如何才能设计的比较吸引人呢?下边我们一起看一看,如何设计ppt结束页吧!ppt结束页的设计可以在文字和动画方面进行一些调整,根据需要选择简洁或炫目的风格。接下来,我们将重点关注如何通过创新的表达方式来打造出符合要求的ppt结束页。那我们开始今天的教程吧。1、对于结束页的制作上,使用图片中的任何文字都可以,结束页重要的是表示我的演示结束了。2、除了这些文字,

7月29日消息,荣耀X60i手机今日正式开售,首发1399元。设计上,荣耀X60i手机采用居中挖孔直屏设计,四边近乎无界的超窄边框,极大地拓宽了视野边界。荣耀X60i参数显示屏:6.7英寸高清显示屏电池:5000mAh大容量电池处理器:天玑6080处理器(台积电6nm,2x2.4G的A76+6×2G的A55)系统:MagicOS8.0系统其他功能:5G信号增强灵动胶囊屏下指纹双MIC降噪知识问答摄影能力:后置双摄系统:5000万像素主摄200万像素辅助镜头前置自拍镜头:800万像素价格:8GB

5月13日消息,vivoX100s今晚正式发布,除了出色的影像,新机在信号方面表现也十分强悍。据vivo官方介绍,vivoX100s采用了创新的寰宇信号放大系统,该系统配备了高达21根天线。这一设计基于直屏进行了重新优化,以平衡5G、4G、Wi-Fi、GPS以及NFC等众多信号需求。这使得vivoX100s成为了vivo有史以来信号接收能力最强的手机。新款手机还采用了独特的360°环绕设计,天线分布在机身周围。这一设计不仅增强了信号的强度,还针对日常各种握持姿势进行了优化,避免了因握持方式不当导

7月19日消息,小米MIXFold4首旗舰折叠新机今晚正式发布,首次搭载“立体异形电池”。据介绍,小米MIXFold4在电池技术上实现了重大突破,专为折叠屏设计了创新的“立体异形电池”。传统折叠屏设备多采用常规方形电池,空间利用效率较低。为解决这一问题,小米没有采用常见的卷绕式电芯,而是全新开发叠片工艺,打造全新形态的电池,大幅提升了空间利用率。电池技术创新为了实现精确交替堆叠正负极片,确保锂离子安全嵌入,小米开发了新型超声焊接机和叠片机,提高了焊接和裁切精
