成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP 優(yōu)先級隊列:SplPriorityQueue

趙春朋 / 3192人閱讀

摘要:迭代的話會刪除隊列元素指針始終指向所以沒什么意義出隊出隊更為友好,即始終返回優(yōu)先級最高的元素,優(yōu)先級相投時會以堆調(diào)整的特性返回數(shù)據(jù)。自定義優(yōu)先級處理方式重寫方法定義自己的優(yōu)先級處理機制。高優(yōu)先級優(yōu)先低優(yōu)先級優(yōu)先

PHPSPL 庫內(nèi)置了 SplPriorityQueue優(yōu)先級隊列,并且是以Heap數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,默認為MaxHeap模式,即priority越大越優(yōu)先出隊,同時可以通過重寫compare方法來使用MinHeap(優(yōu)先級越低越優(yōu)先出隊,場景貌似很少吧)。

SplPriorityQueue 堆特性

這里需要注意并理解:SplPriorityQueue是以數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)的,當我們出隊時會拿出堆頂的元素,此時的特性被破壞,會進行相應(yīng)的調(diào)整至穩(wěn)定態(tài)(MaxHeap or MinHeap),即會將最后一個元素替換到堆頂,然后進行穩(wěn)定態(tài)驗證,不符合堆特性則繼續(xù)調(diào)整,或者我們就得到了一個穩(wěn)定態(tài),所以當優(yōu)先級相同,出隊順序并不會按照入隊順序。

源碼示例:

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;

//執(zhí)行結(jié)果
task1
task5
task4
task3
task2

可以看到,雖然 5 個任務(wù)的優(yōu)先級相同,但隊列并沒有按照入隊順序返回數(shù)據(jù),因為的特性使然:
1、入隊 task1, task2, task3, task4, task5,因為優(yōu)先級相同,所以堆一直處于穩(wěn)定態(tài)。
2、出隊,得 task1,堆先將結(jié)構(gòu)調(diào)整為 task5, task2, task3, task4,已然達到了穩(wěn)定態(tài)。
3、出隊,得 task5,堆先將結(jié)構(gòu)調(diào)整為 task4, task2, task3,已然達到了穩(wěn)定態(tài)。
4、出隊,得 task4,堆先將結(jié)構(gòu)調(diào)整為 task3, task2,已然達到了穩(wěn)定態(tài)。
5、出隊,得 task3,堆先將結(jié)構(gòu)調(diào)整為 task2,已然達到了穩(wěn)定態(tài)。
4、出隊,得 task2。

Iterator, Countable

SplPriorityQueue實現(xiàn)了 Iterator, Countable接口,所以我們可以foreach/count函數(shù)操作它,或者使用rewind,valid,current,next/count方法。

注意,因為是實現(xiàn),所以rewind方法是一個no-op沒有什作用的操作,因為頭指針始終指向堆頂,即current始終等于top,不像List只是游走指針,出隊是會刪除堆元素的,extract = current + next(current出隊,從堆中刪除)。

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 出隊更為友好,即始終返回優(yōu)先級最高的元素,優(yōu)先級相投時會以堆調(diào)整的特性返回數(shù)據(jù)。

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;
}
自定義優(yōu)先級處理方式

重寫compare方法定義自己的優(yōu)先級處理機制。

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());
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31100.html

相關(guān)文章

  • 【SPL標準庫專題(7)】Datastructures:SplPriorityQueue

    摘要:普通的隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭取出。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當訪問元素時,具有最高優(yōu)先級的元素最先取出。優(yōu)先隊列具有最高級先出,的行為特征。 普通的隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭取出。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當訪問元素時,具有最高優(yōu)先級的元素最先取出。優(yōu)先隊列具有最高級先出 (largest-in,first...

    mindwind 評論0 收藏0
  • Swoft 源碼解讀

    摘要:官網(wǎng)源碼解讀號外號外歡迎大家我們開發(fā)組定了一個就線下聚一次的小目標里面的框架算是非常重的了這里的重先不具體到性能層面主要是框架的設(shè)計思想和框架集成的服務(wù)讓框架可以既可以快速解決很多問題又可以輕松擴展中的框架有在應(yīng)該無出其右了這次解讀的源碼 官網(wǎng): https://www.swoft.org/源碼解讀: http://naotu.baidu.com/file/8... 號外號外, 歡迎大...

    weij 評論0 收藏0
  • Redis 實現(xiàn)隊列

    摘要:場景說明用于處理比較耗時的請求,例如批量發(fā)送郵件,如果直接在網(wǎng)頁觸發(fā)執(zhí)行發(fā)送,程序會出現(xiàn)超時高并發(fā)場景,當某個時刻請求瞬間增加時,可以把請求寫入到隊列,后臺在去處理這些請求搶購場景,先入先出的模式命令或往列表右側(cè)推入數(shù)據(jù)客戶端阻塞直到隊列有 場景說明: 用于處理比較耗時的請求,例如批量發(fā)送郵件,如果直接在網(wǎng)頁觸發(fā)執(zhí)行發(fā)送,程序會出現(xiàn)超時 高并發(fā)場景,當某個時刻請求瞬間增加時,可以把請...

    PascalXie 評論0 收藏0
  • Redis 實現(xiàn)隊列

    摘要:場景說明用于處理比較耗時的請求,例如批量發(fā)送郵件,如果直接在網(wǎng)頁觸發(fā)執(zhí)行發(fā)送,程序會出現(xiàn)超時高并發(fā)場景,當某個時刻請求瞬間增加時,可以把請求寫入到隊列,后臺在去處理這些請求搶購場景,先入先出的模式命令或往列表右側(cè)推入數(shù)據(jù)客戶端阻塞直到隊列有 場景說明: 用于處理比較耗時的請求,例如批量發(fā)送郵件,如果直接在網(wǎng)頁觸發(fā)執(zhí)行發(fā)送,程序會出現(xiàn)超時 高并發(fā)場景,當某個時刻請求瞬間增加時,可以把請...

    lifesimple 評論0 收藏0
  • Redis 實現(xiàn)隊列

    摘要:場景說明用于處理比較耗時的請求,例如批量發(fā)送郵件,如果直接在網(wǎng)頁觸發(fā)執(zhí)行發(fā)送,程序會出現(xiàn)超時高并發(fā)場景,當某個時刻請求瞬間增加時,可以把請求寫入到隊列,后臺在去處理這些請求搶購場景,先入先出的模式命令或往列表右側(cè)推入數(shù)據(jù)客戶端阻塞直到隊列有 場景說明: 用于處理比較耗時的請求,例如批量發(fā)送郵件,如果直接在網(wǎng)頁觸發(fā)執(zhí)行發(fā)送,程序會出現(xiàn)超時 高并發(fā)場景,當某個時刻請求瞬間增加時,可以把請...

    LoftySoul 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<