Припустимо , що ми маємо кінцеве безліч дисків в , і ми хочемо обчислити найменший диск , для яких . Стандартний спосіб зробити це полягає у використанні алгоритму Matoušek, Шаріра і Welzl [1] , щоб знайти базис з , і нехай , найменший диск , що містить . Диск можна обчислити алгебраїчно, використовуючи той факт, що, оскільки є основою, кожен диск в є дотичним до .R 2 D ⋃ L ⊆ D B L D = ⟨ B ⟩ ⋃ В ⟨ Б ⟩ Б Б ⟨ В ⟩
( є основою з , якщо є мінімальним , так що Основа має не більше трьох елементів ;. В цілому для куль в основи має не більше елементів.)Б ⟨ В ⟩ = ⟨ L ⟩ R d d + 1
Це рандомізований рекурсивний алгоритм наступним чином. (Але дивіться ітераційну версію, яку, можливо, простіше зрозуміти нижче).
Порядок роботи : Введення : Кінцеві набори дисків , , де - основа ( ).
B B B
- Якщо , повернення .B
- Інакше виберіть навмання.
- Нехай .
- Якщо тоді поверніть B ' .
Використовується в якості обчислити базис .
Нещодавно у мене з'явилася причина реалізувати цей алгоритм. Перевіривши правильність результатів у мільйонах випадково сформованих тестових випадків, я помітив, що допустив помилку в реалізації. На останньому кроці я повертав а не .
Незважаючи на цю помилку, алгоритм давав правильні відповіді.
Моє запитання: Чому ця неправильна версія алгоритму, очевидно, дає тут правильні відповіді? Чи завжди це (доказливо) працює? Якщо так, чи це правда і у вищих вимірах?
Додано: кілька помилок
Кілька людей запропонували невірні аргументи про те, що модифікований алгоритм є тривіально правильним, тому може бути корисним попередження деяких помилок. Одне популярне помилкове переконання - . Наведемо контрприклад цього твердження. Дані диски як показано нижче (межа також показана червоним кольором):, б , з , д , е ⟨ , б , е ⟩
ми можемо мати ; і зауважте, що :е ∉ ⟨ з , d ⟩
Ось як це може статися. Перше спостереження полягає в тому, що :
- Ми хочемо обчислити
- Виберіть
- Нехай
- Зауважте, що
- Тож нехай є основою
- Зауважте, що
- Повернути , тобто
Тепер розглянемо .
- Ми хочемо обчислити
- Виберіть
- Нехай
- Зауважимо , що
- Тож нехай є основою B ′ ∪ { X } = { b , c , d }
- Зауважте, що
- Повертаємо , тобто { c , d }
(Для визначеності скажемо, що всі диски мають радіус 2 і по центру ( 30 , 5 ) , ( 30 , 35 ) , ( 10 , 5 ) , ( 60 , 26 ) і ( 5 , 26 ) відповідно.)
Додано: ітеративна презентація
Можливо, простіше подумати про ітераційне представлення алгоритму. Мені, звичайно, легше візуалізувати його поведінку.
Введення : Список дисків Вихід : Основа L
- Нехай .
- Перемішуйте випадковим чином.
- Для кожного у L :
- Якщо :
- Нехай - основа B ∪ { X } .
- Поверніться до кроку 2.
- Повернення .
Причина алгоритм завершується, між іншим, є те , що крок 5 завжди збільшує радіус - і є лише кінцеве число можливих значень B .
Наскільки я бачу, модифікована версія не має такої простої ітеративної презентації. (Я намагався надати цю публікацію в попередній редакції, але це було неправильно - і дало неправильні результати.)
Довідково
[1] Іржі Матушек, Міха Шарір та Емо Вельцл. Субекспоненціальна межа для лінійного програмування. Algorithmica, 16 (4-5): 498–516, 1996.