【手寫大跟堆詳解】

文章目錄

  • 大跟堆介紹
  • 大跟堆的結構
  • 大跟堆的應用場景
  • 大跟堆的代碼實現

大跟堆介紹

大根堆(Max Heap)是一種特殊的二叉樹結構,它滿足以下兩個條件:
1.完全二叉樹:大根堆是一棵完全二叉樹,即除了最后一層外,其余每一層的節點都是滿的,最后一層的節點都集中在最左邊。
2.堆性質:每個節點的值都大于或等于其子節點的值。
大根堆的典型操作包括插入,獲取root節點的最大值。
在這里插入圖片描述

大跟堆的結構

大根堆的結構
大根堆可以用數組來表示,因為它是一棵完全二叉樹。對于一個存儲在數組中的大根堆:
根節點的索引為 0。
給定一個節點的索引位置i:
父節點的索引為 (i - 1) / 2。
左子節點的索引為 2 * i + 1。
右子節點的索引為 2 * i + 2。

大跟堆的應用場景

大根堆(Max Heap)在許多算法和應用中都有重要的作用,特別是在需要頻繁訪問最大元素的場景中。以下是一些常見的應用場景:

  1. 優先隊列
    優先隊列是一種特殊的隊列,每次出隊的元素都是隊列中優先級最高的元素。大根堆可以用來實現優先隊列,其中堆頂元素始終是優先級最高的元素。
    應用舉例:
    操作系統的任務調度:調度器選擇優先級最高的任務進行執行。
    網絡數據包處理:路由器處理優先級最高的數據包。
  2. 堆排序
    堆排序是一種利用堆數據結構設計的排序算法。其基本思想是將待排序序列構建成一個大根堆,此時整個序列的最大值即為堆頂元素。將堆頂元素移出堆(與堆的最后一個元素交換),然后對剩余元素重新構建堆,反復執行上述操作,直到所有元素有序。
    應用舉例:
    大數據集的排序:在需要對大量數據進行排序時,堆排序的空間效率較高。
  3. 動態數據流中的最大值
    在處理動態數據流時,使用大根堆可以實時維護當前數據流中的最大值。
    應用舉例:
    股票交易系統:實時維護當前交易中的最大交易量。
    傳感器數據監控:實時監控傳感器數據流中的最大值。
  4. 找到第 K 大的元素
    在一個無序數組中查找第 K 大的元素,可以使用大根堆來實現。首先構建一個包含數組中前 K 個元素的大根堆,然后遍歷數組剩余元素,如果當前元素小于堆頂元素,則替換堆頂元素并調整堆,最終堆頂元素即為第 K 大的元素。
    應用舉例:
    排名系統:在一組分數中找到第 K 高的分數。
    數據分析:在一組數據中找到第 K 大的數據點。
  5. 合并多個有序序列
    在合并多個有序序列時,可以使用大根堆來保持當前最小元素的順序。將每個序列的首元素插入大根堆,然后每次取出堆頂元素并插入其所在序列的下一個元素,直到所有元素都被處理完畢。
    應用舉例:
    外部排序:當數據量大到無法全部放入內存時,可以先將數據分塊排序,然后合并多個有序塊。
    多路歸并排序:將多個有序的輸入流合并為一個有序的輸出流。
  6. 圖的最短路徑算法(如 Dijkstra 算法)
    在 Dijkstra 算法中,需要使用優先隊列來選擇當前未訪問節點中距離起點最近的節點。大根堆可以用來實現這個優先隊列,以保證每次都能高效地選擇最短路徑的下一步節點。
    應用舉例:
    地圖導航系統:計算從一個地點到另一個地點的最短路徑。
    網絡路由優化:尋找數據包在網絡中傳輸的最優路徑。
  7. 事件驅動模擬
    在事件驅動的模擬系統中,需要按照事件的發生時間順序來處理事件。使用大根堆可以有效地管理和調度這些事件。
    應用舉例:
    離散事件模擬:如模擬交通流、制造過程等。
    計算機圖形學:處理動畫中事件的時間調度。

