国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java java教程 堆 - 最小和最大

堆 - 最小和最大

Nov 03, 2024 pm 09:06 PM

Heap - Min e Max

堆 - 最小堆

堆是優(yōu)先權清單的更有效率版本。考慮到Priority Queue Sorted 和Unsorted 的插入和移除方法,Unsorted 的插入成本為O(1),移除成本為O(n),而Sorted 的插入成本為O(n),移除成本為O( 1)。

sorted unsorted
insert O(n) O(1)
remove O(1) O(n)

堆是由陣列建構的,但它的表示是一棵二元樹,優(yōu)先順序最高的元素位於頂部,即根。從上到下、從右到左都塞滿了,沒有一個小孩漏掉!

?

但是,有可能建立由最高鍵值定義的最高優(yōu)先權的資料結構。在這種情況下,我們有最大堆,我們稍後會看到。

最小堆

要成為有效的堆,所有子元素的優(yōu)先權必須低於或等於其父元素。此外,它必須是完整的,不能缺少子元素,否則數組將有空格。

?

執(zhí)行此定義的更正式方法是,如果二元樹的等級0、1、2、···h ? 1 具有最大可能元素並且分配了等級h 中存在的元素,則二元樹是完整的盡可能靠左。

如上所述,堆由數組組成(以綠色表示),但可以將其視為樹結構,如下圖所示。

組裝Heap有兩種方法,第一個元素位於位置0,或不位於位置0,在本文中我們將看到兩種情況之間的差異。頂部的元素總是有它們的子元素,通常稱為底部的元素,要發(fā)現這些子元素,在索引為 0 的情況下,您可以使用以下計算來獲得此資訊:

rigthChild = LeftChild + 1
//para saber o elemento da esquerda do pai
leftChild = indexDoFilho * 2 +1
//para saber qual o pai do elemento
parent = (indexDoFilho -1)/2

如果使用不填0的版本,只需減少總和即可,即1-1=0,在父情況下是index / 2。

插入

它總是添加在末尾,您唯一應該關心的是檢查子元素是否具有比父元素更低的鍵,為此目的會執(zhí)行冒泡,即插入元素的鍵為和父親相比,必要時改變。

更詳細地說,將元素放置在樹的最後一個空白空間中,因為您需要將其鍵與父元素的鍵進行比較,所以我們需要計算父元素的索引以存取其鍵。要找出父親,請使用提到的計算:

parent = (indexDoFilho -1)/2

為此,indexDoFilho丟失了:為了獲得它,我們將一個變數作為當前索引,因為我們在插入中是最後一個添加,當前索引是最後一個,是:

currentIndex = size-1

現在有了當前索引,呼叫 Parent 並找出正在插入的元素的父元素。我們需要這個新元素的父元素,因為為了正確組織樹,必須將該元素與其父元素進行比較,如果其鍵較小,則它們必須交換位置。

只要當前索引大於0(為了避免拾取不可用的索引)並且當前索引小於父級索引,如果這個條件成立,則需要與父級交換該元素以保證最小堆的所有權,然後發(fā)生交換,然後目前索引接收父級的索引,然後將父級的父級(KKKKK)取為。 Swap 是一種使用正常交換值的結構的方法。

rigthChild = LeftChild + 1
//para saber o elemento da esquerda do pai
leftChild = indexDoFilho * 2 +1
//para saber qual o pai do elemento
parent = (indexDoFilho -1)/2

有關聯:

parent = (indexDoFilho -1)/2

交換是交換值的正常方法:

currentIndex = size-1

如果目前(子)元素的值小於父元素的值,則表示違反了最小堆屬性。在最小堆中,父堆必須永遠小於或等於子堆。 當不滿足此條件時,子級必須與父級交換位置,以便較小的值繼續(xù)在堆中“爬升”,直到找到正確的位置,在該位置將維護屬性。

消除

