參考部落格1:資料結構:堆(heap)
參考部落格2:**資料結構堆的各種操作與演算法,程式設計師必備基礎資料結構 (簡單介紹)
參考部落格3:資料結構-堆(heap)
在後台開發人員的面試中,有這麼乙個經典的題目,我們有一堆定時任務,每個任務都有執行時間,這堆定時任務還有可能會不停的增加,要求我們設計乙個資料結構與演算法來實現,這個題目的經典答案,就是優先佇列,那麼優先佇列的原理是什麼呢?優先佇列的底層原理是乙個基礎資料結構,叫做堆(heap),資料結構的堆跟記憶體堆疊的堆不是一回事。
我們直接開門見山,資料結構中堆(heap)是什麼東西呢?這裡,通常,我們講的堆(heap)都是二叉堆,堆是一顆完全二叉樹,如果乙個堆的深度為h,那麼從第一層開始有1個節點,第二層有2個節點,第三層有4個節點,直到第h-1層有2^(h-2)個節點。我們把下圖這種父節點小於子節點的堆稱之為小根堆,反之,父節點都大於子節點的堆稱之為大根堆。
資料結構堆(heap)的最大作用就是用來排序!我們以小根堆為例(以下操作均已小根堆為例),查詢小根堆裡面最小的元素,直接取第乙個元素即可,演算法時間複雜度為o(1)。我們需要注意的是,乙個堆如果要刪除某個元素,只支援刪除最頂部的元素!在堆裡面,左兒子跟右兒子大小是不確定的,這個是二叉堆跟二叉排序樹的乙個區別(在資料結構二叉排序樹中,左兒子《本身《右兒子。後面我們再來介紹下二叉排序樹)。在堆中,刪除頭部元素稱之為pop,那麼堆裡面刪除乙個元素的演算法是什麼樣子的呢。我們先把最底層,最右邊的元素,移到第乙個元素,然後跟兩個兒子比較大小,與較小的兒子交換位置因為17比65,32都小,所以把32跟17交換位置。
重複上面的演算法,將32與23,45一起比較大小,23是三者之中最小,再次交換位置
重複上面的演算法,將32與53進行比較,發現大小一致,不用變化
所以,我們可以把堆的pop操作演算法總結如下:跟最後乙個元素交換,從樹根開始,比較兒子節點,與最小的交換,直到沒有兒子或者比兒子更小,演算法複雜度為o(logn)。在堆中,插入乙個元素是什麼樣子的呢?我們先把元素插到堆的末尾,每次都與父親節點進行比較,如果比父親比它小,就跟他交換位置例如下圖,我們新增乙個元素22,它先跟自己的父親節點32進行比較。
重複上述演算法,22再與23進行比較,隨後交換位置
最後我們又得到新的小根堆,每次插入乙個演算法的時間複雜度為o(logn)
堆的操作就是這麼簡單,支援3種操作,堆頂元素,彈出堆頂元素pop,插入新的元素insert。演算法與資料結構,需要不停地練習,才能夠熟練掌握,
資料結構與演算法之美學習筆記 第二十八講
對於每個節點的值都大於等於子樹中每個節點值的堆 對於每個節點的值都小於等於子樹中每個節點值的堆 從圖中我們可以看到 1 陣列中下標為 i 的節點的左子節點,就是下標為 i 2 的節點,2 右子節點就是下標為 i 2 1 的節點,父節點就是下標為 i2 的節點。1 堆化 2 從下往上的堆化方法 讓新插...
二十八 python3 之random
1 隨機小數 import random print random.random 隨機大於0 且小於1 之間的小數 0.9441832228391154 print random.uniform 0,9 隨機乙個大於0小於9的小數 結果 7.646583891572416 2 隨機整數 print ...
C核心技術手冊(二十八)
4.1.5.3 有符號整型轉換 整型型別轉換中超過目標型別取值範圍的問題,不僅存在在無符型別轉換中,也存在有符號型別轉換中,例如,當乙個值由型別 long 或unsigned int 轉換為int 結果為有符號整型並溢位,這與轉換為無符號整數不同,後者將會丟棄執行結果。絕大多數編譯會丟棄原來值二進位...