數據結構--堆的向上調整和向下調整

文章目錄

  • 1.完全二叉樹
  • 2.堆向上調整
  • 3.堆向下調整
  • 4.測試代碼

1.完全二叉樹

下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明:

邏輯結構就是我們自己認為的進行購想出來的;

但是這個物理結構卻是我們的這個數據結構在內存里面的真是進行存儲的這個形態的一個體現;

1)通過下面的這個圖片,我們首先需要知道這個完全二叉樹的定義,其實下面的這個實例很特殊,它既是一個完全二叉樹,也是一個滿二叉樹;

2)我們的這個完全二叉樹它的定義就是他的這個所有的節點進行編號和我們的這個滿二叉樹是一樣的,這個時候我們就把這個樹稱之為完全二叉樹;

3)下面的這個滿二叉樹實際上就是一個完全二叉樹;

4)我們可以看到這個完全二叉樹在我們的這個內存里面實際上是使用這個數組進行存儲的,但是我們在學習這個數據結構的時候,使用的是他的邏輯結構,也就是二叉樹;

在這里插入圖片描述

2.堆向上調整

這個主要是我們的建堆的過程,就是我們進行建堆的時候,這個數據從我們的葉子結點開始需要進行這個向上調整的過程;

在這里插入圖片描述

我們從上面的這個建堆的過程是可以看到的,他是需要和自己的這個父親節點不斷地進行比較,直到他的數值比父親節點的數值小,這個大堆才完成;

我們的建堆主要是在下面的這個插入數據的過程里面使用的:我們首先就是進行的這個空間的開辟,最后是調用我們的這個向上調整的函數,這個就是說:我們的這個向上調整就是進行插入的時候保證我們的這個大堆的結構(就是我們插入數據之后,他還是一個堆);在這里插入圖片描述
下面的這個:我們的這個child參數就是我們插入的數據,我們的這個函數就是對于這個數據的位置進行調整,使用這個父子節點的關系,我們根據這個子節點的小標,找到這個parent節點的大小;

如果我們的這個兒子數值比我們的這個父親大,這個時候就是需要向上進行調整的,我們的這個調整的方法就是先交換,交換之后讓我們的這個兒子向上走(也就是代碼里面的這個child=parent);

我們的這個child向上之后,這個對應的這個parent也就是需要發生變化的,這個變化就是把我們的這個child-1/2之后的值作為新的這個parent節點的下標;

在這里插入圖片描述

我們如何去驗證這個調整的結果是否正確:我們去進行這個堆的初始化,向這個里面進行我們的數據的插入,這個時候斷掉調試,hp.a,6----這個就會顯示我們的這個數組里面的6個元素的位置,我們根據這個調試的結果做出來這個對應的樹,這個時候發現我們插入數據之后,這個最后的解構就是一個大根堆(如圖所示);
在這里插入圖片描述

3.堆向下調整

這個向下調整是如何引出來的,就是我們的這個數據進行插入之后,這個時候我們的大堆的結構就形成了,這個時候我們的這個父親節點肯定就是最大的這個元素,這個時候,我們的處理就是想要知道這個第二大的元素(這個過程實際上就是我們堆排序的雛形,但是這個并不是真正的堆排序);

我們去掉這個父親節點之后,想要直到這個第二大的元素是哪一個,并且去掉這個父親節點之后的這個樹的結構又是什么樣子的,這個時候有些人的方案就是:

1)這個完全二叉樹不就是一個數組嗎,我們的這個父親節點就是這個數組里面的第一個元素,這個時候我們直接把這個后面的所有的元素向前移動不就可以了;

2)但是上面的這個方案是不可取的,主要是因為我們如果使用上面的這個方式進行調整,我們的這個數據之間的這個父子關系就完全發生了變化,因此我們否定這個解法;

3)正確的解法就是我們讓這個父親節點和我們的這個最后的這個節點進行交換,直接使用我們的這個pop刪除這個最后的元素,這個時候原本的最后的一個元素放到了根節點的位置,其他的所有的元素的位置都是不變的,這樣可以維持我們的這個數據之間的這個父子的關系;

4)但是現在他是不符合我們的大根堆的定義的,因此這個時候我們的處理就是讓這個元素向下進行比較,不斷的向下調整-----------這個就是我們的向下調整的這個出現的場景;

