Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆
概述
從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.

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

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

二叉堆實現(xiàn)
獲取索引
// 獲取父節(jié)點的索引值
public int parent(int index) {
if (index <= 0) {
throw new RuntimeException("Invalid Index");
}
return (index - 1) / 2;
}
// 獲取左孩子節(jié)點索引
public int leftChild(int index) {
return index * 2 + 1;
}
// 獲取右孩子節(jié)點索引
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;
// 無參構(gòu)造
public BinaryHeap() {
data = new ArrayList<>();
}
// 有參構(gòu)造
public BinaryHeap(int capacity) {
data = new ArrayList<>(capacity);
}
// 或者元素個數(shù)
public int size() {
return data.size();
}
// 判斷堆是否為空
public boolean isEmpty() {
return data.isEmpty();
}
// 獲取父節(jié)點的索引值
public int parent(int index) {
if (index <= 0) {
throw new RuntimeException("Invalid Index");
}
return (index - 1) / 2;
}
// 獲取左孩子節(jié)點索引
public int leftChild(int index) {
return index * 2 + 1;
}
// 獲取右孩子節(jié)點索引
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)圖文詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)
- 深入了解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)-堆實現(xiàn)優(yōu)先隊列
- java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實例
- Java?超詳細講解數(shù)據(jù)結(jié)構(gòu)中的堆的應(yīng)用
相關(guān)文章
Spring?MVC策略模式之MethodArgumentResolver源碼解析
這篇文章主要為大家介紹了Spring?MVC策略模式之MethodArgumentResolver源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
詳解spring boot容器加載完后執(zhí)行特定操作
SpringBoot中Bean拷貝及工具類封裝的實現(xiàn)

