日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构之堆Heap

發(fā)布時(shí)間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之堆Heap 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 概述

堆(也叫優(yōu)先隊(duì)列),是一棵完全二叉樹,它的特點(diǎn)是父節(jié)點(diǎn)的值大于(小于)兩個(gè)子節(jié)點(diǎn)的值(分別稱為大頂堆和小頂堆)。它常用于管理算法執(zhí)行過(guò)程中的信息,應(yīng)用場(chǎng)景包括堆排序,優(yōu)先隊(duì)列等。

2. 堆的基本操作

堆是一棵完全二叉樹,高度為O(lg n),其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,先介紹幾個(gè)基本術(shù)語(yǔ):

A:用于表示堆的數(shù)組,下標(biāo)從1開始,一直到n

PARENT(t):節(jié)點(diǎn)t的父節(jié)點(diǎn),即floor(t/2)

RIGHT(t):節(jié)點(diǎn)t的左孩子節(jié)點(diǎn),即:2*t

LEFT(t):節(jié)點(diǎn)t的右孩子節(jié)點(diǎn),即:2*t+1

HEAP_SIZE(A):堆A當(dāng)前的元素?cái)?shù)目

下面給出其主要的四個(gè)操作(以大頂堆為例):

2.1 Heapify(A,n,t)

該操作主要用于維持堆的基本性質(zhì)。假定以RIGHT(t)和LEFT(t)為根的子樹都已經(jīng)是堆,然后調(diào)整以t為根的子樹,使之成為堆。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 void Heapify(int A[], int n, int t) { ??int left = LEFT(t); ??int right = RIGHT(t); ??int max = t; ??if(left <= n)???? max = A[left] > A[max] ? left : max; ??if(right <= n)???? max = A[right] > A[max] ? right : max; ??if(max != A[t]) ??{ ????swap(A, max, t); ????Heapify(A, n, max); ??} }

2.2? BuildHeap(A,n)

該操作主要是將數(shù)組A轉(zhuǎn)化成一個(gè)大頂堆。思想是,先找到堆的最后一個(gè)非葉子節(jié)點(diǎn)(即為第n/2個(gè)節(jié)點(diǎn)),然后從該節(jié)點(diǎn)開始,從后往前逐個(gè)調(diào)整每個(gè)子樹,使之稱為堆,最終整個(gè)數(shù)組便是一個(gè)堆。

1 2 3 4 5 6 7 8 9 10 11 void BuildHeap(int A[], int n) { ??int i; ??for(i = n/2; i<=n; i++) ??Heapify(A, n, i); }

2.3 GetMaximum(A,n)

該操作主要是獲取堆中最大的元素,同時(shí)保持堆的基本性質(zhì)。堆的最大元素即為第一個(gè)元素,將其保存下來(lái),同時(shí)將最后一個(gè)元素放到A[1]位置,之后從上往下調(diào)整A,使之成為一個(gè)堆。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void GetMaximum(int A[], int n) { ??int max = A[1]; ??A[1] = A[n]; ??n--; ??Heapify(A, n, 1); ??return max; }

2.4? Insert(A, n, t)

向堆中添加一個(gè)元素t,同時(shí)保持堆的性質(zhì)。算法思想是,將t放到A的最后,然后從該元素開始,自下向上調(diào)整,直至A成為一個(gè)大頂堆。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 void Insert(int A[], int n, int t) { ??n++; ??A[n] = t; ??int p = n; ??while(p >1 && A[PARENT(p)] < t) ??{ ????A[p] = A[PARENT(p)]; ????p = PARENT(p); ??} ??A[p] = t; ??return max; }

3.? 堆的應(yīng)用

3.1? 堆排序

堆的最常見(jiàn)應(yīng)用是堆排序,時(shí)間復(fù)雜度為O(N lg N)。如果是從小到大排序,用大頂堆;從大到小排序,用小頂堆。

3.2? 在O(n lg k)時(shí)間內(nèi),將k個(gè)排序表合并成一個(gè)排序表,n為所有有序表中元素個(gè)數(shù)。

【解析】取前100 萬(wàn)個(gè)整數(shù),構(gòu)造成了一棵數(shù)組方式存儲(chǔ)的具有小頂堆,然后接著依次取下一個(gè)整數(shù),如果它大于最小元素亦即堆頂元素,則將其賦予堆頂元素,然后用Heapify調(diào)整整個(gè)堆,如此下去,則最后留在堆中的100萬(wàn)個(gè)整數(shù)即為所求 100萬(wàn)個(gè)數(shù)字。該方法可大大節(jié)約內(nèi)存。

3.3 一個(gè)文件中包含了1億個(gè)隨機(jī)整數(shù),如何快速的找到最大(小)的100萬(wàn)個(gè)數(shù)字?(時(shí)間復(fù)雜度:O(n lg k))

4. 總結(jié)

堆是一種非?;A(chǔ)但很實(shí)用的數(shù)據(jù)結(jié)構(gòu),很多復(fù)雜算法或者數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)就是堆,因而,了解和掌握堆這種數(shù)據(jù)結(jié)構(gòu)顯得尤為重要。

5. 參考資料

(1)經(jīng)典算法教程《算法導(dǎo)論》

———————————————————————————————

更多關(guān)于數(shù)據(jù)結(jié)構(gòu)和算法的介紹,請(qǐng)查看:數(shù)據(jù)結(jié)構(gòu)與算法匯總

———————————————————————————————-

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:?轉(zhuǎn)載自董的博客

本文鏈接地址:?http://dongxicheng.org/structure/heap/

總結(jié)

以上是生活随笔為你收集整理的数据结构之堆Heap的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。