平均分配算法

平均分配有2种情况

1)都没有记录的时候,平均分配。

若11个元素,4个cpu,则分配数量为(2, 3, 3, 3),每次分配的起点终点表示区间为

[list*seqno/taskCounters, list*(seqno+1)/taskCounters]

11个数,平均分给4个CPU

header("Content-type: text/html; charset=utf-8");
$list = 11;
$taskCounters = 4;
$result = [];
for ($taskNumber = 0; $taskNumber < $taskCounters; $taskNumber++) {
    $seqno = $taskNumber;
//$max = intval($list * ($seqno + 1) / $taskCounters);
//$j = intval($list * $seqno / $taskCounters);
    $max = $list * ($seqno + 1) / $taskCounters;
    $j = $list * $seqno / $taskCounters;
    echo "每次分配的起点终点表示区间为:{$j}--{$max}<br/>";
    for ($i = $j; $i < $max; $i++) {
        $result[$taskNumber][] = $i;
    }
}

 场景2:已经有记录了,分配时要保证总量的平均。(比如:每人分3个,有的人已经有2个了,就只需要分1个了)

$list = 14;
$taskCounters = 4;
$result = [['a'], ['b', 't', 'm'], ['c', 'd'], []];
for ($i = 0; $i < $list; $i++) {
    foreach ($result as $taskNumber => $info) {
        $result_count[$taskNumber] = count($info);
    }
    $minTaskNumber = array_search(min($result_count), $result_count);
    if (min($result_count) < max($result_count)) { //排除相等
        $result[$minTaskNumber][] = $i;
    } else {
        $taskNumber = $i % $taskCounters;
        $result[$taskNumber][] = $i;
    }
}

猜你喜欢

转载自hudeyong926.iteye.com/blog/2414525
今日推荐