加強堆(大根堆)

way:看上去好像就是加了個indexMap記錄節點在數組heap中的下標,然后就是可以查到某個元素是否在堆里并且可以進行位置的調整,普通的堆是沒法知道元素是不是在的,只能彈堆頂元素,插入到堆尾這樣子。如果覺得heapSize有點混淆的話,可以heapSize處理之后再去做操作,不用++,--搞得不明白。知道方法的實現過程就好啦,swap在交換時同步修改indexMap,remove把remove的元素和最后的交換,要remove的元素在最后,再調整在 i 位置處的end元素就可以了。heapInsert和heapify和普通堆相比都多了index參數。

成員: vector<Node *> heap, map<Node *, int> indexMap, int heapSize, comp對象比較函數(我沒用,可以根據情況看要不要)。

方法:構造,bool isEmpty,int size,bool contains,Node * top,void push(Node * node),Node * pop,void remove(Node * node),void resign(Node *node),void heapInsert(int index),void heapify(int index),void swap(int i, int j),vector<Node *> getAllElements。

#include<iostream>
#include<vector>
#include<map>
using namespace std;typedef int T;struct Node
{T val;Node(T val){this->val = val;}
};//這回不限制大小了哈哈哈
class MyMaxHeap
{
private:vector<Node*>heap;map<Node*, int>indexMap;int heapSize;public:MyMaxHeap(){heapSize=0;}bool isEmpty(){return heapSize==0;}int size(){return heapSize;}bool contains(Node *node){return indexMap.count(node)>0;}Node *top(){if(isEmpty()) return nullptr;return heap[0];}void push(Node *node){heap.push_back(node);heapSize++;indexMap[node]= heapSize-1;heapInsert(heapSize-1);}//這個swap函數在交換的同時把indexMap也悄悄的交換了void swap(int i, int j){Node *a = heap[i];Node *b = heap[j];indexMap[a]=j;indexMap[b]=i;heap[i]=b;heap[j]=a;}void heapInsert(int index){//從index位置開始向上浮動int fa = (index-1)/2;while(heap[index]->val > heap[fa]->val){swap(index, fa);index = fa;fa = (index-1)/2;}}Node *pop(){//要刪除堆頂的元素Node *del = heap[0];//最后一個元素//Node *end = heap[heapSize-1];//交換之后要刪除的數在堆尾,堆尾的元素在0位置處待處理swap(0, heapSize-1);//先處理要刪除的元素heap.pop_back();indexMap.erase(del);heapSize--;//再處理在0位置的元素heapify(0);return del;}void heapify(int index){int left = 2*index+1;//從index位置開始往下沉while(left < heapSize){int maxChild = (left+1<heapSize && heap[left+1]->val > heap[left]->val)? left+1:left;if(heap[index]->val > heap[maxChild]->val){break;}swap(index, maxChild);index = maxChild;left = 2*index+1;}}void remove(Node *node){Node *end = heap[heapSize-1];int i = indexMap[node];//交換要移除的元素和最后一個元素的位置swap(i, heapSize-1);//此時要移除的元素在最后,最后一個元素在i位置上//處理要移除的元素heap.pop_back();indexMap.erase(node);heapSize--;//處理在i位置上的元素resign(end);}void resign(Node *node){int index = indexMap[node];//可能往上浮heapInsert(index);//也可能往下沉heapify(index);}vector<Node *>getAllElements(){return heap;}
};int main()
{MyMaxHeap heap;vector<Node*>nodes;nodes.push_back(new Node(1));nodes.push_back(new Node(2));nodes.push_back(new Node(3));nodes.push_back(new Node(4));nodes.push_back(new Node(5));nodes.push_back(new Node(6));for(auto node:nodes){heap.push(node);}cout<<"堆頂元素是"<<endl;cout<<heap.top()->val<<endl;cout<<"移除元素6"<<endl;heap.remove(nodes[5]);cout<<"堆頂元素是"<<endl;cout<<heap.top()->val<<endl;cout<<"移除元素5"<<endl;heap.remove(nodes[4]);cout<<"堆頂元素是"<<endl;cout<<heap.top()->val<<endl;system("pause");return 0;
}

