Чтобы понять вашу проблему: вы ищете оптимальный ответ (т.е. домашнее задание) или очень хороший алгоритм, который лучше, чем создание случайных точек?
В первом случае, боюсь, это очень сложная проблема, если у вас нет предварительной информации по области А. И я считаю, что будет трудно найти алгоритм, который быстрее, чем изучение каждого отдельного случая. .
Однако, если у вас есть некоторая предварительная информация об А, тогда все может быть проще. Например, , если оно выпуклое , вы можете использовать тот факт, что оптимальный тротуар, если ваше пространство бесконечно, является шестиугольным . Это означает, что вы должны поставить свои точки (в X) на концах треугольников
Итак:
- вычислить выпуклую оболочку (O (n * log (n)))
- вычислить диаметр (две самые дальние точки вашего набора)
- начать с добавления к X одной из точек (диаметра)
- затем добавьте точки, которые соответствуют шестиугольному тротуару, отдав предпочтение точкам на выпуклой оболочке
Этот алгоритм не является оптимальным (если только вы не определили очень хорошее "одобрение для выпуклых оболочек" ...)
Редактировать: комментарий г-на Е. напомнил мне, что оптимальная вещь для дорожного покрытия основана на круговой упаковке . Слава ему за точность!
Тем не менее, У меня есть другой алгоритм, который выглядит очень красиво и, возможно, даже оптимально! Он не требует каких-либо условий на A и стоит немного дороже, но не слишком много. Да, я знаю, это противоречит тому, что я сказал, но кого это волнует! Хороший алгоритм достаточно хорош.
Давайте назовем B набор доступных точек на данный момент. И C - точки, образующие конечности B. В начале B = A, и если A - квадрат, то C состоит из 4 точек (углов). Вы просто должны рекурсивно:
- вычислите две самые дальние точки B. Для этого вам нужны только точки в C
- добавить к X одну из точек (диаметра) случайным образом
- уберите из B точки, которые сейчас недоступны. Вам нужно только обновить C для этого.
Я знаю, что если вы работаете в сетке 1000x1000, C начинается с 4 точек, но после добавления одной точки к X это означает, что C возрастает до 1570 пунктов (примерно (pi / 2) 1000).
Вы должны заметить, что вы никогда не помещаете в память B, которая является большой (O (n ^ 2), если A может быть помещена в сетку n) Только C, и я считаю, что в любой момент размер C является O (n), который остается намного лучше, чем O (n ^ 2). И вычисление диаметра остается O (размер (C)) = O (n)