Редактировать: оптимальное решение состоит из двух простых бинарных поисков.
Я очень извиняюсь за длинный и запутанный пост, который я сделал ниже. В чем суть проблемы, так это в том, чтобы найти точку в пространстве, содержащем 100*100 элементов. Лучшее, что вы можете сделать, это разделить на каждом шаге это пространство пополам. Вы можете сделать это запутанным способом (тот, который я сделал в остальной части поста). Но если вы понимаете, что бинарный поиск по оси X по-прежнему делит пространство исследования на два на каждом шаге (то же самое касается Y оси) то вы понимаете что это оптимально.
Я все еще позволяю тому, что я сделал, и мне жаль, что я сделал несколько безапелляционных утверждений.
Если вам нужен простой алгоритм (хотя и не оптимальный), просто запустите двоичный поиск дважды, как это предлагается.
Однако, если вам нужен оптимальный алгоритм, вы можете одновременно искать границу на X и на Y. (Вы должны отметить, что два алгоритма имеют одинаковую асимптотическую сложность, но оптимальный алгоритм все равно будет быстрее)
На всех следующих рисунках точка (0, 0) находится в левом нижнем углу.
По сути, когда вы выбираете точку и получаете результат, вы делите свое пространство на две части. Когда вы думаете об этом, это на самом деле самый большой объем информации, который вы можете извлечь из этого.
![Выбор точки в 2D](https://i.stack.imgur.com/xbYYq.png)
Если вы выбираете точку (черный крест) и результат равен 1 (красные линии), это означает, что искомая точка не может находиться в сером поле (таким образом, она должна находиться в оставшаяся белая область)
![введите здесь описание изображения](https://i.stack.imgur.com/1gG78.png)
С другой стороны, если значение равно 0 (синие линии), это означает, что искомая точка не может находиться в серой области (таким образом, она должна находиться в оставшейся белой области).
![введите здесь описание изображения](https://i.stack.imgur.com/hSRqQ.png)
Итак, если вы получите один результат 0 и один результат 1, вы получите следующее:
![введите здесь описание изображения](https://i.stack.imgur.com/qj941.png)
Точка, которую вы ищете, находится в прямоугольнике 1, 2 или 3. Вам просто нужно проверить два угла прямоугольника 3, чтобы узнать, какой из 3 прямоугольников является хорошим.
Итак, алгоритм следующий:
Обратите внимание, где находятся нижний левый и верхний правый углы прямоугольника, с которым вы работаете.
Выполняйте двоичный поиск по диагонали прямоугольника, пока не наткнетесь хотя бы один раз на результат 1 и один раз на результат 0.
Проверьте 2 других угла прямоугольника 3 (вам необходимо уже знать значения двух углов по диагонали). Можно проверить только один угол, чтобы узнать правильный прямоугольник (но вам нужно будет проверить два угла). если правый прямоугольник является прямоугольником 3)
Определите, находится ли искомая точка в прямоугольнике 1, 2 или 3
Повторяйте, уменьшая задачу до правильного прямоугольника, пока последний прямоугольник не уменьшится до точки: это значение, которое вы ищете.
Редактировать: если вам нужна оптимальная оптимальность, вы бы не выбрали точку (50, 50), вы не разрезаете пространство на равные части. Один в три раза больше другого. В идеале вы должны выбрать точку, которая делит пространство на две равные области (по площади).
Вы должны вычислить один раз в начале значение factor = (1.0 - 1.0/sqrt(2.0))
. Затем, когда вы хотите разрезать между значениями a
и b
, выберите точку разреза как a + factor*(b-a)
. Когда вы разрезаете первоначальный прямоугольник 100x100 в точке (100*фактор, 100*фактор), две области будут иметь площадь (100*100)/2, поэтому сходимость будет быстрее.
person
B. Decoster
schedule
02.08.2011