Tìm một điểm được chia sẻ bởi các phân đoạn tối đa


7

Với: phân đoạn (mảng) của số nguyên ra lệnh, số nguyên có thể là từ để .N-KK

Thí dụ:

Segment 1: [-2,-1,0,1,2,3]
Segment 2: [1,2,3,4,5]
Segment 3: [-3,-2,-1,0,1]

Bạn có thể biểu diễn chúng dưới dạng [min, max] --- tương đương:

Segment 1: [-2,3]
Segment 2: [1,5]
Segment 3: [-3,1]

Làm cách nào tôi có thể tìm thấy một số nguyên thuộc về số lượng phân đoạn tối đa? Đối với ví dụ đã cho, nó là 1.

Tôi tìm kiếm các thuật toán hiệu quả nhất.

Câu trả lời:


11

Hãy sử dụng + để biểu thị sự bắt đầu của một phân khúc và -để biểu thị sự kết thúc. Đối với mỗi phân đoạn, tạo hai cặp, một cặp cho mỗi điểm cuối:

Segment1: (-2, +), (3, -)
Segment2: (1, +), (5, -)
Segment3: (-3, +), (1, -)

Sắp xếp 2Ncác cặp theo tọa độ đầu tiên của chúng (trong trường hợp bằng nhau, đặt + trước -). Bạn có thể làm điều này trong thời gianÔi(Nđăng nhậpN) với bất kỳ thuật toán sắp xếp hợp lý, hoặc trong thời gian Ôi(N+K)sử dụng tính năng lập chỉ mục chính . Trong ví dụ này, chúng tôi nhận được:

(-3, +)
(-2, +)
(1, +)
(1, -)
(3, -)
(5, -)

Bây giờ xử lý các điểm cuối theo thứ tự. Duy trì số lượng phân đoạn hoạt động, ban đầu là 0. Mỗi khi bạn xử lý một+, tăng số lượng lên 1. Mỗi khi bạn xử lý một -, giảm số đếm đi 1. Sau khi xử lý từng điểm cuối, kiểm tra xem số đếm mới có cao hơn số đếm lớn nhất cho đến nay không; nếu có, hãy cập nhật giải pháp của bạn.

(-3, +) -> count=1, max_count=0, sol=-3
(-2, +) -> count=2, max_count=1, sol=-2
(1, +) -> count=3, max_count=2, sol=1
(1, -) -> count=2, max_count=3, sol=1
(3, -) -> count=1, max_count=3, sol=1
(5, -) -> count=0, max_count=3, sol=1

Giai đoạn thứ hai của thuật toán này mất thời gian tỷ lệ thuận N. Toàn bộ thuật toán cần có thời gianÔi(Nđăng nhậpN) với một loại chung, hoặc Ôi(N+K) với tính năng lập chỉ mục chính.


1
Có một giải pháp thay thế bằng cách sử dụng cây phân khúc. Nhưng chi phí tiệm cận là như nhau.
Vincenzo

1
Vì các điểm cuối là các số nguyên giới hạn, bạn thậm chí có thể bỏ qua giai đoạn sắp xếp và chỉ cần đếm số lượng "vào" và "ra" trên mỗi vị trí (số nguyên 4 K).
Optidad

@Vince bạn phải tính đến thời gian đóng / mở kết thúc. Đó là những gì 4 trong 4 K, tôi đoán vậy?
John Dvorak

Cảm ơn. Vấn đề của tôi là câu trả lời trông giống như một voodoo. Nó không giải quyết vấn đề, nhưng không có lời giải thích nào có thể giải thích nó đúng. Về mặt bản thân, tôi tự giải thích điều đó bằng cách: "đi từ trái sang phải, chúng tôi tăng số lượng, tìm điểm chung, trong khi ngày càng nhiều phân khúc bắt đầu và thêm vào nhau như Liên minh ..; đi từ phải sang trái chúng tôi làm tương tự, nhưng nâng cao bộ đếm nếu hướng này chứa nhiều điểm chung hơn hướng trước ... ", nhưng thật khó hiểu tại sao" cạnh tranh chỉ đường "này lại mang lại kết quả đúng ... Không dễ dàng ...
Vladimir Nabokov

@VladimirNabokov, ý tưởng chính là trong giai đoạn thứ hai, biến đếm tại một điểm nhất định bằng với số phân đoạn giao nhau với điểm đó. Nhân tiện, chỉ có một lần đi qua, từ trái sang phải. Tôi nghĩ rằng nó sẽ dễ hiểu thuật toán nếu bạn lần đầu tiên hiểu tại sao nó chỉ hoạt động cho các trường hợp chỉ một phân khúc và hai phân khúc.
Vincenzo

1

Hãy xây dựng một loạt các kích thước 2 * k + 1 bài khởi tạo với 0. Đối với mỗi phân khúc có dạng [L, R], chúng tôi sẽ bổ sung thêm 1 tại L thứ index và trừ 1 từ R + 1 thứ chỉ mục.

Note : We add K to every values to shift the range from -K to +K to 0 to 2*K.

Bây giờ để có được kết quả, chúng tôi sẽ thực hiện tổng tiền tố.

array[i] = array[i-1] + array[i], where 1 <= i <= 2*K ( assuming 0-based indexing)

Đặt i là chỉ số có giá trị tối đa. Sau đó, câu trả lời sẽ là iK .
Hãy để chúng tôi giải quyết ví dụ được hỏi:

Let K = 5 and segments are [-2, 3], [1, 5] and [-3, 1]. Then after adding K the segments become
[3, 8], [6, 10] and [2, 6].
On performing the +1 and -1 updates our array will be
[0, 0, 1, 1, 0, 0, 1, -1, 0, -1, 0, -1].
Prefix sum will result into 
[0, 0, 1, 2, 2, 2, 3, 2, 2, 1, 1, 0].
Hence the index with max value is 6 and hence answer will be 6 - 5 = 1.

Độ phức tạp thời gian của phương pháp trên sẽ là O (max (N, K)) .

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.