下面的這個就是我們進行pop操作的時候,我們需要交換之后size–就可以了,然后我們對于這個時候的0下標的位置的元素向下調整;

在這里插入圖片描述

這個時候我們的方法就是需要找到這個時候的兩個兒子里面的最大的那個元素:也就是和我們的這個父親節點相鄰的兩個孩子,找到他們里面的較大的一個,如果我們比這兩個里面的較大的一個小,這個時候我們就是需要進行調整的,這個里面的child+1<N是為了防止越界;

這個while控制的是我們的這個比較的過程是不是到達了根節點,第一個if是默認我們的這個左邊的孩子是最大的,如果發現是這個右邊的比左邊的大,我們的這個child++,同時如果出現了這個只有左邊的孩子,沒有右邊的孩子,這個時候child+1就會越界,因此我們使用這個child+1防止越界;在這里插入圖片描述

下面的這個就是我們的4和17里面的這個較大的就是17,因此我們的這個3就需要和我們的17進行比較,這個時候發現是不滿足我們的這個大根堆的定義的,因此這個就需要向下調整:

child的值賦值給我們的parent,這個時候新的child就是我們這個時候的parent*2+1即可;

在這里插入圖片描述

4.測試代碼

這個時候,我們既可以隨機的插入數據,打印這個大堆的結果;

我們也可以插入很多的數據,使用這個k限制,打印出來有限多個數據,兩個方式都是可以的;

這個時候,我們既可以隨機的插入數據,打印這個大堆的結果;

我們也可以插入很多的數據,使用這個k限制,打印出來有限多個數據,兩個方式都是可以的;
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63665.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足&#xff0c;創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…

“魔法糖果盒的秘密:用樸素貝葉斯算法猜糖果顏色”

想象一下&#xff0c;你有一個神奇的糖果盒&#xff0c;這個糖果盒里有兩種糖果&#xff1a;紅色的和藍色的。你閉上眼睛&#xff0c;從盒子里拿出一個糖果&#xff0c;然后嘗一嘗&#xff0c;你想知道這個糖果是紅色的還是藍色的。樸素貝葉斯算法就像是一個魔法規則&#xff0…

Transform組件的用法

文章目錄 1. 概念介紹2. 使用方法3. 示例代碼我們在上一章回中介紹了Checkbox Widget相關的內容,本章回中將介紹Transform Widget.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的Transform是一種容器類widget,它和Container組件類似。它可以包含其它的組件…

go面試問題

1 Go的內存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http狀態碼 300 請求的資源可包括多個位置&#xff0c;相應可返回一個資源特征與地址的列表用于用戶終端&#xff08;例如&#xff1a;瀏覽器&#xff09;選擇 301 永久移動。請求的資源已被永久的移動到新U…

康冠科技嵌入式面試題及參考答案

LCD 驅動你自己做了哪些內容? 在 LCD 驅動開發中,首先是硬件層面的理解。需要仔細研究 LCD 的數據手冊,明確其引腳定義,包括電源引腳、數據引腳、控制引腳等。比如,對于常見的 RGB 接口 LCD,要清楚哪幾個引腳是用于傳輸紅、綠、藍三種顏色的數據,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加觸屏驅動

一&#xff09;增加驅動代碼gt9xxx.c和ctiic.c到工程中的BSP目錄下: 二&#xff09;更改觸摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…

初識面向對象晨考day09

1.類和對象什么關系 類是對象的抽象 對象是類的具體 2.什么是屬性和方法 一類事物共有的特征&#xff0c;使用屬性描述 一類事物共有的行為&#xff0c;使用方法描述 3.普通方法的定義格式 public 返回值類型 方法名(參數列表){} 4.什么是形參&#xff0c;什么是實參 形參是方法…

資源型數字化平臺該如何順利運營?

一、引言 隨著信息技術的迅猛發展&#xff0c;資源型數字化平臺在各領域的重要性日益凸顯。此類平臺整合各類資源&#xff0c;以數字化手段提升資源利用效率與價值&#xff0c;但確保其順利運營面臨諸多挑戰。 二、資源型數字化平臺特點 資源型數字化平臺具有資源整合性&…

GitLab的安裝和使用

