php撮合算法
在同一平台中买卖交易,需要进行订单撮合。相近的金额从大到小递减组合。期初想用mq分别匹配整数的金额倍数处理,总觉的不太完美。最近刚好有空就找到了猴子选大王算法:
function King($monkeys_arr,$m)
{
$i = 0;
$finsh=[];
while(count($monkeys_arr)>1)
{
$i++;
if($i>count($monkeys_arr)) break;
$head = array_shift($monkeys_arr);
if ($head%$m != 0) {
array_push($monkeys_arr, $head);
continue;
}
$finsh[]=$head;
}
return $finsh;
}
$a=king([1,2,6,3,4,8,7],7);
var_dump($a);
根据以上算法改造一下。
先确定匹配金额顺序,即做降序排列。
然后每次匹配到小于指定金额后,减去此金额。把匹配金额赋值为差结果。
依次类推。
在这过程中记录匹配到的金额、最后差值的余额。
撮合代码如下:
function marriedDeal($arr, $change_number)
{
$i = 0;
$finsh = []; //匹配到的金额
$default_total = count($arr);
if($default_total==0) return [];
arsort($arr);
$blance = 0; //最后余额
while ($default_total >= 1) {
$i += 1;
if ($i > $default_total || $change_number <= 0) break;
$head = array_shift($arr);
if ($head > $change_number) {
array_push($arr, $head);
continue;
}
$finsh[] = $head;
$change_number -= $head;
$blance = $change_number;
}
return [$finsh, $blance, $arr];
}
$get_number = marriedDeal([120, 200, 220, 400, 20, 320, 180], 311);
print_r($get_number);