Cách dễ nhất để tìm giao điểm của hai khoảng


8

Ngay bây giờ tôi bị mắc kẹt với một vấn đề. Nó có vẻ là một điều thực sự tầm thường, nhưng tôi vẫn khó tìm được giải pháp thích hợp. Vấn đề là: Người ta có hai khoảng và phải tìm giao điểm của chúng.

Ví dụ:

  • Giao điểm của [0, 3] & [2, 4][2, 3]
  • Giao điểm của [-1, 34] & [0, 4][0, 4]
  • Giao lộ của [0, 3] & [4, 4]tập hợp trống

Một điều khá rõ ràng là vấn đề có thể được giải quyết bằng cách sử dụng các bài kiểm tra của tất cả các trường hợp có thể, nhưng nó sẽ mất rất nhiều thời gian và rất dễ xảy ra sai lầm. Có cách nào dễ dàng hơn để giải quyết vấn đề? Nếu bạn biết giải pháp giúp tôi, xin vui lòng. Sẽ rất biết ơn.


Có gì sai với câu hỏi của tôi? Tại sao nó được bỏ phiếu xuống?
ohidano

2
Một vài điều .. đây có vẻ là một câu hỏi bài tập về nhà, nếu đó là bạn nên gọi nó ra và gắn thẻ như vậy. Bối cảnh của vấn đề của bạn cũng không rõ ràng. Nó có thể được hiểu là hoàn toàn là một vấn đề toán học (trong trường hợp đó nó thuộc về Math.SE, không phải ở đây), hoặc một bài tập lập trình.
Spencer Bryngelson

Trong trường hợp bạn đang tìm kiếm tên cho các phương thức này, nó được gọi là Số học Interval .
André

Câu trả lời:


17

Chúng ta có thể định nghĩa một giải pháp cho vấn đề này theo cách sau. Giả sử các khoảng đầu vào có thể được định nghĩa là và , trong khi khoảng đầu ra được xác định là . Chúng ta có thể tìm thấy giao điểm làm như sau:Ia=[as,ae]Ib=[bs,be]Io=[os,oe]Io=IaIb

if ( hoặc ) { return }bs>aeas>be

khác {

os=max(as,bs)

oe=min(ae,be)

trở lại [os,oe]

}


1

Giả sử chúng ta chỉ có hai khoảng đầu vào.

  1. Đảm bảo thời gian bắt đầu của khoảng đầu tiên <thời gian bắt đầu của khoảng thứ hai.
  2. Chồng chéo có nghĩa là thời gian kết thúc của một khoảng thời gian là sau thời gian bắt đầu của một khoảng thời gian khác
public int[] overlap(int[] i1, int[] i2) {
    // Make sure the start time of first interval < the start time of second interval.
    if(i1.startTime > i2.startTime) {
        return overlap(i2, i1);
    }

    // Overlap means an interval's end time is after another interval's start time
    if(i1.endTime > i2.startTime) {
        return new Interval(i2.startTime, Math.min(i1.endTime, i2.endTime));
    }
    else {
        return null;
    }
}
  • Độ phức tạp thời gian: O (1)
  • Độ phức tạp không gian: O (1)

0

Một cách đơn giản khác

Cho trước:
2 Khoảng thời
gian 1 : (start1, end1)
Khoảng 2 : (start2, end2)

Yêu cầu:
Điều kiện Boolean để kiểm tra xem cả hai khoảng có giao nhau hay không

Giải pháp:
Theo các điều kiện TWO nên đúng khi xem xét 2 khoảng cách được giao nhau:
1. end2> = start1
2. start2 <= end1

// check 2 intervals are intersected or not
if( (end2 >= start1) && (start2 <= end1) ){
    // 2 intervals are intersected
    // ...

}else{
    // 2 intervals are NOT intersected
    // ...

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.