資料結構 堆的實現以及STL標準庫

2021-08-28 19:50:29 字數 1855 閱讀 4981

資料結構——堆的實現以及stl標準庫

堆說的清新脫俗一點就是用類似完全二叉樹的方式來維護一組資料,增刪改查的時間複雜度在o(1)~o(logn)之間,一聽就很心動吧:)

堆大致分為兩類:大根堆和小根堆,簡單來說就是根節點是所有資料中最大/小,並且讓小的節點在上方。

給一組資料

當然,現在這還只是個二叉樹:)

然後介紹幾個堆的基本操作

上浮,下沉,插入,彈出。

以下**以小根堆為例。

1 上浮

從上圖可以看出,這組沒有被處理的資料中,根節點的元素7不是最小的,並且可以看出,他的左子節點上的元素2更適合在根節點,那麼直接交換不就可以了?

可接下來就會發現,元素2的左子節點上的元素1更適合在根節點,這個時候就無法直接與根節點交換,這就需要上浮:

過程如下:

}2 下沉

在這次上浮之後,我們可以看到雖然元素1到了根節點,但元素7和元素2的位置還有問題,這個時候,讓我們換一種方式,用下沉。

過程如下:

3 插入

我們前面用的插入是直接插入,所以資料才會雜亂無章,那麼我們如何在插入的時候進行維護堆呢?

仔細一想,在插入的時候插到最後一位,在進行上浮!

void push(int x)

4 彈出

彈出就是從堆頂去掉,這樣不就全亂套了?

仔細一想,先把堆頂和堆尾的元素進行交換,再把堆頂下沉:)

void pop()

然後..

....

....

..就是最最最方便的stl啦!

堆的應用在stl中需要用到vector

首先是存入

for(int i=1;i<=n;i++)

然後要用到#include algorithm

make_heap(a.begin(),a.end(),cmp);
這一行就是建立乙個堆:)

cmp則是根據大小根堆來寫,和快排類似,不同的是小根堆的cmp是這麼寫的

bool cmp(int x,int y)

沒錯,小根堆的中是大於號

之後往堆中插入資料則是和存入類似

a.push_back(x);

push_heap(a.begin(),a.end(),cmp);

推出則是

pop_heap(a.begin(),a.end(),cmp);

a.pop_back();

資料結構 堆的實現以及簡單的函式

堆是什麼?剛接觸到這個概念估計都摸不著頭腦,不知道堆是什麼樣個東西。簡單介紹下,堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。堆結構的二叉樹儲存有兩種情況 1 最大堆 每個父節點的都大於孩子節點。2 最小堆 每個父節點的都小於孩子節點。舉個例子可能好理解些,看下面 熟悉了它的結構,給解釋...

hashmap底層實現以及資料結構

hashmap實現原理 簡單一句話陣列鍊錶結構儲存,這裡entry是map中的靜態類,entry陣列預設長度為16,每個陣列上跟著乙個鍊錶,鍊錶什麼時候出現呢?就是在hashcode相同時出現,當put時候會生成乙個hashcode便於儲存位置,但是不避免hashcode相同的情況這個時候就存在鍊錶...

堆的基本實現以及堆排序

heap.h pragma once include include include include include includetypedef int hpdatatype typedef struct heap heap void heapcreat heap hp,hpdatatype a,...