线性数据交叉判断

class InterleavingCompare{

    /**
     * 查看a和b是否与c和d存在交错
     * @param $a 预设的开始值
     * @param $b 预设的截至值
     * @param $c 已存在的开始值
     * @param $d 已存在的截至值
     * @return boolean
    */
    public function is($a, $b, $c, $d){
        //此处减一,用于处理整点的问题(开始时间:2000-10-10 20:00:00  截止时间:2000-10-10 20:00:00)
        $arr = $this->swapArray(array($a+1, $b-1, $c, $d));
        $vertexA = $this->swap($arr[0], $arr[1]);
        $vertexB = $this->swap($arr[2], $arr[3]);
        $vertexC = $this->swap($vertexA['max'], $vertexB['min']);
        return ($vertexA['max'] === $vertexC['max'] && $vertexB['min'] === $vertexC['min']);
    }

    /**
     * 根据a和b的第一个元素来比较大小,然后对值进行交换(需要的话)
     * @param array
    */
    protected function swapArray($a){
        $arr = $this->swap($a[0], $a[2]); //比较起始值
        //$a[0]不是最小值,交换位置: 0,1=>2,3  2,3=>0,1
        if($arr['min'] !== $a[0]){
            $a = array($a[2], $a[3], $a[0], $a[1]);
        }
        return $a;
    }

    /**
     * 从a和b中找到最小值,然后对值进行交换(需要的话)
     * @param $a
     * @param $b
     * @return array 交换后的数组(需要交换的话)min = 最小值,max = 最大值
    */
    protected function swap($a, $b){
        return array(
            'min'=>min(array($a, $b)),
            'max'=>max(array($a, $b))
        );
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值