最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)堆算法的使用示例

 更新時間:2023年12月13日 10:42:29   作者:小筱在線  
本文主要介紹了Java實現(xiàn)堆算法的使用示例,Java中提供了一個Heap類,可以用來實現(xiàn)堆的操作,可以實現(xiàn)如插入、刪除、獲取最大最小值等,具有一定的參考價值,感興趣的可以了解一下

堆是一種特殊的數據結構,它是一棵完全二叉樹,且滿足堆的性質:對于每個節(jié)點,它的值都不小于(或不大于)它的孩子節(jié)點的值。根節(jié)點的值就是堆中的最大值(或最小值)。

Java中提供了一個Heap類,可以用來實現(xiàn)堆的操作。Heap類是一個抽象類,它定義了堆的基本操作方法,如插入、刪除、獲取最大(或最?。┲档?。

要使用Heap類,需要創(chuàng)建一個具體的實現(xiàn)類,例如MaxHeap和MinHeap。這些類繼承自Heap類,并實現(xiàn)了具體的插入、刪除、獲取最大(或最?。┲档确椒?。下面我們以MaxHeap為例,來詳細介紹如何實現(xiàn)堆。

MaxHeap的實現(xiàn)思路如下:

  • 定義一個數組來保存堆的元素,數組下標從1開始。

  • 定義一個變量來記錄堆中元素的數量。

  • 實現(xiàn)插入方法:新元素插入到數組最后,然后使用上濾操作將新元素沿著路徑向上移動,直到堆的性質被滿足。

  • 實現(xiàn)刪除方法:移除堆頂元素(數組下標為1的元素),然后將數組最后一個元素替換到堆頂,使用下濾操作將新元素沿著路徑向下移動,直到堆的性質被滿足。

  • 實現(xiàn)獲取最大值方法:直接返回堆頂元素。

  • 實現(xiàn)堆排序方法:依次取出堆頂元素,將其放到一個新的數組中,然后重新調整堆。

以下是MaxHeap的代碼實現(xiàn):

public class MaxHeap<T extends Comparable<T>> {
    private T[] heap; // 堆元素數組
    private int size; // 堆元素數量

    @SuppressWarnings("unchecked")
    public MaxHeap(int capacity) {
        heap = (T[]) new Comparable[capacity + 1]; // 數組下標從1開始
        size = 0;
    }

    public void insert(T value) {
        if (size == heap.length - 1) {
            resize();
        }

        heap[++size] = value; // 新元素插入到數組最后
        swim(size); // 上濾操作
    }

    public T deleteMax() {
        if (size == 0) {
            throw new NoSuchElementException();
        }

        T max = heap[1]; // 堆頂元素
        heap[1] = heap[size--]; // 將數組最后一個元素替換到堆頂
        sink(1); // 下濾操作
        heap[size + 1] = null; // 釋放舊的堆頂元素

        return max;
    }

    public T getMax() {
        if (size == 0) {
            throw new NoSuchElementException();
        }

        return heap[1];
    }

    public void heapSort(T[] arr) {
        heapify(arr); // 初始化堆
        for (int i = size; i > 0; i--) {
            arr[i - 1] = deleteMax(); // 依次取出堆頂元素
        }
    }

    private void swim(int k) {
        while (k > 1 && heap[k].compareTo(heap[k / 2]) > 0) { // 父節(jié)點小于當前節(jié)點,上濾
            swap(k, k / 2);
            k /= 2; // 移動到父節(jié)點
        }
    }

    private void sink(int k) {
        while (2 * k <= size) { // 如果有左孩子
            int j = 2 * k;
            if (j < size && heap[j].compareTo(heap[j + 1]) < 0) { // 選擇左右孩子中較大的那個
                j++;
            }

            if (heap[k].compareTo(heap[j]) >= 0) { // 如果父節(jié)點不小于孩子節(jié)點,下濾結束
                break;
            }

            swap(k, j); // 父節(jié)點和子節(jié)點交換
            k = j; // 移動到子節(jié)點
        }
    }

    private void heapify(T[] arr) {
        heap = (T[]) new Comparable[arr.length + 1];
        size = arr.length;

        System.arraycopy(arr, 0, heap, 1, arr.length); // 復制數組元素到堆中

        for (int i = size / 2; i >= 1; i--) { // 倒序下濾,從最后一個非葉子節(jié)點開始
            sink(i); // 下濾操作
        }
    }

    private void resize() {
        int newSize = heap.length * 2;
        heap = Arrays.copyOf(heap, newSize);
    }

    private void swap(int i, int j) {
        T temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }
}

上面的代碼實現(xiàn)了MaxHeap類,它支持插入、刪除、獲取最大值和堆排序等操作。堆排序的實現(xiàn)就是先將數組元素初始化成一個堆,然后依次取出堆頂元素,進行排序。

MaxHeap類中使用了泛型,可以存儲任意類型的元素,只要實現(xiàn)了Comparable接口。使用時,可以像下面這樣創(chuàng)建一個MaxHeap對象,然后調用其方法進行操作:

MaxHeap<Integer> maxHeap = new MaxHeap<>(10);
maxHeap.insert(3);
maxHeap.insert(1);
maxHeap.insert(4);
maxHeap.insert(1);
maxHeap.insert(5);
System.out.println(maxHeap.deleteMax()); // 輸出:5
System.out.println(maxHeap.getMax()); // 輸出:4

Integer[] arr = {3, 1, 4, 1, 5};
maxHeap.heapSort(arr);
System.out.println(Arrays.toString(arr)); // 輸出:[1, 1, 3, 4, 5]

總的來說,實現(xiàn)堆的關鍵在于實現(xiàn)上濾和下濾操作。上濾操作用于插入新元素時,將其從葉子節(jié)點沿著路徑向上移動,下濾操作用于刪除堆頂元素時,將最后一個元素從根節(jié)點沿著路徑向下移動,維護堆的性質。堆排序的實現(xiàn)就是先將數組初始化成一個堆,然后依次取出堆頂元素,進行排序。最后,需要注意的是,在Java中實現(xiàn)堆可以使用Heap類,但也可以自己實現(xiàn)一個堆類,可以根據具體需求進行設計和優(yōu)化。

到此這篇關于Java實現(xiàn)堆算法的使用示例的文章就介紹到這了,更多相關Java 堆算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 新手場景Java線程相關問題及解決方案

    新手場景Java線程相關問題及解決方案

    這篇文章主要介紹了新手場景Java線程相關問題及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 解決springboot+shiro+thymeleaf頁面級元素的權限控制問題

    解決springboot+shiro+thymeleaf頁面級元素的權限控制問題

    這篇文章主要介紹了解決springboot+shiro+thymeleaf頁面級元素的權限控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 內存屏障由來及實現(xiàn)思路

    內存屏障由來及實現(xiàn)思路

    這篇文章主要為大家詳細介紹了內存屏障由來及實現(xiàn)思路的詳細講解,讓大家徹底的理解內存屏障,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • 使用Pinyin4j進行拼音分詞的方法

    使用Pinyin4j進行拼音分詞的方法

    下面小編就為大家分享一篇使用Pinyin4j進行拼音分詞的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • springboot無法加載yml配置文件的解決方案

    springboot無法加載yml配置文件的解決方案

    在Spring?Boot項目中,嘗試加載yml配置文件時遇到問題,通過一系列排查步驟發(fā)現(xiàn)配置文件未被打包到jar文件中,導致無法加載,添加`spring-boot-maven-plugin`依賴后,配置文件被打包,問題解決
    2024-12-12
  • Java 詳解包裝類Integer與int有哪些共通和不同

    Java 詳解包裝類Integer與int有哪些共通和不同

    這篇文章主要介紹的是 Java中int和Integer的區(qū)別,Java 是一種強數據類型的語言,因此所有的屬性必須有一個數據類型,下面文章基于Java詳細int和Integer有何區(qū)別,需要的朋友可以參考一下
    2022-04-04
  • Java取整與四舍五入

    Java取整與四舍五入

    本文詳細講解了Java取整與四舍五入,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • 詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么

    詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么

    這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • SpringBoot?實現(xiàn)微信推送模板的示例代碼

    SpringBoot?實現(xiàn)微信推送模板的示例代碼

    這篇文章主要介紹了SpringBoot?實現(xiàn)微信推送模板,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • springboot Quartz動態(tài)修改cron表達式的方法

    springboot Quartz動態(tài)修改cron表達式的方法

    這篇文章主要介紹了springboot Quartz動態(tài)修改cron表達式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09

最新評論

道孚县| 明星| 瓦房店市| 南丰县| 平定县| 漾濞| 汝南县| 娄烦县| 喀喇| 涿州市| 清徐县| 炉霍县| 勐海县| 双桥区| 滦平县| 舟曲县| 浠水县| 昌宁县| 黑龙江省| 安吉县| 综艺| 广元市| 江山市| 屏东市| 广河县| 松滋市| 博白县| 济阳县| 贡觉县| 曲阳县| 察雅县| 马关县| 福州市| 韩城市| 法库县| 诸暨市| 汪清县| 金平| 米易县| 民和| 龙山县|