Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆
概述
從今天開(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)文章希望大家以后多多支持腳本之家!
- Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)圖文詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)
- 深入了解Java數(shù)據(jù)結(jié)構(gòu)和算法之堆
- Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析
- Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用
- java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
- java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實(shí)例
- Java?超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的堆的應(yīng)用
相關(guān)文章
Spring Boot 添加MySQL數(shù)據(jù)庫(kù)及JPA實(shí)例
本篇文章主要介紹了Spring Boot 添加MySQL數(shù)據(jù)庫(kù)及JPA,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
kafka內(nèi)外網(wǎng)訪問(wèn)配置方式
這篇文章主要介紹了kafka內(nèi)外網(wǎng)訪問(wèn)配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
深入解析Java類加載的案例與實(shí)戰(zhàn)教程
本篇文章主要介紹Tomcat類加載器架構(gòu),以及基于類加載和字節(jié)碼相關(guān)知識(shí),去分析動(dòng)態(tài)代理的原理,對(duì)Java類加載相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05
使用spring的websocket創(chuàng)建通信服務(wù)的示例代碼
這篇文章主要介紹了使用spring的websocket創(chuàng)建通信服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
logback整合rabbitmq實(shí)現(xiàn)消息記錄日志的配置
這篇文章主要介紹了logback整合rabbitmq實(shí)現(xiàn)消息記錄日志的配置,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
Java如何調(diào)用wsdl的webservice接口
這篇文章主要介紹了Java如何調(diào)用wsdl的webservice接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringData如何通過(guò)@Query注解支持JPA語(yǔ)句和原生SQL語(yǔ)句
這篇文章主要介紹了SpringData如何通過(guò)@Query注解支持JPA語(yǔ)句和原生SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Maven 多模塊父子工程的實(shí)現(xiàn)(含Spring Boot示例)
這篇文章主要介紹了Maven 多模塊父子工程的實(shí)現(xiàn)(含Spring Boot示例),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
spring aop之@AfterReturning不生效問(wèn)題及解決
這篇文章主要介紹了spring aop之@AfterReturning不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

