日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法(6) -- heap

發(fā)布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法(6) -- heap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

binary heap就是一種complete binary tree(完全二叉樹)。也就是說,整棵binary tree除了最底層的葉節(jié)點之外,都是滿的。而最底層的葉節(jié)點由左至右又不得有空隙。

以上是一個對heap的簡單介紹。本文將用heap指代此種完全二叉樹。那么在實際編寫代碼的時候怎么組織這種數(shù)據(jù)呢,其實可以用array來存儲這種結構的數(shù)據(jù)。將數(shù)組的第0個元素保留不用,從第一個元素開始存放數(shù)據(jù)。那么,對于樹中的某個位于i的節(jié)點,其左子節(jié)點必然位于2i處,右子節(jié)點必然位于2i+1處,父節(jié)點必然位于“i/2”處。當然heap要能動態(tài)的改變大小,所以用vector存儲數(shù)據(jù)會更好。

這里還有一個小的細節(jié)需要注意一下,heap可以分為max-heap以及min-heap,前者每個節(jié)點的鍵值都大于或等于其子節(jié)點鍵值,后者的每個節(jié)點鍵值都小于或等于其子節(jié)點鍵值。可以推出,max-heap的最大鍵值在根節(jié)點,min-heap的最小鍵值在根節(jié)點。

綜上:heap就是一個包含了一組數(shù)據(jù)(通常可用array/vector來存儲)以及一組管理這些數(shù)據(jù)的算法(插入元素,刪除元素,取極值,將一組數(shù)據(jù)排列成一個heap)。通過這些方法可以保證heap的特性。

heap的算法

因為在c++ stl中并不直接提供heap這樣一種數(shù)據(jù)結構,但它卻是很多數(shù)據(jù)結構的基礎:例如優(yōu)先隊列。所以這里我們主要關注的是heap涉及到的一些算法。

push_heap

在很多書籍當中,通常通過一個上浮的操作來完成push_heap。其基本原理可見下圖(假設新加入的元素是50):

  • 將50插入到數(shù)組的末尾。
  • 將其于父元素相比較,發(fā)現(xiàn)24小于50,交換這兩個元素。上浮一次
  • 繼續(xù)上述操作直到找到一個合適的位置,也即其父元素大于50的位置,則上浮結束。
  • 一個簡易的c++實現(xiàn):

    template<typename T> void push_heap(std::vector<T> &vec, T value) {vec.push_back(value);int i = vec.size()-1;while (i > 1 && vec[i] > vec[i / 2]) {std::swap(vec[i], vec[i / 2]);i = i / 2;} }

    pop_heap

    pop操作是類似的:

  • 將最后一個元素與第一個元素(根元素)交換。
  • 刪除最后一個元素。
  • 將第一個元素/根元素下沉到一個合適的位置。注意下沉的時候是與子節(jié)點較大的那個元素交換。
  • 一個簡易的c++實現(xiàn):

    template<typename T> T pop_heap(std::vector<T> &vec) {int i = 1;//將最后元素與第一個元素(根元素)交換, 然后刪除最后一個元素std::swap(vec[1], vec[vec.size() - 1]);T v = vec[vec.size() - 1];vec.pop_back();//將現(xiàn)在的第一個元素/根元素下沉到一個合適的位置while (2 * i < vec.size()) {int j = 2 * i; //左子節(jié)點if (j < vec.size() - 1 && vec[j] < vec[j + 1]) j++;if (vec[j] < vec[i]) break;std::swap(vec[i], vec[j]);i = j;}return v; }

    sort_heap

    sort_heap是利用heap每次都取出極值(這里是max)的特性進行排序。那么只要進行n次pop_heap即可完成排序。

    template<typename T> void sort_heap(std::vector<T> &vec) {std::vector<T> temvec;int size = vec.size()-1;while (size != 0) {temvec.push_back(pop_heap(vec));size--;}for (T value : temvec) {vec.push_back(value);} }

    See you next time. Happy Coding!!!
    我的github

    轉載于:https://www.cnblogs.com/dnhua/p/10224731.html

    總結

    以上是生活随笔為你收集整理的数据结构与算法(6) -- heap的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。