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?MVC策略模式之MethodArgumentResolver源碼解析
這篇文章主要為大家介紹了Spring?MVC策略模式之MethodArgumentResolver源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

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

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

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

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

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

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