(二)動態輪循排程演算法實現

2021-09-03 08:54:49 字數 1951 閱讀 5516

想看上篇的童鞋請移步靜態輪循排程演算法實現

上篇說到,使用取模方式,沒有辦法實現公平輪詢排程,於是有了這篇,採用引用計數的方式實現動態輪詢排程。如下:

<?php

/** * class roundcounter

* 動態公平迴圈分配實現演算法

* 原理:

* 通過整體迴圈計數和成員迴圈計數實現輪循排程

* 資料結構:

* * 許可權人員集合 [1,2,3,4,5]

* 本組的輪循次數 1

* 人員初始化輪循次數:0

* * 測試操作:

* 1.人員狀態變更

* 2.組內人員變更 (不公平)

*/class roundcounter

}echo '當前組內成員: '.json_encode($this->membersinfo).php_eol;

}//人員上/下線

private function initstatus($member)

//todo 加減組內成員 如果能實現動態輪尋就完美了 靜態有漏洞 會掠過部分客服

public function changegroupmembers()

//獲取當前組成員列表

public function getmembers()

//重置迴圈

public function resetloop()

}public function choose()

$member1 = ;

foreach($this->membersinfo as &$member)

}//輪循

if(!$member1)

}}//測試引數

$a = new roundcounter([1,2,3,4,5]);

echo '----第一輪排程-----'.php_eol;

for($i = 1;$i<100;$i++)

$a->choose();

echo '----結束-----'.php_eol;

echo '----修改組內客服-----'.php_eol;

$a->changegroupmembers();

echo '----第二輪循排程-----'.php_eol;

for($i = 1;$i<100;$i++)

執行結果:

macbook-2:desktop lemon$ php roundcounter.php

當前組內成員: [,,,]

----第一輪排程-----

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

----結束-----

----修改組內客服-----

新增成員:6

----第二輪循排程-----

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

分配給:

引用計數的方式,雖然看起來不那麼高大上,比較樸素,但是卻是最行之有效的方法。因為是原子操作,每個個體不受成員數量變更帶來的演算法影響,所以可以保證公平排程。(^__^) 嘻嘻……

有時候還是要仔細想想,多問問自己為什麼這樣寫,是不是可以換個思路做的更好,才能不斷進步。

(完)

(一)靜態輪循排程演算法實現

有一堆組,每組成員不定時進出組,且組內成員會有狀態,要求實現請求過來時,輪詢分配給特定狀態的成員。於是想到了經典的round robin演算法,根據業務寫了個demo,如下 class roundrobin 不公平迴圈分配實現演算法 原理 通過取模實現輪循排程 資料結構 許可權人員集合 1,2,3,...

通訊錄的實現(二)動態實現

動態實現實現通訊錄,就需要使用malloc和realloc等這些函式,首先我們先來介紹一下這些函式。1 void malloc unsigned int size size是需要分配的位元組數。2 void calloc unsigned int num elements,unsigned int ...

演算法練習 跳躍遊戲二(動態規劃)

題目描述 給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。你的目標是到達最後乙個下標,並且使用最少的跳躍次數。例如 a 2,3,1,1,4 到達最後乙個下標的最少跳躍次數為 2。先跳躍 1 步,從下標 0 到 1,然後跳躍 3步,到達最後乙...