国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法??

?? 博客內容:【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法

?? 作??者:陳大大陳

?? 個人簡介:一個正在努力學技術的準前端,專注基礎和實戰(zhàn)分享 ,歡迎私信!

?? 歡迎大家:這里是CSDN,我總結知識和寫筆記的地方,喜歡的話請三連,有問題請私信 ?? ?? ??

目錄

向上調整

向上調整建堆?

向下調整?

?向下調整建堆

兩種方法的天壤之別?

總結一下

堆排序?

向上調整

void AdjustUp(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{	
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			 break;
		}
	}
}

向上調整建堆?

	for (int i = 1; i < n; i++)
	{
		AdjustUp(a, i);
	}

向下調整?

void AdjustDown(HPDataType* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child+1< n && a[child + 1] > a[child])
		{
			child++;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}

	}
}

?向下調整建堆

for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

兩種方法的天壤之別?

這兩個建堆方法看似相同,實際卻有著天壤之別。

具體的數(shù)值我們可以計算一下。

【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法

如圖,二叉樹的第h層有2^(h-1)個節(jié)點。

?向下調整建堆最壞的情況就是每個節(jié)點都需要調整。

第一層有1個節(jié)點,最壞的情況是每個節(jié)點向下移動n-1層,次數(shù)就是1*(n-1)次。

第二層有2個節(jié)點,最壞的情況是每個節(jié)點向下移動n-2層,次數(shù)就是2*(n-2)次。

以此類推。。。

第n-2層有2^(n-3)個節(jié)點,最壞的情況是每個節(jié)點向下移動兩層,次數(shù)就是2^(n-3)次.

第n-1層有2^(n-2)個節(jié)點,最壞的情況是每個節(jié)點向下移動一層,次數(shù)就是2^(n-2)次。

總共的計算次數(shù)就是f(h)=2^0*(n-1)+2^1*(n-2)+……+2^(h-3)*2+2*(n-2)*1次

這個數(shù)字我們可以用錯位相減法計算出來。

最后得到的結果F(h)= 2^h?-1 - h。

假設樹的節(jié)點有N個。

那么根據(jù)公式,2 ^?h - 1= N。

把表達式往N上湊。

就得到F(N) = N - log(N+1)。

向下調整建堆的時間復雜度也就得出來了,log(N+1)的大小基本可忽略。

所以向下調整的時間復雜度是o(N)左右。

再來看向上調整建堆。

向上調整就沒有這么優(yōu)秀了。

【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法?假設樹的高度是h,二叉樹的最后一層就占了一半的節(jié)點。

?我們仍舊按最壞的情況來算。

最后一層的每個節(jié)點都需要向上調整h-1次,光最后一層調整的次數(shù)就已經有2^(h-1)*(h-1)次了。

光看這一層可以看出差距。

上一條講的向下調整的特點是節(jié)點多的層級調整的次數(shù)少,是少乘多。

而現(xiàn)在講的向上調整恰恰相反。

節(jié)點多的層級調整的次數(shù)多,是多乘多,這就造成了時間復雜度的巨大差異。

同樣來計算一下。

假設高度為h。

F(h)=2^1*1+2^2*2+……+2^(h-2)*h-2+2^(h-1)*(h-1)

同樣使用錯位相減,解得F(h) = 2^h * (h-2) + 2

因為 N =?2^h-1。

我們將F(h)換成關于N的式子,F(xiàn)(N) = (N+1) * (log(N+1) -2 ) + 2 。??

同樣是忽略掉不重要的數(shù)據(jù),它的時間復雜度大概是O(N*logN)。它的量級比向下調整大了很多

所以一般情況下,我們建堆一般是用向下調整。

總結一下

建堆——向下調整建堆——時間復雜度:O(N)

建堆——向上調整建堆——時間復雜度:O(N*logN)

時間復雜度上向下調整建堆優(yōu)秀很多,我們建堆一般就使用它。

堆排序?

void HeapSort(int* a, int n)
{
	、

	//向下調整建堆
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}
//向下排序
	while (end>0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a,end, 0);
		--end;
	}
}
  • 將待排序序列構造成一個大堆
  • 此時,整個序列的最大值就是堆頂?shù)母?jié)點。
  • 將其與末尾元素進行交換,此時末尾就為最大值。
  • 然后將剩余n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反復執(zhí)行,便能得到一個有序序列了。
  • 可以看到在構建大頂堆的過程中,元素的個數(shù)逐漸減少,最后就得到一個有序序列了
  • 向下排序和上面向上調整建堆很像,時間復雜度都可以認為是O(N*logN)。

【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法文章來源地址http://www.zghlxwxcb.cn/news/detail-463315.html

