Для точек есть пустых ящиков, см. Введение к этой статье http://www.cs.uwm.edu/faculty/ad/maximal.pdf . Можно вычислить эти блоки примерно за это время (см. Введение для ссылок).nO(n3)
Для вашей задачи возьмите случайную выборку точек, где каждая точка выбрана с портативностью . Такая случайная выборка имеет размер (в ожидании) [и ради противоречия предположим, что это так]. Имеется пустых ящиков с точками из на их сторонах, как указано выше. Для каждого такого блока используйте структуру данных поиска с ортогональным диапазоном, чтобы вычислить, сколько именно точек оно содержит. Повторите этот процесс раз. С большой вероятностью одна из пробных коробок является желаемой.1/kn/kO((n/k)3)RO(k6logn)
В целом, время выполнения этого .O((n/k)3∗k6∗polylogn)=O(n3k3logO(1)n)
Чтобы понять, почему это работает, рассмотрим оптимальную коробку. На его границе 6 точек P. Вероятность того, что случайная выборка выберет эти шесть точек, и ни одна из точек внутри прямоугольника, равна по крайней мере . Таким образом, если вы повторите процесс раз, с высокой вероятностью одна из случайных выборок вызовет желаемое поле как пустое поле.1k6(1−1/k)k−6≈1/k6=pO((1/p)logn)
Поскольку ограничено числом пустых ящиков (см. Введение в приведенной выше статье для соответствующих ссылок), маловероятно, что возможен значительно более быстрый алгоритм.Θ(n3)
[В ссылке, которую я дал, они упоминают, что [17] предоставляет алгоритм, который перечисляет все максимально пустые поля среди точки в 3d за времени, который является черным ящиком, который вам нужен для вышеупомянутого .]O(n3log2n)