Doğru görünen, ancak doğru olmayan algoritma ve prova örnekleri


15

Programlama dersine girişte, bir algoritmanın beklediğimizi yaptığını kanıtlamanın Başlatma-Bakım-Sonlandırma yöntemini öğreniyoruz. Ancak, sadece doğru olduğu bilinen bir algoritmanın doğru olduğunu kanıtlamak zorundaydık. Hiçbir zaman bir algoritmanın doğru olmadığını göstermemiz istenmedi.

Doğru görünen, ancak doğru olmayan klasik algoritma örnekleri var mı? İlklendirme-Bakım-Sonlandırma yaklaşımının ilk bakışta sezginin yapmadığı bir şey yakaladığı vakaları arıyorum.


5
Muhtemel ilgi alanı: cs.stackexchange.com/q/29475/755
DW

5
Olumlu oylama çünkü bunun çok önemli bir pedagojik soru olduğunu düşünüyorum. Cstheory için biraz kapsam dışı, ancak bunun için daha iyi bir platform bilmiyorum ve cstheory topluluğunda birçok algoritma eğitmeni var. Çoğu algoritma tasarım kursu, öğrencileri sadece mevcut olan algoritmaları düzeltmeye ve bilinen teknikler kullanılarak kolayca çözülebilen sorunlara maruz bırakır. Bu, öğrencilerin görünüşte makul bir algoritmanın doğru olduğuna dair sezgisel hissine güvenle güvenebileceği izlenimini güçlendirir. İyi bir algoritma tasarım kursu bunun tam tersini yapmalıdır!
Neal Young

3
Böyle bir koleksiyona sahip olmak isterdim.
Chandra Chekuri

Yanıtlar:


20

Maksimum 2B yerel

giriş: 2 boyutlu dizi An×nA

çıkışı: bir lokal maksimum - bir çift bu tür bir [ ı , j ] katı bir daha büyük bir değeri içeren bir dizi herhangi bir komşu hücre vardır. (i,j)A[i,j]

(Komşu hücreler dizide bulunan arasındakilerdir.) Yani, örneğin, eğer bir olduğunuA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

sonra her kalın harfli hücre yerel bir maksimum değerdir. Boş olmayan her dizi en az bir yerel maksimum değere sahiptir.

Algoritma. Bir -zamanlı algoritması vardır: sadece her bir hücreyi kontrol edin. İşte daha hızlı, özyinelemeli bir algoritma için bir fikir.O(n2)

verildiğinde , orta sütundaki hücreler ve orta sıradaki hücrelerden oluşacak X çarpı tanımlayın . Önce hücrenin A'da yerel bir maksimum olup olmadığını görmek için X'deki her bir hücreyi kontrol edin . Eğer öyleyse, böyle bir hücreyi geri getirin. Aksi takdirde, ( i , j ) X cinsinden maksimum değere sahip bir hücre olsun . Yana ( i , j ) bir lokal maksimum değildir, bir komşu hücre olmalıdır ( I ' , J ' ) daha büyük bir değere sahip.AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

n2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

Böylece, aşağıdaki teoremi kanıtladık:

O(n)n×n

Yoksa var mı?


İlk okumada tespit ettiğim tek hata nüks çözümü idi. Tek hata bu mu?
Radu GRIGDaha fazla

1
Nüks doğrudur. Algoritma değil!
Neal Young

1
Ah, evet, tekrarlama ile aptalca bir hata yaptım. Sorunu görüyorum: var olduğunu kanıtladığınız maksimum şey (mutlaka) bulduğunuz şey değil. Ve bulduğun şey X'i görmezden geliyor
Radu GRIGore

3
(2143300101230001023002222222333233300323000032300)

2
AA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.