到了這里,關于【數(shù)據(jù)結構】向上調整建堆和向下調整建堆的天壤之別以及堆排序算法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結構:堆和堆排序

    數(shù)據(jù)結構:堆和堆排序

    1.順序結構 順序結構存儲就是使用數(shù)組來表示一棵二叉樹 , 一般使用數(shù)組只適合表示完全二叉樹 ,因為不是完全二叉樹會有空間的浪費。而 現(xiàn)實使用中只有堆才會使用數(shù)組來存儲 。 二叉樹順序存儲在物理上是一個數(shù)組,在邏輯上是一顆二叉樹。 2.鏈式結構 二叉樹的鏈式存

    2024年01月17日
    瀏覽(22)
  • 數(shù)據(jù)結構(三)堆和哈希表

    數(shù)據(jù)結構(三)堆和哈希表

    本文是在原本數(shù)據(jù)結構與算法闖關的基礎上總結得來,加入了自己的理解和部分習題講解 原活動鏈接 邀請碼: JL57F5 哈希表存儲的是由鍵(key)和值(value)組成的數(shù)據(jù)。例如,我們將每個人的性別作為數(shù)據(jù)進行存儲,鍵為人名,值為對應的性別, 一般來說,我們可以把鍵當成

    2024年01月17日
    瀏覽(13)
  • 【數(shù)據(jù)結構】5.大根堆和左高樹

    【數(shù)據(jù)結構】5.大根堆和左高樹

    大根樹: 樹中的每一個節(jié)點的值都大于或等于其子節(jié)點的值 大根堆: 既是大根樹又是完全二叉樹(增加了完全二叉樹的限制條件)所以下圖中只有(a)和(c)是大根堆 假設在下面大根堆中插入一個元素9,插入步驟如下,時間復雜度為O(height)=O(logn) 嘗試插入在6號位置,如果新的

    2024年02月08日
    瀏覽(13)
  • 數(shù)據(jù)結構:堆的實現(xiàn)與建堆時間復雜度分析

    數(shù)據(jù)結構:堆的實現(xiàn)與建堆時間復雜度分析

    目錄 前言 一.堆的介紹 1.堆的本質 2.堆的分類 二.堆的實現(xiàn)(以小根堆為例) 1.關于二叉樹的兩組重要結論: 2.堆的物理存儲結構框架(動態(tài)數(shù)組的簡單構建) 3. 堆元素插入接口(以小根堆為例) 堆尾元素向上調整的算法接口: 4.堆元素插入接口測試 5.堆元素插入接口建堆的時間復雜

    2023年04月19日
    瀏覽(17)
  • 【數(shù)據(jù)結構】深度剖析最優(yōu)建堆及堆的經典應用 - 堆排列與topk問題

    【數(shù)據(jù)結構】深度剖析最優(yōu)建堆及堆的經典應用 - 堆排列與topk問題

    ?? 紙上得來終覺淺, 絕知此事要躬行。 ??主頁:June-Frost ??專欄:數(shù)據(jù)結構 ??該文章分別探討了向上建堆和向下建堆的復雜度和一些堆的經典應用 - 堆排列與topk問題。 ??該文章內的思想需要用到實現(xiàn)堆結構的一些思想(如向上調整和向下調整等),可以在另一篇文章

    2024年02月08日
    瀏覽(20)
  • 通脹向下,價格向上

    通脹向下,價格向上

    號外: 教鏈內參2.10《內參:BTC真的存在春節(jié)模式嗎?》 9號,美國勞工統(tǒng)計局BLS對1月份發(fā)布的2023年12月份通脹月環(huán)比數(shù)據(jù)進行了修訂,下修了0.1%,從0.3%下調為0.2%。更騷氣的是,還把前值也就是11月的數(shù)據(jù)給上修了0.1%,從0.1%上調為0.2%。 這樣一來,通脹數(shù)據(jù)就從穩(wěn)步上升變

    2024年02月22日
    瀏覽(25)
  • 數(shù)據(jù)結構之平衡二叉樹的平衡調整

    數(shù)據(jù)結構之平衡二叉樹的平衡調整

    1:LL型調整 2:RR型調整 3:LR型調整 4:RL型調整 5:總結 作者約定:將導致不平衡的結點稱作 被破壞者 ,破壞了結點的平衡的結點成為 破壞者 ,經過調整可以讓該樹平衡的結點稱為 調整結點 。 LL型不平衡調整方法:以調整結點為中心,進行右旋操作,就可以使樹平衡。

    2024年02月09日
    瀏覽(24)
  • 多態(tài)的轉型分為向上轉型和向下轉型

    Java中,多態(tài)指的是同一行為,具有多個不同表現(xiàn)形式。通過多態(tài),可以消除類之間的耦合關系,提高程序的可擴展性和可維護性。但多態(tài)在調用方法時,父類中如果沒有該方法,會出現(xiàn)編譯錯誤。也就是說,如果沒有進行類型轉換,不能調用子類擁有,而父類沒有的方法。編

    2024年02月02日
    瀏覽(26)
  • 【數(shù)據(jù)結構】二叉排序樹——平衡二叉樹的調整

    【數(shù)據(jù)結構】二叉排序樹——平衡二叉樹的調整

    參考視頻: 懶貓老師-數(shù)據(jù)結構-(59)平衡二叉樹【互動視頻】 (1)什么是平衡二叉樹 平衡二叉樹(Balanced Binary Tree)是一種特殊的二叉查找樹,它的目的是保持樹的高度盡量平衡,以保證查找、插入、刪除等操作的時間復雜度為 O(log n)。 常見的平衡二叉樹算法包括 AVL 樹、紅

    2024年02月04日
    瀏覽(29)
  • 關于Java中對象的向上轉型和向下轉型

    同一個類調用同一個方法會產生不同的影響/結果 這就是多態(tài) 限制對子類特有方法的訪問 使用子類特有的方法

    2023年04月20日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包