Denetlediğim öğrencilere aşağıdaki alıştırmalar yapıldı:
Düzlemdeki nokta verildiğinde , tüm nokta çiftleri arasındaki mesafenin minimum olduğu bir çift nokta bulan bir algoritma geliştirin. Algoritma o (n ^ 2) zamanında çalışmalıdır .
Görevi zamanında çözen (nispeten) basit bir böl ve fethet algoritması vardır .
Soru 1 : Verilen problemi en kötü zamanda tam olarak çözen bir algoritma var ?
Bunun mümkün olabileceğinden şüphelenmemi sağlayan şey, bazı konuşmalarda gördüğümü hatırladığım bir sonuç (referans takdir). O fazla olmayan sabit bir sayıdan çizgisinde bir şey ifade bir noktada yaklaşık düzlemde düzenlenmiş olabilir noktalarının yarıçapı bir daire içinde ile, ilgili iki nokta arasındaki minimum mesafe. Bence , ortada ile eşdeğer bir altıgen oluşturan noktalar (aşırı durumda). p r ∈ R r c = 7 p
Bu durumda, aşağıdaki algoritma sorunu adımda çözmelidir .
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
Bunun lineer zamanda olduğunu (iddia edildiği gibi) unutmayın, çünkü sadece sabit bir sayıdaki nokta , (yukarıdaki ifadeyi varsayarak) ' r
den daha uzakta olamaz ; yeni bir minimum bulmak için sadece bu noktaların araştırılması gerekir. Elbette bir av var; nasıl uygularsınız (belki doğrusal zamanda ön işleme ile)?m
p
nextNeighbour
Soru 2 : Bir dizi ve bir noktası olsun . Let ilep ∉ R m ∈ R
ve
.
nin sonlu olduğunu varsayın . 'de (amortismanlı) zaman de minimum mesafe ile bulmak mümkün müdür ? ( İncelenen noktaları tek tek ekleyerek inşa edileceğini varsayabilirsiniz .)