?可以和普通大根堆對比著看實現過程。手寫堆(大根堆)-CSDN博客

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

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

相關文章

PCIE協議-4-物理層邏輯模塊

4.1 簡介 物理層將事務層和數據鏈路層與用于鏈路數據交換的信令技術隔離開來。物理層被劃分為邏輯物理層和電氣物理層子模塊&#xff08;見圖4-1&#xff09;。 4.2 邏輯物理層子模塊 邏輯子模塊有兩個主要部分&#xff1a;一個發送部分&#xff0c;它準備從數據鏈路層傳遞過…

Spring 中常用的手動裝載 bean 方法

在 Spring 的 bean 裝載條件中&#xff0c;雖然 Spring 給我們提供了非常好用便捷的 Condition 相關注解&#xff0c;但是很多時候 Condition 相關注解并不滿足我們的需求&#xff0c;我需要更復雜的條件手動控制是否裝置 bean。這個時候我們就可以實現 Spring 為我們提供的幾個…

域名DNS添加CAA記錄

目錄 概述 檢測CAA記錄 添加CAA記錄 概述 DNS CAA(Certificate Authority Authorization)記錄是一種不太常見的DNS記錄類型,它主要用于鎖定證書頒發機構(CA)列表,以確保只有特定的CA可以為某個域名頒發SSL/TLS證書。CAA記錄是保護域名免受釣魚攻擊的安全措施,通過限制…

v-md-editor和SSE實現ChatGPT的打字機式輸出

概述 不論是GPT還是文心一言&#xff0c;在回答的時候類似于打字機式的將答案呈現給我們&#xff0c;這樣的交互一方面比較友好&#xff0c;另一方面&#xff0c;當答案比較多、生成比較慢的時候也能爭取一些答案的生成時間。本文后端使用express和stream&#xff0c;使用SSE將…

Boosting Cache Performance by Access Time Measurements——論文泛讀

TOC 2023 Paper 論文閱讀筆記整理 問題 大多數現代系統利用緩存來減少平均數據訪問時間并優化其性能。當緩存未命中的訪問時間不同時&#xff0c;最大化緩存命中率與最小化平均訪問時間不同。例如&#xff1a;系統使用多種不同存儲介質時&#xff0c;不同存儲介質訪問時間不同…

【C++初階】—— 類和對象 (上)

&#x1f4dd;個人主頁&#x1f339;&#xff1a;EterNity_TiMe_ ?收錄專欄?&#xff1a;C “ 登神長階 ” &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 類和對象 1. 初步認識C2. 類的引入3. 類的定義聲明和定義全部放在類體中聲明和定義分開存放 4.…

8個實用網站和軟件,收藏起來一定不后悔~

整理了8個日常生活中經常能用得到的網站和軟件&#xff0c;收藏起來一定不會后悔~ 1.ZLibrary zh.zlibrary-be.se/這個網站收錄了超千萬的書籍和文章資源&#xff0c;國內外的各種電子書資源都可以在這里搜索&#xff0c;98%以上都可以在網站內找到&#xff0c;并且支持免費下…

Android系統的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh&#xff08;MirBSD Korn Shell&#xff09;環境的啟動腳本。mksh 是 Android 默認使用的 shell&#xff0c;在 shell 啟動時會讀取并執行這個文件中的配置。以下是關于 /etc/mkshrc 文件的詳細信息及其用途。 /etc/mkshrc 文件的作用 環境配…

sql server專題實驗4 復雜查詢

SQL Server 是微軟開發的數據庫管理系統&#xff0c;它支持復雜的查詢操作&#xff0c;允許用戶從數據庫中檢索、分析和處理數據。在進行復雜查詢時&#xff0c;通常會用到以下幾種SQL語句和概念&#xff1a; 連接&#xff08;Join&#xff09;: INNER JOIN&#xff1a;只返回兩…

設計模式--備忘錄模式

