5

希望这是一个非常简单的数学问题。如果我有两个数字范围,检查它们是否冲突的最简单和最有效的方法是什么,例如:

10-20 and 11-14 // clash as B is contained in A
11-15 and 20-22 // don't clash
24-26 and 20-30 // clash as A is contained in B
15-25 and 20-30 // clash as they overlap at each end

我目前有这个混乱,但必须有一个更简单的方法来做这个检查:

$clash = ($b1 >= $a1 && $b1 <= $a2)
    || ($b2 >= $a1 && $b2 <= $a2)
    || ($a1 >= $b1 && $a1 <= $b2)
    || ($a2 >= $b1 && $a2 <= $b2);
4

5 回答 5

11

好吧,首先确保你有井井有条的对(无论如何这可能是个好主意,这取决于你打算用它们做什么):

if($a1 > $a2) {
    // swap $a1 and $a2
    $temp = $a1;
    $a1 = $a2;
    $a2 = $temp;
}
if($b1 > $b2) {
    // swap $b1 and $b2
    $temp = $b1;
    $b1 = $b2;
    $b2 = $temp;
}

然后你应该能够简化为:

$clash = ($a2 <= $b1) || ($a1 >= $b2);

编辑:哎呀,测试倒退了!尝试:

$clash = !(($a2 <= $b1) || ($a1 >= $b2));
于 2009-09-08T22:10:41.457 回答
9

我认为它应该像这样简单:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW
于 2009-09-08T22:11:48.147 回答
3

示例:
10 - 20
4 - 11 // 这将与上述
1 - 5 冲突 // 这将与上述
40 - 50冲突
将您的数字存储在 2 个数组中,例如
x_array = array(10,4,11,40);
y_array = 数组(20,11,5,50);

排序($x_array);// 仅排序前 x 范围数组值并保持索引
$max_val = -1;
$last_index = 0;
foreach($x_array as $each_index => $each_x){
  // 获取y对应的值
  $this_y = $y_array[$each_index];
  回声“$this_y < $max_val”;
  if($each_x > $max_val && $this_y > $max_val){
    $max_val = $this_y;
  }
  其他{
    $last_x = $x_array[$last_index];
    $last_y = $y_array[$last_index];
    echo "错误: ($each_x,$this_y) 和 ($last_x,$last_y) 之间的重叠";
  }
  $last_index = $each_index;
}

于 2011-01-25T15:13:50.090 回答
2

当且仅当 $a2 <= $b1 或 $a1 >= $b2 时,范围不会发生冲突(假设范围作为有序对给出)。现在否定条件。

于 2009-09-08T22:07:05.583 回答
0

您正在寻找的是数组的交集。http://us3.php.net/array_intersect

基本上,

$intersect = array_intersect($arr1, $arr2);
$clash = (count($intersect) > 0);

如果 $arr1 和 $arr2 中有任何元素,则 $intersect 将列出这些值。count() 调用返回 1(或更多),因此如果 $arr1 和 $arr2 有任何相似的元素,则 > 0 会告诉您。

于 2009-09-08T22:23:29.107 回答