Предположим , что мы имеем конечное множество дисков в , и мы хотим вычислить наименьший диск , для которых . Стандартный способ сделать это состоит в использовании алгоритма Matoušek, Шарир и Welzl [1] , чтобы найти базис из , и пусть , самый маленький диск , содержащий . Диск может быть вычислен алгебраически с использованием того факта, что, поскольку B является базисом, каждый диск в B касается \ langle B \ rangle .
( является основой из , если является минимальным , так что Основа имеет не более трех элементов;. В целом для шаров в основы не более элементов.)
Это рандомизированный рекурсивный алгоритм следующим образом. (Но см. Ниже итеративную версию, которая может быть легче для понимания.)
Процедура :
Вход : конечные наборы дисков , , где является базой ( ).
- Если , возврат .
- В противном случае выберите наугад.
- Пусть .
- Если вернуть .
- В противном случае верните , где является базисом .
Используется в качестве вычислить базис .
Недавно у меня была причина реализовать этот алгоритм. После проверки правильности результатов в миллионах случайно сгенерированных тестовых случаев я заметил, что допустил ошибку в реализации. На последнем этапе я возвращал а не .
Несмотря на эту ошибку, алгоритм давал правильные ответы.
Мой вопрос: почему эта неправильная версия алгоритма дает правильные ответы здесь? Это всегда (доказуемо) работает? Если так, то это также верно для более высоких измерений?
Добавлено: некоторые заблуждения
Несколько человек предложили неверные аргументы о том, что модифицированный алгоритм тривиально корректен, поэтому здесь может быть полезно предотвратить некоторые заблуждения. Похоже, одно из распространенных ложных убеждений состоит в том, что . Вот контрпример к этому требованию. Для дисков как показано ниже (граница также показана красным):, б , с , д , е ⟨ , б , е ⟩
мы можем иметь ; и обратите внимание, что :е ∉ ⟨ с , d ⟩
Вот как это может произойти. Первое наблюдение состоит в том, что :
- Мы хотим вычислить
- Выберите
- Пусть
- Заметьте, что
- Итак, пусть является базисомB ′ ∪ { X } = { a , b , c , e }
- Заметьте, что
- Вернуть , то есть{ b , c }
Теперь рассмотрим .
- Мы хотим вычислить
- Выберите
- Пусть
- Заметьте, что
- Итак, пусть является базисомB ′ ∪ { X } = { b , c , d }
- Заметьте, что
- Вернуть , то есть{ c , d }
(Для определенности скажем, что все диски имеют радиус 2 и центрированы в , , , и соответственно.)( 30 , 5 ) ( 30 , 35 ) ( 10 , 5 ) ( 60 , 26 ) ( 5 , 26 )
Добавлено: итеративная презентация
Может быть проще подумать об итеративном представлении алгоритма. Мне, конечно, легче визуализировать его поведение.
Входные данные : список дисков Выход : ОсноваL
- Пусть .
- Перемешать случайно.
- Для каждого в :L
- Если :
- Пусть - базис .B ∪ { X }
- Вернитесь к шагу 2.
- Возврат .
Причина алгоритм завершается, между прочим, является то , что шаг 5 всегда увеличивает радиус - и есть лишь конечное число возможных значений .Б
Насколько я вижу, модифицированная версия не имеет такой простой итеративной презентации. (Я пытался дать один в предыдущем редактировании этого поста, но это было неправильно - и дал неправильные результаты.)
Ссылка
[1] Иржи Матушек, Миха Шарир и Эмо Вельцль. Субэкспоненциальная оценка для линейного программирования. Algorithmica, 16 (4-5): 498–516, 1996.