資料結構——堆的實現以及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,...