刪除索引 0 的元素,但樹不再完整!要解決這個問題,請將陣列的最後一個元素拉到開頭,即新增的最後一個元素位於樹的頂部。之後,再次檢查,但現在是從上到下。換句話說,現在是父母和孩子比較的時候了! (下沉)
sinkDown() 方法將元素在堆中向下移動(或“下沉”),直到它位於正確的位置,其中它的值小於或等於其子元素的值(如果它位於有子元素的位置) .
在sinkDown中,有一個變數用於儲存從根開始的最低鍵的元素的索引,另一個變數用於儲存當前索引。然後,循環(huán)將持續(xù)到當前元素的索引等於具有最低鍵的元素的索引。在循環(huán)內部,取得目前的子級,並查看子級是否在數組範圍內,如果子級索引小於最小索引,則更新最小值。

public void insert(K key, V value) { //o(log n)
    if (isFull()){
        throw new RuntimeException("full");
    }
    //adc a entry na ultima posi??o do vetor
    heap[size++]=new PriorityEntry(key, value);
    //guarda o index que esse novo elemento tá
    int currentIndex = size-1;
    //chama o método parent pra calcular quem é o pai do novo elemento
    int parent = parent(currentIndex);
    //percorre enquanto o index nao for o 0 e o index ser 
    while (currentIndex>0 && compare(currentIndex, parent)<0){
        swap(currentIndex, parent);
        currentIndex = parent;
        parent = parent(currentIndex);
    }
}

在這種情況下:

protected int parent(int index){
        return (index-1)/2;
}

概括:

最小堆屬性:

  • 完整的二元樹結構。
  • 父節(jié)點的值總是等於或小於其子節(jié)點。
  • 透過數組實現,其中子級和父級的位置由基於索引的公式決定。

計算孩子和父母的位置:

  • : leftChild = 索引 * 2 1
  • : rightChild = 索引 * 2 2
  • 父級:父級 = (索引 - 1) / 2

沒有索引 0 的版本: 只要從計算中減去 1,結果是:

  • leftChild = 索引 * 2
  • rightChild = 索引 * 2 1
  • 父級 = 索引 / 2

堆 - 最大堆

最高值位於根節(jié)點,因此父節(jié)點的值與其子節(jié)點相同或更大

孩子和家長的計算公式:

  • : leftChild = 索引 * 2 1
  • : rightChild = 索引 * 2 2
  • 父級:父級 = (索引 - 1) / 2

插入

在末尾添加元素並向上冒泡,這會將元素與其父元素進行比較,並在必要時更改位置。 O(log n)。

rigthChild = LeftChild + 1
//para saber o elemento da esquerda do pai
leftChild = indexDoFilho * 2 +1
//para saber qual o pai do elemento
parent = (indexDoFilho -1)/2

消除

刪除heapMax[0]元素,也就是根,然後取出最後一個元素並將其向上移動到根,調用sinkdown,然後將新元素從根向下推,直到找到正確的位置。

sinkDown需要確保父節(jié)點中的值大於等於子節(jié)點中的值。因此,當下沉一個節(jié)點時,它將與最大子節(jié)點進行比較。

最小堆中,sinkDown必須確保父節(jié)點中的值小於或等於子節(jié)點的值。在本例中,將與最小的孩子進行比較。

parent = (indexDoFilho -1)/2
currentIndex = size-1

差異

  • Max Heap中,sinkDown需要保證父節(jié)點中的值大於或等於子節(jié)點中的值。因此,當下沉一個節(jié)點時,它將與最大子節(jié)點進行比較。
  • 在Max Heap中,如果父節(jié)點小於其子節(jié)點中最大的節(jié)點,那麼它必須與最大的子節(jié)點交換,以確保最大值盡可能高。
  • 最小堆中,sinkDown必須確保父節(jié)點中的值小於或等於子節(jié)點的值。在本例中,將與最小的孩子進行比較。
  • 在最小堆中,如果父節(jié)點大於子節(jié)點中最小的節(jié)點,就會發(fā)生切換,將最小值保留在頂部

以上是堆 - 最小和最大的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

hashmap和hashtable之間的區(qū)別? hashmap和hashtable之間的區(qū)別? Jun 24, 2025 pm 09:41 PM