大跟堆的代碼實現

插入操作:
插入新元素時,將元素添加到數組的末尾(完全二叉樹的最后一個位置),然后進行“上浮”操作(也稱為堆化)以恢復堆的性質。
上浮操作:
將新元素與其父節點比較,如果大于父節點,則交換位置,繼續向上比較,直到元素小于或等于父節點,或者到達根節點。

public void insert(int key) {if (size == capacity) {throw new RuntimeException("Heap is full");}heap[size] = key; // 將新元素放在堆尾int current = size;size++;// 上浮操作while (current != 0 && heap[parent(current)] < heap[current]) {swap(parent(current), current);current = parent(current);}
}

2.刪除最大值操作:
刪除最大值(根節點)時,將數組的最后一個元素移動到根節點位置,然后進行“下沉”操作(也稱為堆化)以恢復堆的性質。
下沉操作:
將根節點與其左右子節點比較,如果小于其中一個子節點,則與較大的子節點交換位置,繼續向下比較,直到元素大于或等于子節點,或者到達葉節點。

public int extractMax() {if (size <= 0) {throw new RuntimeException("Heap is empty");}int root = heap[0]; // 保存根節點heap[0] = heap[size - 1]; // 將最后一個元素移到根節點位置size--;// 下沉操作maxHeapify(0);return root;
}private void maxHeapify(int i) {int largest = i;int left = leftChild(i);int right = rightChild(i);if (left < size && heap[left] > heap[largest]) {largest = left;}if (right < size && heap[right] > heap[largest]) {largest = right;}if (largest != i) {swap(i, largest);maxHeapify(largest);}
}

3.交換元素:
在堆的操作過程中,經常需要交換兩個節點的位置。

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

4.完整的大根堆實現
以下是大根堆的完整實現,包括構造函數、插入操作、刪除最大值操作和輔助方法。