備忘錄模式是一種行為設計模式&#xff0c;它用于在不破壞封裝的前提下&#xff0c;保存一個對象的內部狀態&#xff0c;以便以后可以恢復到這個狀態。這種模式在許多應用場景中非常有用&#xff0c;例如在實現撤銷操作、保存游戲進度、恢復文件備份以及保持工作狀態等。 備忘…

linux中ansible整理筆記

一、工作模式 1. adhoc臨時命令 語法&#xff1a; ansible 主機或者組列表 -m 模塊 -a “參數” 2. playbook 語法&#xff1a; ansible-playbook xxx.yml 二、模塊 1. ping 2.command:默認模塊&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:類似com…

IP地址顯示“不安全”怎么辦|已解決

解決IP地址顯示“不安全”的問題&#xff0c;通常需要確保網站或服務使用HTTPS協議進行加密通信&#xff0c;可以通過部署SSL證書來解決&#xff0c;以下是具體的解決步驟&#xff1a; 1 申請IP地址SSL證書&#xff1a;網站管理員應向證書頒發機構&#xff08;CA&#xff09;申…

網絡拓撲—WEB-IIS服務搭建

文章目錄 WEB-IIS服務搭建網絡拓撲配置網絡IISPC 安裝IIS服務配置IIS服務&#xff08;默認站點&#xff09;PC機訪問網頁 配置IIS服務&#xff08;新建站點&#xff09;PC機訪問網頁 WEB-IIS服務搭建 網絡拓撲 //交換機忽略不計 IIS服務IP&#xff1a;192.168.1.1 PC機IP&…

人類交互2 聽覺處理和語言中樞

人類聽覺概述 人類聽覺是指通過耳朵接收聲音并將其轉化為神經信號&#xff0c;從而使我們能夠感知和理解聲音信息的能力。聽覺是人類五種感覺之一&#xff0c;對我們的日常生活和交流至關重要。 聽覺是人類交流和溝通的重要工具。通過聽覺&#xff0c;我們能夠聽到他人的語言…

安裝錯誤提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打開autoremove&#xff0c;系統檢查&#xff0c;點擊開始檢查。檢查完成修復。 可以解決部分該問題&#xff0c;如果沒解決的請咨詢

Linux中的文件描述符

1.系統調用接口和庫函數的關系 函數&#xff1a;fopen fclose fread fwrite 都是c標準庫當中的函數&#xff0c;也就是用戶操作接口中ibc系統調用&#xff1a;open close read write 都是系統調用提供的接口 c語言中接口底層封裝的都是系統調用接口 FILE* stdin stdout stderr…

[POI2008] STA-Station/洛谷P3478(樹形dp)

[ P O I 2008 ] S T A ? S t a t i o n ( 樹形 d p ) \Huge{[POI2008] STA-Station(樹形dp)} [POI2008]STA?Station(樹形dp) 題目鏈接&#xff1a;[P3478 POI2008] STA-Station - 洛谷 文章目錄 題意思路標程 題意 給定一個 n n n個點的樹&#xff0c;請求出一個結點&#…

js無感刪除url搜索部分,不刷新頁面

如&#xff1a;把下面的網址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 網站標題, location.origin)

TikTok越獄檢測之二 <調試器檢測>

來了&#xff0c;調試器檢測。總結如下,多多指教: 檢測app 是否被附加調試: 原理就是檢測父進程是否 launchd啟動&#xff0c;在OS X和iOS 系統中&#xff0c;用戶環境始于launchd&#xff0c;為用戶態出現的第一個進程&#xff0c;為所有的進程的祖先&#xff0c;launchd 的進…

Python模塊、包和異常處理

大家好&#xff0c;在當今軟件開發領域&#xff0c;Python作為一種簡潔、易讀且功能強大的編程語言&#xff0c;被廣泛應用于各種領域。作為一名測試開發工程師&#xff0c;熟練掌握Python的模塊、包和異常處理是提高代碼可維護性和錯誤處理能力的關鍵。本文將和大家一起探討Py…