首頁 Java java教程 關於演算法設計與分析基之堆的範例

關於演算法設計與分析基之堆的範例

Jul 24, 2017 pm 01:17 PM
分析 基礎 設計

以陣列來存放堆疊資料

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

首發899元 中興5G隨身Wi-Fi U50S開賣:最高網速500Mbps 首發899元 中興5G隨身Wi-Fi U50S開賣:最高網速500Mbps Apr 26, 2024 pm 03:46 PM

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,輕鬆滿

復古潮流! HMD與喜力聯合推出翻蓋手機:透明外殼設計 復古潮流! HMD與喜力聯合推出翻蓋手機:透明外殼設計 Apr 17, 2024 pm 06:50 PM

4月17日消息,HMD攜手知名啤酒品牌喜力以及創意公司Bodega,聯袂推出了一款獨特的翻蓋手機-無聊手機(TheBoringPhone)。這款手機不僅在設計上充滿新意,更在功能上返璞歸真,旨在引領人們回歸真實的人際交往,享受與朋友暢飲的純粹時光。無聊手機採用了獨特的透明翻蓋設計,展現出簡約而不失優雅的美感。其內部配備了2.8英寸QVGA顯示屏,外部則是一塊1.77英寸的顯示屏,為用戶提供了基本的視覺交互體驗。在攝影方面,雖然僅搭載了30萬畫素的鏡頭,但足以應付日常的簡

榮耀Magic V3首發AI離焦護眼技術:有效緩和近視發展 榮耀Magic V3首發AI離焦護眼技術:有效緩和近視發展 Jul 18, 2024 am 09:27 AM

7月12日消息,榮耀MagicV3系列今日正式發布,搭載全新榮耀視力舒緩綠洲護眼屏,在屏幕本身俱備高規格和高素質的同時,還開創性的引入AI主動式護眼技術。據悉,傳統的緩解近視的方式是“近視鏡”,近視眼鏡度數均勻分佈,保證了視線中心區域成像在視網膜之上,但周邊區域成像在視網膜後,視網膜感應到成像在後,促進眼軸向後生長,從而使度數加深。目前主要的緩解近視發展的方式之一是“離焦鏡”,其中心區域度數正常,週邊區域透過光學設計分區調整,從而使周邊區域成像落在視網膜前,

台電M50 Mini小平板來了:8.7吋IPS螢幕、5000mAh電池 台電M50 Mini小平板來了:8.7吋IPS螢幕、5000mAh電池 Apr 04, 2024 am 08:31 AM

4月3日消息,台電即將推出的M50Mini平板電腦是一款功能豐富、效能強大的裝置。這款8吋小平板新品搭載了8.7吋的IPS螢幕,為用戶提供了出色的視覺體驗。其金屬機身設計不僅美觀,也增強了設備的耐用性。在性能方面,M50Mini搭載了紫光展銳T606八核心處理器,擁有兩個A75核心和六個A55核心,確保了流暢且高效的運作體驗。同時,該平板還配備了6GB+128GB的儲存方案,並支援8GB記憶體擴展,滿足了用戶對於儲存和多任務處理的需求。在續航上,M50Mini配備了5000mAh的電池,支援Ty

ppt結束頁如何設計才夠吸引人 ppt結束頁如何設計才夠吸引人 Mar 20, 2024 pm 12:30 PM

在工作中,ppt是職場人士常使用的辦公室軟體。一個完整的ppt必須有一個好的結束頁。不同的職業要求賦予不同的ppt製作特色。關於結束頁的製作,如何才能設計的比較吸引人呢?下邊我們一起看一看,如何設計ppt結束頁吧! ppt結束頁的設計可以在文字和動畫方面進行一些調整,根據需要選擇簡潔或炫目的風格。接下來,我們將重點放在如何透過創新的表達方式來打造出符合要求的ppt結束頁。那我們就開始今天的教學吧。 1.對於結束頁的製作上,使用圖片中的任何文字都可以,結束頁重要的是表示我的簡報結束了。 2、除了這些文字,

vivo訊號最強手機! vivo X100s搭載寰宇訊號放大系統:21天線、360°環繞設計 vivo訊號最強手機! vivo X100s搭載寰宇訊號放大系統:21天線、360°環繞設計 Jun 03, 2024 pm 08:41 PM

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

1399元起 榮耀X60i手機開售:視覺四等邊OLED直屏 1399元起 榮耀X60i手機開售:視覺四等邊OLED直屏 Jul 29, 2024 pm 08:25 PM

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

全新堆疊工藝!小米MIX Fold 4首搭金沙江「立體異型」電池 全新堆疊工藝!小米MIX Fold 4首搭金沙江「立體異型」電池 Jul 20, 2024 am 03:20 AM

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

See all articles