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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

堆的操作的复杂度

發(fā)布時(shí)間:2024/1/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆的操作的复杂度 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

堆的兩種操作所花的時(shí)間都和樹的深度成正比.因此,如果一共有n個(gè)元素,那么每個(gè)操作可以在O(logn)時(shí)間內(nèi)完成.

堆的實(shí)現(xiàn)

1.左兒子的編號(hào)是自己的編號(hào)*2+1

2.右兒子的編號(hào)是自己的編號(hào)*2+1

?

push和pop的實(shí)現(xiàn):

1 int heap[MAX],sz=0; 2 3 void push(int x) 4 { 5 //自己節(jié)點(diǎn)的編號(hào) 6 int i=sz++; 7 8 while(i>0){ 9 //父親節(jié)點(diǎn)的編號(hào) 10 int p=(i-1)/2; 11 12 //如果已經(jīng)沒有大小顛倒則退出 13 if(heap[p]<=x) break; 14 15 //把父親節(jié)點(diǎn)的數(shù)值放下來,而把自己提上去 16 heap[i]=heap[p]; 17 i=p; 18 } 19 } 20 21 int pop() 22 { 23 //最小值 24 int ret=heap[0]; 25 26 //要提到根的數(shù)值 27 int x=heap[--sz]; 28 29 //從根開始向下交換 30 int i=0; 31 while(i*2+1<sz){ 32 //比較兒子的值 33 int a=i*2+1,n=i*2+2; 34 if(b<sz && heap[b]<heap[a]) a=b; 35 36 //如果已經(jīng)沒有大小顛倒則退出 37 if(heap[a]>=x) 38 break; 39 40 //把兒子的數(shù)組提上來 41 heap[i]=heap[a]; 42 i=a; 43 } 44 heap[i]=x; 45 return ret; 46 }

?

編程語(yǔ)言的標(biāo)準(zhǔn)庫(kù):

實(shí)際上,大部分情況并不需要自己實(shí)現(xiàn)堆.在許多編程語(yǔ)言的標(biāo)準(zhǔn)中,都包含了優(yōu)先隊(duì)列的高效實(shí)現(xiàn).例如在c++中,STL里的priority_queue就是其中之一.不過需要注意的是,priority_queue與上面講的優(yōu)先隊(duì)列有所不同,取出數(shù)值得到的是最大值.

?

1 #include <queue> 2 #include <cstdio> 3 using namespace std; 4 5 int main() 6 { 7 //聲明 8 priority_queue<int> p; 9 10 //插入元素 11 p.push(3); 12 p.push(5); 13 p.push(1); 14 15 //不斷循環(huán)直到空為止 16 while(!p.empty()){ 17 //獲取并刪除最大值 18 printf("%d\n",p.top()); 19 p.pop(); 20 } 21 return 0; 22 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/wangmengmeng/p/5244460.html

總結(jié)

以上是生活随笔為你收集整理的堆的操作的复杂度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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