Bài tập sau đây đã được trao cho các sinh viên mà tôi giám sát:
Cho điểm trong mặt phẳng, nghĩ ra thuật toán tìm một cặp điểm có khoảng cách là tối thiểu trong số tất cả các cặp điểm. Thuật toán sẽ chạy trong thời gian .
Có một (tương đối) đơn giản thuật toán chia để trị mà giải quyết được nhiệm vụ trong thời gian .
Câu hỏi 1 : Có thuật toán nào giải quyết chính xác vấn đề đã cho trong trường hợp xấu nhất không?
Điều khiến tôi nghi ngờ rằng điều này có thể là có thể là kết quả mà tôi nhớ đã thấy trong một số cuộc nói chuyện (tham khảo đánh giá cao). Nó nói cái gì đó dọc theo dòng mà không quá một hằng số điểm có thể được sắp xếp trong mặt phẳng xung quanh một số điểm bên trong một vòng tròn bán kính , với là khoảng cách tối thiểu giữa bất kỳ hai trong số những điểm tham gia . Tôi nghĩ , các điểm tạo thành một hình lục giác đều có ở tâm (trong trường hợp cực trị).
Trong trường hợp đó, thuật toán sau sẽ giải quyết vấn đề theo bước.
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
Lưu ý rằng điều này (tự xưng là) trong thời gian tuyến tính bởi vì chỉ có một hằng số điểm trong r
thể có farer xa hơn m
từ p
(giả sử ở trên tuyên bố); chỉ những điểm này phải được điều tra để tìm ra mức tối thiểu mới. Có một nắm bắt, tất nhiên; Làm thế nào để bạn thực hiện nextNeighbour
(có thể với tiền xử lý trong thời gian tuyến tính)?
Câu hỏi 2 : Hãy để một tập hợp các điểm và một điểm p ∉ R . Cho m ∈ R với
và
.
Giả sử là hữu hạn. Có thể tìm thấy với khoảng cách tối thiểu từ trong thời gian (khấu hao) không? (Bạn có thể giả sử được xây dựng bằng cách thêm từng điểm đã điều tra .) p ' ∈ R p , m p O ( 1 ) R p