HashMap與Hashtable的區(qū)別主要體現在線程安全、null值支持及性能方面。 1.線程安全方面,Hashtable是線程安全的,其方法大多為同步方法,而HashMap不做同步處理,非線程安全;2.null值支持上,HashMap允許一個null鍵和多個null值,Hashtable則不允許null鍵或值,否則拋出NullPointerException;3.性能方面,HashMap因無同步機制效率更高,Hashtable因每次操作加鎖性能較低,推薦使用ConcurrentHashMap替

為什麼我們需要包裝紙課? 為什麼我們需要包裝紙課? Jun 28, 2025 am 01:01 AM

Java使用包裝類是因為基本數據類型無法直接參與面向對像操作,而實際需求中常需對象形式;1.集合類只能存儲對象,如List利用自動裝箱存儲數值;2.泛型不支持基本類型,必須使用包裝類作為類型參數;3.包裝類可表示null值,用於區(qū)分未設置或缺失的數據;4.包裝類提供字符串轉換等實用方法,便於數據解析與處理,因此在需要這些特性的場景下,包裝類不可或缺。

JIT編譯器如何優(yōu)化代碼? JIT編譯器如何優(yōu)化代碼? Jun 24, 2025 pm 10:45 PM

JIT編譯器通過方法內聯、熱點檢測與編譯、類型推測與去虛擬化、冗餘操作消除四種方式優(yōu)化代碼。 1.方法內聯減少調用開銷,將頻繁調用的小方法直接插入調用處;2.熱點檢測識別高頻執(zhí)行代碼並集中優(yōu)化,節(jié)省資源;3.類型推測收集運行時類型信息實現去虛擬化調用,提升效率;4.冗餘操作消除根據運行數據刪除無用計算和檢查,增強性能。

什麼是接口中的靜態(tài)方法? 什麼是接口中的靜態(tài)方法? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

什麼是實例初始器塊? 什麼是實例初始器塊? Jun 25, 2025 pm 12:21 PM

實例初始化塊在Java中用於在創(chuàng)建對象時運行初始化邏輯,其執(zhí)行先於構造函數。它適用於多個構造函數共享初始化代碼、複雜字段初始化或匿名類初始化場景,與靜態(tài)初始化塊不同的是它每次實例化時都會執(zhí)行,而靜態(tài)初始化塊僅在類加載時運行一次。

變量的最終關鍵字是什麼? 變量的最終關鍵字是什麼? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

什麼是工廠模式? 什麼是工廠模式? Jun 24, 2025 pm 11:29 PM

工廠模式用於封裝對象創(chuàng)建邏輯,使代碼更靈活、易維護、松耦合。其核心答案是:通過集中管理對象創(chuàng)建邏輯,隱藏實現細節(jié),支持多種相關對象的創(chuàng)建。具體描述如下:工廠模式將對象創(chuàng)建交給專門的工廠類或方法處理,避免直接使用newClass();適用於多類型相關對象創(chuàng)建、創(chuàng)建邏輯可能變化、需隱藏實現細節(jié)的場景;例如支付處理器中通過工廠統一創(chuàng)建Stripe、PayPal等實例;其實現包括工廠類根據輸入參數決定返回的對象,所有對象實現共同接口;常見變體有簡單工廠、工廠方法和抽象工廠,分別適用於不同複雜度的需求。

什麼是類型鑄造? 什麼是類型鑄造? Jun 24, 2025 pm 11:09 PM

類型轉換有兩種:隱式和顯式。 1.隱式轉換自動發(fā)生,如將int轉為double;2.顯式轉換需手動操作,如使用(int)myDouble。需要類型轉換的情況包括處理用戶輸入、數學運算或函數間傳遞不同類型的值時。需要注意的問題有:浮點數轉整數會截斷小數部分、大類型轉小類型可能導致數據丟失、某些語言不允許直接轉換特定類型。正確理解語言的轉換規(guī)則有助於避免錯誤。

See all articles