2009-09-08 37 views
5

Đây hy vọng là một câu hỏi toán học rất đơn giản. Nếu tôi có hai dãy số, cách đơn giản nhất và hiệu quả nhất để kiểm tra là gì nếu họ xung đột, ví dụ:Phát hiện xem hai dải số có xung đột không

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 

Tôi hiện đang có đống lộn xộn này, nhưng phải có một cách đơn giản hơn nhiều để làm việc kiểm tra này:

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

Trả lời

11

Vâng, trước tiên hãy chắc chắn rằng bạn đã cặp cũng theo lệnh (có thể là một ý tưởng tốt dù sao, tùy thuộc vào những gì bạn định làm gì với chúng):

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; 
} 

Sau đó, bạn sẽ có thể đơn giản hóa để:

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

Chỉnh sửa: Rất tiếc, đã kiểm tra ngược! Hãy thử:

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

Tôi vừa đăng bài :-) +1 để nhanh hơn. –

+6

hoặc, không có phủ định: '$ clash = ($ b1 <= $ a2) && ($ a1 <= $ b2)' – sth

+0

Xin cảm ơn, điều đó thật tuyệt. –

2

Các dãy KHÔNG xung đột khi và chỉ khi $ a2 < = $ b1 hoặc $ a1> = $ b2 (giả định rằng dãy được cho là cặp có thứ tự). Bây giờ phủ nhận điều kiện.

+1

Điều gì sẽ xảy ra nếu $ a1> = $ b2? Không đụng độ nữa. –

+0

Chúng tôi cũng giả định rằng luôn luôn là trường hợp $ a1 <$ a2 và $ b1 <$ b2. –

+0

@Matthew: Right @jeffamaphone: Vâng, đó là ý của bạn là "phạm vi", phải không? –

7

Tôi nghĩ rằng nó nên càng đơn giản như thế này:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW 
0

gì bạn đang tìm kiếm là giao điểm của các mảng. http://us3.php.net/array_intersect

Về cơ bản,

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

Nếu bất kỳ yếu tố nằm trong cả $ arr1 và $ arr2, sau đó $ giao nhau sẽ liệt kê những giá trị đó. Hàm count() trả về 1 (hoặc nhiều hơn), do đó làm> 0 cung cấp cho bạn nếu $ arr1 và $ arr2 có bất kỳ phần tử tương tự nào.

3

dụ:
10-20
4-11 // này sẽ xung đột với trên
1-5 // này sẽ xung đột với trên
40-50
cửa hàng số của bạn trong 2 mảng, nói
x_array = mảng (10,4,11,40);
y_array = mảng (20,11,5,50);

asort ($ x_array); // chỉ sắp xếp các giá trị mảng dải ô x đầu tiên và duy trì chỉ mục
$ max_val = -1;
$ last_index = 0;
foreach ($ x_array như $ each_index => $ each_x) {
    // lấy giá trị tương ứng y
    $ this_y = $ y_array [$ each_index];
    echo "$ this_y < $ max_val";
    if ($ each_x> $ max_val & & $ this_y> $ max_val) {
        $ max_val = $ this_y;
   }
    else {
        $ last_x = $ x_array [$ last_index];
        $ last_y = $ y_array [$ last_index];
        echo "Lỗi: Trùng lặp giữa: ($ each_x, $ this_y) và ($ last_x, $ last_y)";
   }
    $ last_index = $ each_index;
}

Các vấn đề liên quan