1.GitLab 環境說明 系統版本 CentOS 7.2 x86_64 軟件版本 gitlab-ce-10.8.4 GitLab 是一個用于倉庫管理系統的開源項目&#xff0c;使用Git作為代碼管理工具&#xff0c;并在此基礎上搭建起來的web服務。可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能…

Leetcode 串聯所有單詞的子串

算法思想&#xff08;中文解釋&#xff09; 這道題目要求我們在字符串 s 中找到所有子串&#xff0c;這些子串是字符串數組 words 中所有單詞的串聯&#xff0c;并且每個單詞只能使用一次&#xff0c;且順序可以任意。下面是代碼的算法思想&#xff1a; 1. 核心思路 分解問題…

解析在OceanBase創建分區的常見問題|OceanBase 用戶問題精粹

在《分區策略和管理分區計劃的實踐方案》這篇文章中&#xff0c;我們介紹了在ODC中制定分區策略及有效管理分區計劃的經驗。有不少用戶在該帖下提出了使用中的問題&#xff0c;其中一個關于創建分區的限制條件的問題&#xff0c;也是很多用戶遭遇的老問題。因此本文以其為切入&…

有哪些免費的 ERP 軟件可供選擇?哪些 ERP 軟件使用體驗較好?

想找個 “免費” 的 ERP 軟件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及財務、人力、供應鏈、采購、銷售等好多方面的重要企業軟件。功能這么全&#xff0c;能免費才怪呢&#xff01;真要是有免費的&#xff0c;早就火遍大江南北&#xff0c;說不定把市場都壟斷了&…

centos-stream9系統安裝docker

如果之前安裝過docker需要刪除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安裝yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

了解cuda的統一內存

1. CUDA 6中的統一內存 在CUDA 6中&#xff0c;從Kepler GPU架構&#xff08;計算能力3.0或更高&#xff09;開始&#xff0c;在64位Windows 7、8和Linux操作系統&#xff08;內核2.6.18&#xff09;上開始支持統一內存. 從CUDA 6開始&#xff0c;NVIDIA推出了CUDA平臺歷史上…

unity 最小后監聽鍵盤輸入

當Untiy最小化后&#xff0c;游戲窗口不會立刻失去焦點&#xff0c;此時依然可以使用Input來獲取按鍵&#xff0c;但是點擊其他窗口后&#xff0c;就會失去焦點&#xff0c;此時系統會把按鍵輸入分配到其他窗口里&#xff0c;此時要用windowsAPI獲取按鍵輸入&#xff0c;應對兩…

Pytorch | 從零構建MobileNet對CIFAR10進行分類

Pytorch | 從零構建MobileNet對CIFAR10進行分類 CIFAR10數據集MobileNet設計理念網絡結構技術優勢應用領域 MobileNet結構代碼詳解結構代碼代碼詳解DepthwiseSeparableConv 類初始化方法前向傳播 forward 方法 MobileNet 類初始化方法前向傳播 forward 方法 訓練過程和測試結果…

Electronjs+Vue如何開發PC桌面客戶端(Windows,Mac,Linux)

electronjs官網 https://www.electronjs.org/zh/ Electron開發PC桌面客戶端的技術選型非常適合已經有web前端開發人員的團隊。能夠很絲滑的過渡。 Electron是什么&#xff1f; Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.…

【1.排序】

排序 筆記記錄 1.排序的基本概念1.1 排序的定義 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希爾排序 3. 交換排序3.1 冒泡排序3.2 快速排序 4. 選擇排序4.1 簡單選擇排序4.2 堆排序 5. 歸并排序、基數排序和計數排序5.1 歸并排序4.2 基數排序4.3 計數排序 6. 各種內部排…

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目錄 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap&#xff1f;主要命令介紹1. mkswap2. mkfs.swap3. swapon 創建和管理 Swap 的步驟1. 創建 Swap 分區2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 狀態 刪除 Swap 分區或文件1. 停用 Swap2. 刪…

取子串(指針)

#include <stdio.h> #include <string.h>char* substr(char *s, int startloc, int len) {static char result[51]; // 定義一個足夠大的靜態數組來存儲結果static char result1[] {N,U,L,L,\0};int i, j;// 檢查startloc是否在字符串的范圍內if (startloc < 1…