首頁 Java java教程 優先隊列!讓我們來分解一下,了解一下資料結構的這一部分。

優先隊列!讓我們來分解一下,了解一下資料結構的這一部分。

Oct 21, 2024 am 08:08 AM

Priority Queue! Vamos destrinchar e aprender sobre essa parte de Estrutura de Dados.

佇列

佇列與堆疊一樣,是列表的特化。它是建立在先進先出的基礎上的——先進先出,這意味著先進先出。換句話說,隊列中「最年長」的人先離開,為了更好地理解,請考慮銀行隊列。

⚠️

佇列應用:作業系統中的進程管理;並發程式設計中任務之間的通訊;電腦網路(列印);回應 Web 伺服器上的請求

佇列本身只允許在末端直接操作資料。

public interface Queue<E> {
    void enqueue(E value); //enfileira
    E dequeue(); //remove e desenfileira
    E first(); //retorna primeiro elemento
    int size(); //algumas literaturas se chama lenght()
    boolean isEmpty();
}

優先隊列

這類似於日常排隊的行為,但現在考慮一下您在銀行排隊,一位女士進入隊列,每個人都讓她先進,因為她年紀更大,所以有更大的優先級。

在優先權佇列資料結構中,每個節點都有一個Key-Value,Key是儲存其優先權的鍵,Value是節點的值。預設情況下,Java 中的 Key 最初是數字,程式設計師可以稍後更改。

Key和Value的集合稱為Entry,所以這個E.D的介面改變了。其他細節是:Key一旦定義,就不能更改。如果兩個節點的 Key 中的優先權值相同,則程式設計師選擇規則。

public interface PriorityQueueOg<K,V> {
    void insert(K key, V value);
    Entry<K,V> remove();
    int size();
    boolean isEmpty();
}

在接下來的結構中,我們將使用 Node 和 Entry 類別、first、last 和 size 屬性以及 CompareTo

優先權佇列分為兩種:已排序(Sorted Priority Queue)和未排序(Unorted Priority Queue)

排序優先權佇列

有序列表負責將節點插入到正確的位置,因此刪除很容易,只需刪除第一個(如果執行 E.D 的程式設計師定義最高優先元素應該位於開頭)

為了知道哪個節點具有最高優先級,我們使用compareTo,這是一個集合函數,透過它的返回,我們可以獲得執行此 E.D 的關鍵結果,如果返回是:

  • 否定:​​如果呼叫該方法的物件比作為參數傳遞的物件「小」。
  • 零:如果物件相等。
  • 正: 如果呼叫方法的物件比作為參數傳遞的物件「更大」。

插入

要進入,您必須檢查一些事項

第一步 → 建立一個新節點

Node newNode = new Node(key, value)

第二步 → 檢查 Queue 是否為空,如果是,則將 Head 和 Last 作為新節點,考慮到它將是唯一的

public interface Queue<E> {
    void enqueue(E value); //enfileira
    E dequeue(); //remove e desenfileira
    E first(); //retorna primeiro elemento
    int size(); //algumas literaturas se chama lenght()
    boolean isEmpty();
}

第三步 → 如果它不是清單中的唯一元素,則必須檢查新節點是否比第一個節點具有更高的優先權。

public interface PriorityQueueOg<K,V> {
    void insert(K key, V value);
    Entry<K,V> remove();
    int size();
    boolean isEmpty();
}

第三步 → 然後與列表中的最後一個元素進行比較

Node newNode = new Node(key, value)

第四步 → 如果沒有其他的,就只剩下中間了!為此,我們需要製作一個輔助節點放在 newNode (nN) 的前面並比較兩者,當 auxNode 指向空時,或者當 nN 大於 auxNode 時(較大,因此它),比較結束排在後面)。這個 while 用於 aux 四處比較兩個節點的值,當找到時,將 nN 放在 auxNode 後面

        if(isEmpty()){
            first = newNode;
            last = newNode;
        }else{

消除

Sorted 中的刪除方法要簡單得多,因為正如已經提到的,佇列已經為其組織好了。

第一步 → 由於每個 Remove 方法都會傳回要刪除的元素,因此該步驟將建立 Entry (為什麼不是節點?)

         if(compare(newNode, first)<0){
                 //Se o nN for menor que o F
                 //Levando em consideração que a prioridade maior é 0
                 //Se o nN for menor que F, ele será o de maior prioridade pegando o lugar do primeiro
                newNode.next = first;
                first.previous = newNode;
                first = newNode;
          }

第二步 → 然後,由於您已經要消除第一個節點,只需將 First 指向 First 旁邊的節點即可

             }else if(compare(newNode, last)>=0){
           //Se o nN for maior que o L
           //Significa que o número de nN é maior que L
           //Então bota o nN para ultimo
                newNode.previous=last;
                last.next=newNode;
                last = newNode;
            }else{

第三步 → 檢查佇列中是否只有一個元素,因為如果是,佇列將為空!然後你必須將 F 和 L 設為 null

            }else{
                //se nao for nada, está no meio
                //entao temos que achar entre qual dos meios
                Node auxNode = first;
                while(compare(newNode, auxNode)>0 && auxNode.next!=null){
                    //enquanto o newNode tiver prioridade maior que o auxiliar
                    //e o auxiliar tiver um proximo
                    auxNode = auxNode.next;
                }
                newNode.next = auxNode;
                newNode.previous = auxNode.previous;
            }
        }

