Сам я бы начал с рассмотрения триангуляции Делоне для набора точек: http://en.wikipedia.org/wiki/Delaunay_triangulation
Похоже, что существует множество ресурсов по эффективным алгоритмам для построения этого - алгоритм Fortune, в O (nlog n), для начала.
Моя интуиция говорит мне, что ваш самый широкий путь будет определяться одним из ребер в этом графе (а именно, он будет проходить перпендикулярно ребру, а его ширина будет равнадлина края).Как отсортировать края, проверить кандидатов и определить самый широкий оставшийся путь.Мне нравится этот вопрос, и я буду продолжать думать об этом.:)
РЕДАКТИРОВАТЬ 1: моя интуиция подводит меня!Простой равносторонний треугольник является контрпримером: самый широкий путь короче любого из ребер в триангуляции.Все еще размышляя ...
РЕДАКТИРОВАТЬ 2: Итак, нам нужен алгоритм черного ящика, который, учитывая две точки в наборе, находит самый широкий путь через множество точек, ограниченный этими двумя точками.(Визуализируйте две параллельные линии, проходящие через две точки; вращайте их в гармонии друг с другом, пока между ними нет точек).Давайте назовем время выполнения этого алгоритма «R».
Учитывая такой алгоритм, мы можем сделать следующее:
- Построить триангуляцию Делоне из набора точек: O (n logn)
- Сортировка ребер по ширине: O (n log n)
- Начиная с наибольшего ребра и спускаясь вниз, используйте алгоритм черного ящика, чтобы определить самый широкий путь, включающий эти две точки;сохраняя его как X: O (nR))
- Остановитесь, когда исследуемый край короче ширины X.
Шаги 1 и 2 хороши, но O (nR) это немного страшно.Если R оказывается O (n), это уже O (n ^ 2) для всего алгоритма.Приятно то, что для общего набора случайных точек мы ожидаем, что нам не придется проходить все грани.