PHP優先權佇列的介紹(附程式碼)
這篇文章帶給大家的內容是關於PHP優先權隊列的介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
PHP 的 SPL 庫內建了 SplPriorityQueue優先權佇列,並且是以Heap資料結構實現的,預設為MaxHeap模式,即priority越大越優先出隊,同時可以透過重寫compare方法來使用MinHeap(優先越低越優先出隊,場景似乎很少)。
SplPriorityQueue
堆特性
這裡要注意並理解:SplPriorityQueue是以堆疊資料結構來實現的,當我們出隊時會拿出堆頂的元素,此時堆的特性被破壞,堆會進行相應的調整至穩定態(MaxHeap or MinHeap),即會將最後一個元素替換到堆頂,然後進行穩定態驗證,不符合堆特性則繼續調整,或者我們就得到了一個穩定態的堆,所以當優先權相同,出隊順序並不會按照入隊順序。
原始碼範例:
<?php $splPriorityQueue = new \SplPriorityQueue(); // 设定返回数据的meta信息 // \SplPriorityQueue::EXTR_DATA 默认 只返回数 // \SplPriorityQueue::EXTR_PRIORITY 只返回优先级 // \SplPriorityQueue::EXTR_BOTH 返回数据和优先级 // $splPriorityQueue->setExtractFlags(\SplPriorityQueue::EXTR_DATA); $splPriorityQueue->insert("task1", 1); $splPriorityQueue->insert("task2", 1); $splPriorityQueue->insert("task3", 1); $splPriorityQueue->insert("task4", 1); $splPriorityQueue->insert("task5", 1); echo $splPriorityQueue->extract() . PHP_EOL; echo $splPriorityQueue->extract() . PHP_EOL; echo $splPriorityQueue->extract() . PHP_EOL; echo $splPriorityQueue->extract() . PHP_EOL; echo $splPriorityQueue->extract() . PHP_EOL; //执行结果 task1 task5 task4 task3 task2
可以看到,雖然5 個任務的優先權相同,但佇列並沒有按照入隊順序傳回數據,因為堆的特性使然:
1 、入隊task1, task2, task3, task4, task5,因為優先權相同,所以堆一直處於穩定狀態。
2、出隊,得 task1,堆先將結構調整為 task5, task2, task3, task4,已然達到了穩定態。
3、出隊,得 task5,堆先將結構調整為 task4, task2, task3,已然達到了穩定態。
4、出隊,得 task4,堆先將結構調整為 task3, task2,已然達到了穩定態。
5、出隊,得 task3,堆先將結構調整為 task2,已然達到了穩定態。
4、出隊,得 task2。
Iterator, Countable
SplPriorityQueue實作了 Iterator, Countable接口,所以我們可以foreach/count函數來操作它,或是使用rewind,valid,current,next/count方法。
注意,因為是堆實現,所以rewind方法是一個no-op沒有什作用的操作,因為頭指針總是指向堆頂,即current始終等於top,不像List只是遊走指針,出隊是會刪除堆元素的,extract = current next(current出隊,從堆中刪除)。
<?php $splPriorityQueue = new \SplPriorityQueue(); $splPriorityQueue->insert("task1", 1); $splPriorityQueue->insert("task2", 2); $splPriorityQueue->insert("task3", 1); $splPriorityQueue->insert("task4", 4); $splPriorityQueue->insert("task5", 5); echo "Countable: " . count($splPriorityQueue) . PHP_EOL; // 迭代的话会删除队列元素 current 指针始终指向 top 所以 rewind 没什么意义 for ($splPriorityQueue->rewind(); $splPriorityQueue->valid();$splPriorityQueue->next()) { var_dump($splPriorityQueue->current()); var_dump($splPriorityQueue->count()); $splPriorityQueue->rewind(); } var_dump("is empty:" . $splPriorityQueue->isEmpty());
Extract出隊
extract 出隊更為友好,即始終返回優先級最高的元素,優先級相投時會以堆調整的特性返回數據。
<?php $splPriorityQueue = new \SplPriorityQueue(); // data priority $splPriorityQueue->insert("task1", 1); $splPriorityQueue->insert("task2", 2); $splPriorityQueue->insert("task3", 1); $splPriorityQueue->insert("task4", 4); $splPriorityQueue->insert("task5", 5); echo "Countable: " . count($splPriorityQueue) . PHP_EOL; while (! $splPriorityQueue->isEmpty()) { var_dump($splPriorityQueue->extract()); echo $splPriorityQueue->count() . PHP_EOL; }
自訂優先權處理方式
重寫compare方法定義自己的優先權處理機制。
<?php class CustomedSplPriorityQueue extends SplPriorityQueue { public function compare($priority1, $priority2): int { // return $priority1 - $priority2;//高优先级优先 return $priority2 - $priority1;//低优先级优先 } } $splPriorityQueue = new \CustomedSplPriorityQueue(); $splPriorityQueue->setExtractFlags(SplPriorityQueue::EXTR_BOTH); $splPriorityQueue->insert("task1", 1); $splPriorityQueue->insert("task2", 2); $splPriorityQueue->insert("task3", 1); $splPriorityQueue->insert("task4", 4); $splPriorityQueue->insert("task5", 5); echo "Countable: " . count($splPriorityQueue) . PHP_EOL; while (!$splPriorityQueue->isEmpty()) { var_dump($splPriorityQueue->extract()); }
這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的PHP影片教學專欄!
以上是PHP優先權佇列的介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
