首页
/
每日頭條
/
科技
/
學習數據結構與算法的基礎
學習數據結構與算法的基礎
更新时间:2025-02-20 09:48:43

學習數據結構與算法的基礎?摘要堆可以分為大頂堆和小頂堆,是根據節點與子節點的比較來界定文章中可以使用數組來存放元素,并處理節點與子節點的比較和交換,就是利用了二叉樹的基礎性質,看完文章相當于再次溫習了二叉樹的基礎性質,今天小編就來說說關于學習數據結構與算法的基礎?下面更多詳細答案一起來看看吧!

學習數據結構與算法的基礎(數據結構與算法-基礎)1

學習數據結構與算法的基礎

摘要

堆可以分為大頂堆和小頂堆,是根據節點與子節點的比較來界定。文章中可以使用數組來存放元素,并處理節點與子節點的比較和交換,就是利用了二叉樹的基礎性質,看完文章相當于再次溫習了二叉樹的基礎性質。

堆可以分為大頂堆和小頂堆,大頂堆的定義就是每個節點的值都大于或等于其左右子節點的值。小頂堆和大頂堆相反,即每個節點的值都小于或等于其左右子節點的值。接下來的說明以大頂堆為例。

根據大頂堆的定義可以梳理出這幾點特性:

  1. 根節點的值是最大的
  2. 節點的左右子節點沒有左子節點值必須小于右子節點值,反之也是沒有限制
  3. 節點、它的左子節點、它的右子節點這三個節點中,節點的值是最大的

接下來,咱就用數組來實現大頂堆的數據結構。為什麼要用數組而不是二叉樹來實現?帶着問題,繼續往下看,後面給出答案。

首先創建一個大頂堆的類結構,并定義數組、數量等屬性

public class BinaryHeap<E> { private E[] elements; private int size; }

假設将 elements 數組裡 index 索引中的元素放到合适的位置,這時就要考慮兩點:

  1. index 索引位置在葉子節點
  2. index 索引位置在非葉子節點

如果是情況1,那就可以不做處理,因為依據特性2來看,子節點之間沒有比較元素的要求,凡是葉子節點,都是子節點,所以葉子節點可以不用處理,等着它的父節點來主動比較。

如果是情況2,那麼就需要和它的左右子節點比較,然後和最大值的節點交換,在編寫邏輯之前,首先要确定以下幾點(假定節點的索引為 index,數組中元素的數量為 size):

  • 非葉子節點的數量 half = size >> 1(half = size / 1);
  • 節點的左子節點索引 leftIndex = (index << 1) 1;
  • 節點的右子節點索引 rightIndex = leftIndex 1;

位運算符示例:

x << 1: x *2

x >> 1: x / 2

上面這 3 點都是二叉樹的基本特性,可以看第六期再溫習一下,下面就可以編寫防治 index 索引的節點的代碼:

private void siftDown(int index) { E element = elements[index]; int half = size >> 1; // 取出非葉子節點 // 第一個葉子結點的索引 == 非葉子節點的數量 // 必須保證 index 是非葉子節點 while (index < half) { // index 的節點有2種情況 // 1、隻有左子節點 // 2、同時有左右子節點 // 默認左子節點跟它進行比較 int childIndex = (index << 1) 1; E child = elements[childIndex]; // 右子節點 int rightIndex = childIndex 1; // 保證右子節點存在(rightIndex < size),并比較左右子節點 if (rightIndex < size && compare(elements[rightIndex], child) > 0) { child = elements[ childIndex = rightIndex]; } if (compare(child, element) < 0) break; // 将子節點存放到index位置 elements[index] = child; // 重新設置 index,繼續判斷 index = childIndex; } elements[index] = element; }

看 siftDown 方法的實現邏輯,可以發現是從 index 往下過濾,尋找合适的位置,那麼有沒有從 index 往上過濾呢?上代碼:

private void siftUp(int index) { E e = elements[index]; while (index > 0) { // 得到 index 位置節點的父節點 int pIndex = (index - 1) >> 1; E p = elements[pIndex]; // 節點小于或等于它的父節點時,結束 if (compare(e, p) <= 0) break; // 交換節點元素,父節點設置為 index 節點再進行判斷 elements[index] = p; index = pIndex; } elements[index] = e; }

(index - 1) >> 1 就是獲取父節點索引代碼,也是二叉樹的基本性質。

當解決将 index 索引節點放在合适位置的核心問題之後,就可以處理後面這幾個需求了。

比如,當需要批量添加元素,即直接将一個數組處理成大頂堆時(假設元素已經放入 elements 中 ):

// 批量建堆 private void heapify() { // 自下而上的下濾,隻需要處理非葉子節點即可 for (int i = (size >> 1) - 1; i >= 0; i--) { siftDown(i); } }

如果使用 siftUp 函數來實現批量建堆,就需要從頭遍曆到最後的位置:

// 批量建堆 private void heapify() { // 自上而下的上濾 for (int i = 0; i < size; i ) { siftUp(i); } }

總結

  • 大頂堆就是每個節點都大于它的左右子節點,小頂堆剛相反;
  • 非葉子節點的數量 half = size >> 1(half = size / 1);
  • siftDown 來批量建堆時,可以減少一半的遍曆次數;
,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
120hz電腦屏為什麼隻有60hz
120hz電腦屏為什麼隻有60hz
大家好,我是小匠。現在來說,刷新率超過60Hz的屏幕,包括144Hz的顯示器以及搭載144Hz顯示屏的筆記本電腦可以說也比較普遍。而且隻要是有運行遊戲的使用需求特别是像FPS(第一人稱射擊遊戲)遊戲,高刷新率有着非常明顯的優勢,甚至在電競界...
2025-02-20
服裝商品管理詳解
服裝商品管理詳解
1、SKU:SKU=StockKeepingUnit(庫存量單位),即庫存進出計量的單位,可以是以件,盒,托盤等為單位。SKU這是對于大型連鎖超市DC(配送中心)物流管理的一個必要的方法。現在已經被我們引申為産品統一編号的簡稱,每種産品均對...
2025-02-20
蘋果手機信号差怎麼才讓信号更好
蘋果手機信号差怎麼才讓信号更好
很多蘋果用戶都表示,自己的手機信号不好,甚至還不如周圍使用低端安卓機的朋友。其實,這是由于蘋果手機的基帶問題,下面小編就教你如何查看自己的手機信号能力。首先,我們打開“電話”,進入“撥号鍵盤”,随後,在撥号鍵盤中輸入—*3001#12345...
2025-02-20
幾款更快更好用的電腦浏覽器
幾款更快更好用的電腦浏覽器
1.誇克浏覽器誇克浏覽器,UC出品的一款幹淨極簡的手機浏覽器。内置百度、必應、優酷、豆瓣、微博、知乎等第三方的搜索功能,可随意切換,給用戶帶來更多個性化的快速搜索體驗。支持通過QQ、微信、微博、UC賬号或者手機登陸進行書簽雲同步,多設備登錄...
2025-02-20
手機産生藍光有紫外線嗎
手機産生藍光有紫外線嗎
現代快報訊(記者蔡夢瑩)手機一玩就是一整天,怎麼才能降低玩手機興緻?網友支招:把手機調成黑白模式,讓手機變得無趣,從而讓人“戒”手機。還有網友認為黑白模式可以防藍光,達到護眼的目的。真有這種一舉兩得的好事嗎?【記者實測】打開黑白模式,手機世...
2025-02-20
Copyright 2023-2025 - www.tftnews.com All Rights Reserved