第四步 → 如果不是唯一的元素,則表示還有其他元素!因此,當您在步驟 2 中刪除第一個時,先前的第一個仍然與前一個連接,所以我們必須:

        Entry<K,V> max = maxPriority();

最大優先權

傳回清單中優先順序最高的元素的方法,由於我們是按順序排列的,因此它只傳回第一個元素。

        first = first.next;

漸進分析

Método O(_)
size O(1)
isEmpty O(1)
insert O(n)
remove O(1)
maxPriority O(1)

未排序的優先權佇列

無序隊列和有序隊列有很大不同!讓我們從他的方法開始:

插入

要加入unsorted、like和disordered中,你不需要擔心這個新元素會在哪裡,只需將它加到最後即可!

第一步→檢查清單是否為空,因為如果是,則要新增的節點將是第一個(First)和最後一個(Last)

public interface Queue<E> {
    void enqueue(E value); //enfileira
    E dequeue(); //remove e desenfileira
    E first(); //retorna primeiro elemento
    int size(); //algumas literaturas se chama lenght()
    boolean isEmpty();
}

第二步→如果不為空,只要在最後加上這個節點即可!

public interface PriorityQueueOg<K,V> {
    void insert(K key, V value);
    Entry<K,V> remove();
    int size();
    boolean isEmpty();
}

最大優先權

Unsorted 中的移除比 Sorted 中的那幾行程式碼複雜得多...

「為什麼?」你問,我們應該使用一種名為 maxPriority 的方法(在其他版本中也簡單得多),其目標是找到具有最高優先級的節點。以前是用簡單的幾行程式碼來教導的,現在,因為我們不知道這個最高優先權的節點實際上在哪裡,所以我們必須遍歷整個佇列來尋找它!因此,在我們研究remove本身之前,我們先來看看maxPriority。

第一步→ 每當我們想要遍歷一個資料結構時,我們需要兩個節點:一個是始終前進的輔助節點,另一個是我們想要實現的節點(在本例中是MaxPriority)

Node newNode = new Node(key, value)

第二步 → 這兩個將在一個節點內運行,只有當 aux 達到 null(隊列末尾)時才結束。比較這些節點,如果為負數,表示aux小於max,所以max最大,更新max節點的值,然後讓aux運行。

        if(isEmpty()){
            first = newNode;
            last = newNode;
        }else{

消除

第一步 → 在所有 emove 中,建立一個變數來儲存將被刪除的節點。在這種情況下,您已經知道哪一個將被刪除,因為您正在呼叫 maxPriority
方法

         if(compare(newNode, first)<0){
                 //Se o nN for menor que o F
                 //Levando em consideração que a prioridade maior é 0
                 //Se o nN for menor que F, ele será o de maior prioridade pegando o lugar do primeiro
                newNode.next = first;
                first.previous = newNode;
                first = newNode;
          }

第二步 → 然後檢查它是否是唯一的元素,如果是,則 F 和 L 為空!

             }else if(compare(newNode, last)>=0){
           //Se o nN for maior que o L
           //Significa que o número de nN é maior que L
           //Então bota o nN para ultimo
                newNode.previous=last;
                last.next=newNode;
                last = newNode;
            }else{

第3步→如果不是唯一的,還有其他選擇:如果max是最後一個,則消除最後一個,如果是第一個,則消除第一個,如果不是兩個兩個,則在中間!

            }else{
                //se nao for nada, está no meio
                //entao temos que achar entre qual dos meios
                Node auxNode = first;
                while(compare(newNode, auxNode)>0 && auxNode.next!=null){
                    //enquanto o newNode tiver prioridade maior que o auxiliar
                    //e o auxiliar tiver um proximo
                    auxNode = auxNode.next;
                }
                newNode.next = auxNode;
                newNode.previous = auxNode.previous;
            }
        }

第四步 → 如果它在中間,則必須移除人群中的最大值,當沒有其他人指向它時,就會發生這種情況。

        Entry<K,V> max = maxPriority();

漸進分析

Método O(_)
size O(1)
isEmpty O(1)
insert O(1)
remove O(n)
maxPriority O(n)

以上是優先隊列!讓我們來分解一下,了解一下資料結構的這一部分。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

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整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

See all articles