Приклади алгоритмів та доказів, які здаються правильними, але ні


15

У моєму курсі програмування ми дізнаємось про метод ініціалізації-обслуговування-припинення, який доводить алгоритм і робить те, що ми від нього очікуємо. Але нам довелося лише довести, що алгоритм, який, як відомо, є правильним, є правильним. Нас ніколи не просили показати, що алгоритм невірний.

Чи є класичні приклади алгоритмів, які виглядають правильно, але ні? Я шукаю випадки, коли підхід «Ініціалізація-підтримка-припинення» ловить щось, чого інтуїція з першого погляду не робить.


5
Можливо, що цікавить: cs.stackexchange.com/q/29475/755
DW,

5
Оновлення, тому що я вважаю, що це дуже важливе педагогічне питання. Це трохи не підходить для cstheory, але я не знаю кращої платформи для цього, і в спільноті cstheory є багато інструкторів з алгоритмів. Більшість курсів проектування алгоритмів піддають студентів лише правильним, існуючим алгоритмам та проблемам, які легко вирішуються за допомогою відомих методик. Це підсилює враження, настільки привабливі для студентів, що можна сміливо довіряти своєму інтуїтивному почуттю, що, здавалося б, правдоподібний алгоритм є правильним. Хороший алгоритм-дизайн-курс повинен робити навпаки!
Ніл Янг

3
Я хотів би мати таку колекцію.
Чандра Чекурі

Відповіді:


20

2D локальний максимум

вхід: двовимірний масив An×nA

вихід: локальний максимум - пара така що A [ i , j ] не має сусідньої комірки в масиві, яка містить строго більшу величину. (i,j)A[i,j]

(Суміжні комірки - це ті , що є серед масиву . Так, наприклад, якщо A єA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

то кожна жирна клітина є локальним максимумом. Кожен непустий масив має щонайменше один локальний максимум.

Алгоритм. Існує алгоритм часу : просто перевірте кожну комірку. Ось ідея щодо більш швидкого, рекурсивного алгоритму.O(n2)

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)

Таким чином, ми довели наступну теорему:

O(n)n×n

Або ми?


У першому читанні єдиною помилкою, яку я помітив, було рішення рецидивів. Це єдина помилка?
Раду ГРИГо,

1
Рецидив правильний. Алгоритм ні!
Ніл Янг

1
Ага, так, я зробив тупу помилку з рецидивом. Я бачу проблему: максимум, який ви докажете, є, це (не обов'язково) те, що ви знаходите. І те, що ви знайдете, ігнорує X.
Раду ГРИГо,

3
(2143300101230001023002222222333233300323000032300)

2
AA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.