亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP優先級隊列的介紹(附代碼)

2020-03-22 17:41:58
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于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;//執行結果task1task5task4task3task2

可以看到,雖然 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,html' target='_blank'>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方法定義自己的優先級處理機制。

 ?phpclass 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教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交xxxx黑人猛交| 国产精品入口日韩视频大尺度| 欧美性20hd另类| 中文字幕亚洲综合| 在线精品高清中文字幕| 国产专区精品视频| 国产日本欧美一区| www.美女亚洲精品| 亚洲人在线观看| 91精品视频大全| 日韩激情视频在线播放| 5566日本婷婷色中文字幕97| 欧美一区二区视频97| 狠狠干狠狠久久| 亚洲视频在线看| 国产精品久久久久久久av电影| 国产乱人伦真实精品视频| 国产精品欧美久久久| 欧美日韩午夜剧场| 欧美性高潮在线| 中文字幕日韩av| 久久亚洲精品国产亚洲老地址| 国产人妖伪娘一区91| 亚洲最大成人在线| 国产精品久久久久aaaa九色| 欧美国产日韩一区二区| 欧美在线免费看| 亚洲最新av在线网站| 人九九综合九九宗合| 国产亚洲一区精品| 国产精品亚洲第一区| 国产不卡av在线免费观看| 国产综合福利在线| 欧美成人激情视频| 欧美午夜电影在线| 亚洲国产欧美一区二区丝袜黑人| 国产精品视频大全| 深夜福利一区二区| 国产精品福利小视频| 精品国产一区二区三区四区在线观看| 午夜精品久久久久久久白皮肤| 亚洲一区二区久久久| 久久久久亚洲精品成人网小说| 欧美最近摘花xxxx摘花| 国产精品久久91| 亚洲综合av影视| 欧美视频在线免费| 亚洲国产成人精品一区二区| 欧美性极品少妇精品网站| 欧美午夜片在线免费观看| 91色p视频在线| 欧美精品免费在线观看| xxxx欧美18另类的高清| 亚洲国产欧美一区二区三区久久| 久久99精品久久久久久噜噜| 国模gogo一区二区大胆私拍| 久久久久这里只有精品| 亚洲最大福利视频网| 色综合久久88| 亚洲乱码国产乱码精品精天堂| 高清欧美性猛交| 正在播放国产一区| 久久久精品日本| 亚洲免费人成在线视频观看| 日韩精品久久久久久久玫瑰园| 亚洲性日韩精品一区二区| 国外视频精品毛片| 久久69精品久久久久久国产越南| 日韩av有码在线| 91精品国产乱码久久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 日韩亚洲欧美中文高清在线| www.99久久热国产日韩欧美.com| 亚洲在线视频观看| 日韩精品在线免费播放| 久久精品久久久久| 欧美日韩一区二区在线播放| 中文字幕最新精品| 亚洲黄在线观看| 国产成人鲁鲁免费视频a| 中文字幕日韩在线视频| 亚洲毛茸茸少妇高潮呻吟| 日韩av在线高清| 欧美色视频日本高清在线观看| 久久久精品网站| 伊人男人综合视频网| 久久影院资源网| 国产精品亚洲一区二区三区| 亚洲色图av在线| 午夜精品久久久99热福利| 亚洲自拍小视频免费观看| 欧美激情综合色综合啪啪五月| 成人信息集中地欧美| 国产成人福利夜色影视| 欧美日韩aaaa| 日本精品视频网站| 中文字幕综合在线| 欧美激情第一页xxx| 国自产精品手机在线观看视频| 91精品国产综合久久香蕉的用户体验| 亚洲天堂日韩电影| 国产欧美婷婷中文| 欧美裸体xxxx极品少妇软件| 91嫩草在线视频| 日韩中文字幕网站| 亚洲精品美女久久久| 国产精品视频一区二区三区四| 美女久久久久久久| 国产日韩在线亚洲字幕中文| 国产精品丝袜一区二区三区| 久久影视电视剧凤归四时歌| 92福利视频午夜1000合集在线观看| 欧美老妇交乱视频| 欧美日韩国产精品一区| 欧美性理论片在线观看片免费| 久久久久久久久久久91| 91精品国产高清久久久久久久久| 亚洲人成毛片在线播放| 色婷婷av一区二区三区在线观看| 国产成人福利夜色影视| 国产精品久久久久久久久久久久久| 中文字幕久热精品视频在线| 欧美一级bbbbb性bbbb喷潮片| 国产剧情日韩欧美| 日韩高清电影好看的电视剧电影| 久久av中文字幕| 国产一区二区三区在线| 色噜噜久久综合伊人一本| 亚洲福利影片在线| 亚洲国产欧美一区| 国产精品久久中文| 97精品国产97久久久久久免费| 亚洲第一色在线| 中文字幕日韩精品在线观看| 中文字幕国产精品| 久久久精品国产亚洲| 日韩欧美中文字幕在线播放| 欧美大尺度激情区在线播放| 黑人与娇小精品av专区| 日韩成人av网址| 亚洲精品在线观看www| 一区二区三区动漫| 在线观看久久久久久| 欧美床上激情在线观看| 亚洲色图35p| 亚洲大胆人体在线| 日本精品免费一区二区三区| 国产一区二区色| 91精品国产91久久久久久不卡| 国产精品视频免费观看www| 91精品国产91久久久久久不卡| 国产精品久久久久77777| 国产精品一区二区在线| 亚洲综合第一页| 久久精品一区中文字幕| 欧美综合国产精品久久丁香| 777国产偷窥盗摄精品视频| 久久久精品视频在线观看| 亚洲一区二区久久久久久久| 亚洲激情视频在线播放| 亚洲人成绝费网站色www| 国内外成人免费激情在线视频网站| 欧美一级大片视频| 亚洲欧美激情在线视频|