public class MaxHeap {private int[] heap;private int size;private int capacity;// 構造函數public MaxHeap(int capacity) {this.capacity = capacity;this.heap = new int[capacity];this.size = 0;}// 獲取父節點索引private int parent(int i) { return (i - 1) / 2; }// 獲取左子節點索引private int leftChild(int i) { return 2 * i + 1; }// 獲取右子節點索引private int rightChild(int i) { return 2 * i + 2; }// 插入新元素public void insert(int key) {if (size == capacity) {throw new RuntimeException("Heap is full");}heap[size] = key; // 將新元素放在堆尾int current = size;size++;// 上浮操作while (current != 0 && heap[parent(current)] < heap[current]) {swap(parent(current), current);current = parent(current);}}// 提取最大元素(根節點)public int extractMax() {if (size <= 0) {throw new RuntimeException("Heap is empty");}int root = heap[0]; // 保存根節點heap[0] = heap[size - 1]; // 將最后一個元素移到根節點位置size--;// 下沉操作maxHeapify(0);return root;}// 下沉操作private void maxHeapify(int i) {int largest = i;int left = leftChild(i);int right = rightChild(i);if (left < size && heap[left] > heap[largest]) {largest = left;}if (right < size && heap[right] > heap[largest]) {largest = right;}if (largest != i) {swap(i, largest);maxHeapify(largest);}}// 交換元素private void swap(int i, int j) {int temp = heap[i];heap[i] = heap[j];heap[j] = temp;}// 主函數示例public static void main(String[] args) {MaxHeap maxHeap = new MaxHeap(10);maxHeap.insert(3);maxHeap.insert(1);maxHeap.insert(4);maxHeap.insert(1);maxHeap.insert(5);maxHeap.insert(9);maxHeap.insert(2);maxHeap.insert(6);maxHeap.insert(5);System.out.println("Extracted max: " + maxHeap.extractMax());System.out.println("Extracted max: " + maxHeap.extractMax());System.out.println("Extracted max: " + maxHeap.extractMax());}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13572.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一分鐘快速排序

這個 quick_sort 函數是一個實現快速排序&#xff08;Quicksort&#xff09;算法的遞歸函數。快速排序是一種高效的排序算法&#xff0c;通常用于對大規模數據集進行排序。以下是對該函數的詳細解釋&#xff1a; 函數簽名 void quick_sort(int q[], int l, int r)q[]&#xf…

Qt_電腦wifi相關操作

項目描述: 在做項目時用到了獲取wifi的操作。在網上查找了好久資料,這里做一些總結。 這里有顯示當前電腦wifi連接狀態,列出wifi列表,連接斷開wifi等函數。歡迎大家留言添加文章內容。 使用范圍: windows電腦(中文的環境) 使用技術:windows的cmd命令。和對字符串的解析…

C語言學習筆記--運算符與表達式(7521字爆肝)

上午好&#xff0c;本來想上午改簡歷下午學習c語言的&#xff0c;但想了一下上午精力充沛還是用來學習比較好&#xff0c;雖然現在失業了&#xff0c;但住在我姨家有吃有住的&#xff0c;再次感謝我姨&#xff0c;我要抓緊時間修改簡歷&#xff0c;然后找個工作搬出去&#xff…

【回憶版】數據科學思維與大數據智能分析 2024考試

填空&#xff08;18分&#xff09;18個 1.對數變換對大數值的范圍進行壓縮&#xff0c;對小數值的范圍進行擴展 2.提取出大量高頻率項與低頻率項相關聯的虛假模式&#xff0c;即交叉支持&#xff08;cross-support&#xff09;模式 3.信息論中&#xff08;&#xff09; 4.幾種…

[數據集][目標檢測]彈簧上料檢測數據集VOC+YOLO格式142張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;142 標注數量(xml文件個數)&#xff1a;142 標注數量(txt文件個數)&#xff1a;142 標注類別…

yolov8訓練自己數據集時出現loss值為nan。

具體原因目前暫未尋找到。 解決辦法 將參數amp改成False即可。 相關資料&#xff1a; https://zhuanlan.zhihu.com/p/165152789 https://github.com/ultralytics/ultralytics/issues/1148

【BUG】Edge|聯想電腦 Bing 搜索報錯“Ref A: 亂碼、 Ref B:亂碼、Ref C: 日期” 的解決辦法

文章目錄 省流版前言解決辦法 詳細解釋版前言問題描述與排查過程解決辦法與總結 省流版 前言 我也不清楚咋滴了&#xff0c;Bing 搜索突然偶爾報錯&#xff1a; 換了代理關了插件都報錯。 參考&#xff1a; 我在用bing搜索時出現了如下代碼&#xff0c;導致bing無法使用&am…

nginx proxy_set_header詳解

proxy_set_header 是 Nginx 配置中的一個重要指令&#xff0c;特別是在使用 Nginx 作為反向代理時。該指令允許你修改由 Nginx 傳遞給代理后端的請求頭。這對于確保后端應用程序能夠接收到正確的客戶端信息&#xff08;如 IP 地址、主機名等&#xff09;以及控制緩存行為等場景…

1 計算機硬件-CPU-校驗碼-存儲系統-輸入輸出設備-總線結構

計算機硬件 考情分析&#xff1a;趨勢很小&#xff0c;22年考過&#xff0c;根據趨勢以后考的可能較小 基本組成&#xff1a;運算器&#xff0c;控制器&#xff0c;儲存器&#xff0c;輸入設備&#xff0c;輸出設備運算器和控制器也統稱為中央處理單元&#xff08;CPU&#xf…

【算法訓練 day37 檸檬水找零、長度最小的子數組、用最少數量的箭引爆氣球】

目錄 一、檸檬水找零-LeetCode 860思路實現代碼個人問題總結 二、根據身高重建隊列-LeetCode 406思路實現代碼個人問題總結 三.用最少數量的箭引爆氣球-LeeCode 406思路實現代碼個人問題總結 一、檸檬水找零-LeetCode 860 Leecode鏈接: leetcode 860 文章鏈接: 代碼隨想錄 視頻…

解鎖Nginx跨域謎題:3步打造安全高效的CORS策略

Nginx作為一款強大的Web服務器和反向代理服務器&#xff0c;經常被用于處理跨域資源共享&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;策略&#xff0c;以允許或限制不同源之間的資源請求。CORS是一種安全策略&#xff0c;用于決定Web瀏覽器是否應允…

深度學習——圖像分類(CNN)—測試模型

測試模型 1.導入必要的庫2.加載測試數據集3.假設CSV文件中的圖像文件名是完整的路徑4.隨機選擇一張圖片進行展示5.加載圖像6.使用模型進行預測7.設置模型的預測結果8.計算準確率9.指定test文件夾路徑10.讀取名為image_path的圖片11.加載圖像12.檢查圖像是否為空 訓練的模型是上…

eNSP學習——OSPF單區域配置

目錄 相關命令 實驗背景 實驗目的 實驗步驟 實驗拓撲 實驗編址 實驗步驟 1、基礎配置 2、部署單區域OSPF網絡 3、檢查OSPF單區域的配置結果 OSPF——開放式最短路徑優先 基于鏈路狀態的協議&#xff0c;具有收斂快、路由無環、擴展性好等優點&#xff1b; 相關命令 […

【JAVA基礎之內部類】匿名內部類

&#x1f525;作者主頁&#xff1a;小林同學的學習筆錄 &#x1f525;小林同學的專欄&#xff1a;JAVA之基礎專欄 目錄 1.內部類 1.1 概述 1.1.1 什么是內部類 1.1.2 什么時候使用內部類 1.2 內部類的分類 1.3 成員內部類 1.3.1 獲取成員內部類對象的兩種方式 1.3.2 經典面試…

用C語言把一棵普通二叉樹安排得明明白白

1. 樹的相關術語 結點的度&#xff1a;一個結點含有的子樹的個數稱為該結點的度&#xff1b; 如上圖&#xff1a;A的為6 葉結點或終端結點&#xff1a;度為0的結點稱為葉結點&#xff1b; 如上圖&#xff1a;B、C、H、I...等結點為葉結點 非終端結點或分支結點&#xff1a;度不…

【Linux】-Tomcat安裝部署[12]

目錄 簡介 安裝 安裝部署JDK環境 解壓并安裝Tomcat 簡介 Tomcat是由Apache開發的一個Servlet容器&#xff0c;實現了對Servlet和JSP的支持&#xff0c;并提供了作為Web服務器的一些特有功能&#xff0c;如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。 簡單來說&#…

使用 mysql-binlog-connector 監聽處理 MySQLBinlog 文件

1. 需求概述 業務開發中經常需要根據一些數據變更實現相對應的操作。例如&#xff0c;一些用戶注銷自己的賬戶&#xff0c;系統可以給用戶自動發短信確認&#xff0c;這時有兩種解決方案&#xff0c;一種是耦合到業務系統中&#xff0c;當用戶執行注銷操作的時候&#xff0c;執…

【軟件工程】【23.10】p2

關鍵字&#xff1a; 軟件復用技術、過程途徑、特定需求是文檔核心、數據字典條目、高內聚低耦合獨立性、數據流圖映射模塊結構圖、UML依賴、用例圖關系、RUB迭代、程序規格說明等價類劃分、有效性測試的目標、噴泉模型面向對象、軟件驗證過程、CMMI

算法提高之程序自動分析

算法提高之程序自動分析 核心思想&#xff1a;并查集 離散化 因為不是每個數都會用到 所以離散化一下**(不需要保留順序)**對于每一個值為1的等式 優先處理之后處理值為0的等式時 若ab已經連在一起 即為矛盾 #include <iostream>#include <cstring>#include &l…

【Linux】Centos7安裝RabbitMQ

【Linux】Centos7安裝RabbitMQ 下載 從 rabbitmq 的 GitHub 倉庫下載 https://github.com/rabbitmq/rabbitmq-server/releases rabbitmq 是 erlang 語言編寫的&#xff0c;需要先安裝 erlang https://github.com/rabbitmq/erlang-rpm/releases 安裝 使用rz命令上傳 erlang 和 …