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))
);
}
}
线性数据交叉判断
最新推荐文章于 2022-07-09 02:23:43 发布