Latihan berikut telah dibagikan kepada siswa yang saya awasi:
Dengan titik di pesawat, buatlah algoritma yang menemukan sepasang titik yang jaraknya minimal di antara semua pasangan titik. Algoritme harus berjalan dalam waktu .o ( n 2 )
Ada algoritma membagi dan menaklukkan (relatif) sederhana yang menyelesaikan tugas dalam waktu .
Pertanyaan 1 : Apakah ada algoritma yang memecahkan masalah yang diberikan tepat pada waktu terburuk ?
Apa yang membuat saya curiga bahwa ini mungkin terjadi adalah hasil yang saya ingat pernah saya lihat dalam beberapa pembicaraan (referensi dihargai). Ini menyatakan sesuatu di sepanjang garis yang tidak lebih dari angka konstan titik dapat diatur dalam pesawat di sekitar beberapa titik di dalam lingkaran jari-jari , dengan jarak minimal antara dua titik yang terlibat . Saya pikir , titik-titik yang membentuk segi enam sama sisi dengan di tengah (dalam kasus ekstrim).
Dalam hal ini, algoritma berikut harus menyelesaikan masalah mereka dalam langkah .
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
Perhatikan bahwa ini (diklaim sebagai) dalam waktu linier karena hanya jumlah titik yang konstan r
tidak boleh jauh m
dari p
(dengan asumsi pernyataan di atas); hanya poin-poin ini yang harus diselidiki untuk menemukan minimum baru. Ada tangkapan, tentu saja; bagaimana Anda menerapkan nextNeighbour
(mungkin dengan preprocessing dalam waktu linier)?
Pertanyaan 2 : Biarkan satu set poin dan titik p ∉ R . Biarkan m ∈ R dengan
dan
.
Asumsikan terbatas. Apakah mungkin untuk menemukan dengan jarak minimal dari dalam waktu (diamortisasi) ? (Anda dapat mengasumsikan dibangun dengan menambahkan titik yang diselidiki satu per satu.) p ' ∈ R p , m p O ( 1 ) R p