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
sumber
Jawaban:
Tidak mungkin menyelesaikan masalah dalam waktu kurang dari dalam model standar, misalnya menggunakan pohon keputusan aljabar. Ini mengikuti dari karya Yao dan Ben-Or yang menunjukkan bahwa dalam model ini tidak mungkin untuk memutuskan apakah satu set nomor input semuanya berbeda atau tidak (lihat http://people.bath.ac.uk/masnnv /Teaching/AAlg11_8.pdf ). Jika ada masalah Anda, bayangkan semuanya berada di garis nyata. Jika dua titik adalah sama, maka output Anda akan menjadi dua titik dengan jarak nol, sedangkan sebaliknya tidak, jadi solusi untuk masalah Anda juga akan menyelesaikan masalah DISTINCT NUMBERS. Jika Anda ingin menganggap bahwa semua poin Anda berbeda, maka tambahkan saja ken i ϵ x i n ϵ 2 n ϵ Ω ( n log n )cnlogn n iϵ xi input dari masalah DISTINCT NUMBERS, dalam hal ini jika output Anda paling banyak , maka angkanya tidak semuanya berbeda. (Meskipun dalam hal ini Anda harus menggunakan versi janji di mana perbedaan dua angka berbeda setidaknya , tapi saya pikir bukti yang sama berfungsi untuk menunjukkan bahwa Anda juga memerlukan dalam hal ini kasus.)nϵ 2nϵ Ω(nlogn)
sumber
Ada algoritma waktu linear yang diharapkan secara acak oleh Rabin; lihat misalnya Rabin Membalik Koin di blog Lipton.
sumber
Seperti yang saya mengerti pertanyaan 2, algoritma Rabin menyediakan semacam jawaban untuk itu juga. Pada setiap langkah waktu struktur data adalah kisi dengan lebar sel kurang dari jarak terkecil antara pasangan titik yang terlihat sejauh ini, dibagi dengan (sehingga tidak ada sel yang mengandung lebih dari satu titik tunggal). Untuk menjawab pertanyaan dalam pertanyaan 2, Anda hanya perlu memetakan ke sel di grid dan melihat jumlah sel yang konstan di sekitarnya. Dengan analisis algoritma, jika set titik input diperiksa dalam urutan acak, daripada waktu pembaruan diamortisasi untuk grid adalah per titik baru dalam harapan. pO(1)2–√ p O(1)
sumber