php撮合算法

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值