二叉堆在jdk中的應用

2021-10-07 22:10:11 字數 1077 閱讀 6534

二叉堆最核心的操作是上浮和下沉。   

上浮是新增元素到隊尾元素,然後經過與上一級節點比較,將隊尾元素變動到合適的位置。

下沉是頭結點元素,跟左右葉子節點比較,下沉到合適位置。

簡單的**實現:

public static void buildupheap(int arr) 

} public static void builddownheap(int arr)

} public static void downadjust(int arr, int parentinx, int length)

if (temp <= arr[childinx])

// 單邊賦值

arr[parentinx] = arr[childinx];

parentinx = childinx;

childinx = childinx * 2 + 1;

} arr[parentinx] = temp;

} public static void upadjust(int arr, int childinx)

arr[childinx] = temp;

}

1.   delayedworkqueue

這個是在scheduledthreadpoolexecutor執行緒池排程執行器裡面,任務可延遲佇列的實現。內部存在siftup siftdown

2. priorityqueue  priorityblockingqueue

2個優先順序佇列, 這邊不說明了

3. taskqueue

taskqueue 是早期定時任務timer中佇列的實現方法。內部存在 fixup  fixdown 

上述幾個對列,內部都是以二叉堆的方式實現的。雖然方法名稱不太一樣,但是實現邏輯大同小異。

1)比如topk問題。 從一億資料中找出排名前10的資料, 這個可以使用最小堆實現

2)堆排序, 二叉堆本身就是乙個有序的近似完全二叉堆

3)資料量小的場景。因為二叉堆,內部通過陣列實現。 如果父節點位置為n, 那麼子節點為2*n+1, 2*n+2, 如果n比較大,那麼很浪費儲存空間

二叉堆的應用

有乙個無序陣列,要求你找出陣列中第k大的元素。給定的無序陣列如下 75 153172 202419 128如果 k 6,也就是要尋找第6大的元素,這個元素是哪乙個呢?顯然,陣列中第一大的元素是24,第二大的元素是20,第三大的元素是17 第6大的元素是9。75 153172 202419 12843...

二叉樹應用 堆

本例中實現了最小堆的構造 插入 刪除。最小堆表示乙個非終端節點均不大於其左右孩子節點。最小堆用完全二叉樹表示,但是二叉樹存入一維陣列中。將完全二叉樹存入陣列,有一些性質。先將二叉樹從上到下,從左到右給每個節點編號0,1.n。那個乙個節點編號i,他的左孩子編號為2 i 1,右孩子編號2 i 2。完全二...

二叉堆的實現

include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...