golang鏈式堆 用來獲取極大值或者極小值

2021-10-23 17:30:24 字數 1858 閱讀 2598

如何構建乙個大根堆

有乙個需求:有千億個資料,需要求得最大值,應該怎麼做

打: 這當然不能用陣列,如果用陣列的話,需要先把所有資料讀到記憶體中,然後在比較。記憶體沒有那麼大。

也不能乙個個從磁碟中讀取資料,因為非常耗費磁碟io。 我們可以使用鏈式堆來做

package main

import

"fmt"

// 假設沒有重複的資料,假設需要插入的資料全部是int型別

type linkednode struct

left *linkednode

right *linkednode

depth int

}func

newlinkheap

(data inte***ce)(

*linkednode)

func

mergesort

(l *linkednode, h *linkednode)

(*linkednode)

else

l.depth = l.right.depth +1}

return l

}func

merge

(n *linkednode, h *linkednode)

(*linkednode)

else

if(h ==

nil)

else

else}}

func

insertdata

(data inte***ce

, h *linkednode)

(*linkednode)

func

printheap

(h *linkednode)

printheap

(h.left)

printheap

(h.right)

fmt.

print

(h.data ,

" , ")}

func

deletemin

(h *linkednode)

(*linkednode,

inte***ce

)else

}func

main()

過程如下:【取得最小值】

1、初始化乙個節點,作為原始堆

2、插入2

3、插入1

4、插入0:同上

5、插入4

6、插入5

6、插入6

7、刪除當前最小值。

思考 【目的:構建乙個最小堆】

為什麼mergesort函式中h1的左節點為空,就直接把h2作為當前節點的左節點。

完全二叉樹的深度 = 右子樹的深度 + 1. 因此如果右子樹有元素插入,就要重新計算一遍當前子樹深度大小。

因為堆是完全二叉樹,完全二叉樹的左子樹深度一定比右子樹大,因此如果右子樹深度大於左子樹,那麼交換兩者位置。

ps:堆一定是乙個完全二叉樹

golang 函式用例

golang函式是不支援巢狀 但是可以使用匿名函式實現巢狀 預設引數 過載,但支援 以下是一些基本用法示例 一般用法,無返回值 func funcname1 input1 type1 多引數,乙個返回值 func funcname2 input1 type1,input2 type2 output1...

用陣列實現堆

一 簡單了解堆 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k21 1 且 ki k2i 2 ki k2i 1 且 ki k2i 2 i 0,1,2.則稱為小堆 或大堆 將根結點最大的堆叫做最大堆或大根堆,根結點最小的堆叫做最小堆或小根堆。堆...

用堆實現優先佇列

堆的性質 1.乙個是他是乙個陣列 當然你也可以真的用鍊錶來做。2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize 2個。3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i 2,他的左孩子結點就是i 2,右孩子結點就是i 2 1,如果下標從0開始,要...