欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆

 更新時(shí)間:2022年02月18日 09:58:39   作者:我是小白呀  
二叉堆是一種特殊的堆,其實(shí)質(zhì)是完全二叉樹(shù)。二叉堆有兩種:最大堆和最小堆。最大堆是指父節(jié)點(diǎn)鍵值總是大于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值。而最小堆恰恰相反,指的是父節(jié)點(diǎn)鍵值總是小于任何一個(gè)子節(jié)點(diǎn)的鍵值

概述

從今天開(kāi)始, 小白我將帶大家開(kāi)啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.

優(yōu)先隊(duì)列

優(yōu)先隊(duì)列 (Priority Queue) 和隊(duì)列一樣, 是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu). 優(yōu)先隊(duì)列中的每個(gè)元素有各自的優(yōu)先級(jí), 優(yōu)先級(jí)最高的元素最先得到服務(wù). 如圖:

二叉堆

二叉堆 (Binary Heap) 是一種特殊的堆, 二叉堆具有堆的性質(zhì)和二叉樹(shù)的性質(zhì). 二叉堆中的任意一節(jié)點(diǎn)的值總是大于等于其孩子節(jié)點(diǎn)值. 如圖:

二叉堆實(shí)現(xiàn)

獲取索引

// 獲取父節(jié)點(diǎn)的索引值
public int parent(int index) {
    if (index <= 0) {
        throw new RuntimeException("Invalid Index");
    }

    return (index - 1) / 2;
}

// 獲取左孩子節(jié)點(diǎn)索引
public int leftChild(int index) {
    return index * 2 + 1;
}

// 獲取右孩子節(jié)點(diǎn)索引
public int rightChild(int index) {
    return index * 2 + 2;
}

添加元素

// 添加元素
public void add(E e) {
    data.add(e);
    siftUp(data.size() - 1);
}

siftUp

// siftDown
private void siftDown(int k) {
    while (leftChild(k) < data.size()) {
        int j = leftChild(k);
        if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
            j++;
        }
        if (data.get(k).compareTo(data.get(j)) >= 0) {
            break;
        }
        Collections.swap(data, k, j);
        k = j;
    }
}

完整代碼

import java.util.ArrayList;
import java.util.Collections;

public class BinaryHeap<E extends Comparable<E>> {

    private ArrayList<E> data;

    // 無(wú)參構(gòu)造
    public BinaryHeap() {
        data = new ArrayList<>();
    }

    // 有參構(gòu)造
    public BinaryHeap(int capacity) {
        data = new ArrayList<>(capacity);
    }

    // 或者元素個(gè)數(shù)
    public int size() {
        return data.size();
    }

    // 判斷堆是否為空
    public boolean isEmpty() {
        return data.isEmpty();
    }

    // 獲取父節(jié)點(diǎn)的索引值
    public int parent(int index) {
        if (index <= 0) {
            throw new RuntimeException("Invalid Index");
        }

        return (index - 1) / 2;
    }

    // 獲取左孩子節(jié)點(diǎn)索引
    public int leftChild(int index) {
        return index * 2 + 1;
    }

    // 獲取右孩子節(jié)點(diǎn)索引
    public int rightChild(int index) {
        return index * 2 + 2;
    }

    // 添加元素
    public void add(E e) {
        data.add(e);
        siftUp(data.size() - 1);
    }

    // siftUp
    private void siftUp(int k) {
        while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
            Collections.swap(data, k, parent(k));
            k = parent(k);
        }

    }

    // siftDown
    private void siftDown(int k) {
        while (leftChild(k) < data.size()) {
            int j = leftChild(k);
            if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
                j++;
            }
            if (data.get(k).compareTo(data.get(j)) >= 0) {
                break;
            }
            Collections.swap(data, k, j);
            k = j;
        }
    }
}

到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆的文章就介紹到這了,更多相關(guān)Java 二叉堆內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java讀取文件和寫(xiě)入文件的方式(簡(jiǎn)單實(shí)例)

    java讀取文件和寫(xiě)入文件的方式(簡(jiǎn)單實(shí)例)

    下面小編就為大家?guī)?lái)一篇java讀取文件和寫(xiě)入文件的方式(簡(jiǎn)單實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Java實(shí)現(xiàn)多個(gè)文檔合并輸出到一個(gè)文檔

    Java實(shí)現(xiàn)多個(gè)文檔合并輸出到一個(gè)文檔

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多個(gè)文檔合并輸出到一個(gè)文檔的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例

    java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例

    這篇文章主要介紹了java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java 按行讀取文件并輸出到控制臺(tái)的方法

    java 按行讀取文件并輸出到控制臺(tái)的方法

    今天小編就為大家分享一篇java 按行讀取文件并輸出到控制臺(tái)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解spring boot容器加載完后執(zhí)行特定操作

    詳解spring boot容器加載完后執(zhí)行特定操作

    這篇文章主要介紹了詳解spring boot容器加載完后執(zhí)行特定操作,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn)

    SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中Bean拷貝及工具類封裝的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • form表單回寫(xiě)技術(shù)java實(shí)現(xiàn)

    form表單回寫(xiě)技術(shù)java實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)form表單回寫(xiě)技術(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • 最新評(píng)論