關於演算法設計與分析基之堆的範例
以陣列來存放堆疊資料
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脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++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、除了這些文字,

5月13日消息,vivoX100s今晚正式發布,除了出色的影像,新機在訊號方面表現也十分強悍。根據vivo官方介紹,vivoX100s採用了創新的寰宇訊號放大系統,該系統配備了高達21根天線。這項設計基於直屏進行了重新優化,以平衡5G、4G、Wi-Fi、GPS以及NFC等眾多訊號需求。這使得vivoX100s成為了vivo有史以來訊號接收能力最強的手機。新款手機還採用了獨特的360°環繞設計,天線分佈在機身周圍。這項設計不僅增強了訊號的強度,還針對日常各種握持姿勢進行了優化,避免了因握持方式不當導

7月29日消息,榮耀X60i手機今日正式開售,先發1,399元。設計上,榮耀X60i手機採用居中挖孔直屏設計,四邊近乎無界的超窄邊框,大大拓寬了視野邊界。榮耀X60i參數顯示器:6.7吋高清顯示器電池:5000mAh大容量電池處理器:天璣6080處理器(台積電6nm,2x2.4G的A76+6×2G的A55)系統:MagicOS8.0系統其他功能: 5G訊號增強靈動膠囊螢幕下指紋雙MIC降噪知識問答攝影能力:後置雙攝系統:5000萬像素主攝200萬像素輔助鏡頭前置自拍鏡頭:800萬像素價格:8GB

7月19日消息,小米MIXFold4首旗艦折疊新機今晚正式發布,首次搭載「立體異形電池」。據介紹,小米MIXFold4在電池技術上實現了重大突破,專為折疊螢幕設計了創新的「立體異形電池」。傳統折疊式螢幕設備多採用常規方形電池,空間利用效率較低。為解決此問題,小米沒有採用常見的捲繞式電芯,而是全新開發疊片製程,打造全新形態的電池,大幅提升了空間利用率。電池技術創新為了實現精確交替堆疊正負極片,確保鋰離子安全嵌入,小米開發了新型超音波焊接機和疊片機,提高了焊接和裁切精
