Препод задал сделать как лабу весьма сложную задачу и я сильно сомневаюсь, что она имеет решение за
![$log(N)$ $log(N)$](https://dxdy-02.korotkov.co.uk/f/9/9/7/997293042e13957baac5ce76aa3cdffe82.png)
.
Итак, есть препятствия, заданные как многоугольники произвольной формы. Для них можно провести подготовительные вычисления.
Далее задаются две точки вне препятствий и нужно найти кратчайший путь между ними за
![$log(N)$ $log(N)$](https://dxdy-02.korotkov.co.uk/f/9/9/7/997293042e13957baac5ce76aa3cdffe82.png)
, где N - количество вершин. При этом разрешается использовать только
![$O(N*log(N))$ $O(N*log(N))$](https://dxdy-01.korotkov.co.uk/f/8/b/2/8b262cefc8dbf0debeb84fbeb577970482.png)
памяти.
Я умею решать эту задачу с намного худшей оценкой:
1) на этапе предподготовки нахожу кратчайшие пути между всеми вершинами препятствий, на это уходит
![$O(N^3)$ $O(N^3)$](https://dxdy-01.korotkov.co.uk/f/0/e/1/0e10b94fd93211f59f66cd90dec1abe182.png)
времени (алгоритм Флойда-Уоршалла) и в конечном итоге нужно занимать
![$O(N^2)$ $O(N^2)$](https://dxdy-01.korotkov.co.uk/f/c/3/f/c3f65f86f2baa7f28840d7c68c00f5f282.png)
памяти.
2) для обеих заданных точек за
![$O(N)$ $O(N)$](https://dxdy-03.korotkov.co.uk/f/e/7/a/e7a2f022962441f2be6dc8e70e837b4a82.png)
нахожу прямые расстояния до всех точек препятствий, выходят два массива размера N (fromstart, fromfinish)
3) за
![$O(N^2)$ $O(N^2)$](https://dxdy-01.korotkov.co.uk/f/c/3/f/c3f65f86f2baa7f28840d7c68c00f5f282.png)
нахожу
![$argmin_{i,j}(fromstart[i] + mindistance[i,j] + fromfinish[j])$ $argmin_{i,j}(fromstart[i] + mindistance[i,j] + fromfinish[j])$](https://dxdy-02.korotkov.co.uk/f/d/f/5/df5078e06422292a50b26db2c70f25f982.png)
Как видите, оценки крайне далеки от требуемых, возможно я туплю на этапе 3) и этот поиск можно сделать хотя бы за
![$N*log(N)$ $N*log(N)$](https://dxdy-02.korotkov.co.uk/f/9/8/5/9855ea39b3fdd38d02a8ca9c22caa45882.png)
Что касается запроса за
![$log(N)$ $log(N)$](https://dxdy-02.korotkov.co.uk/f/9/9/7/997293042e13957baac5ce76aa3cdffe82.png)
, я вообще не представляю как это возможно. Искал в книге Рурка, так и не смог разобраться, там много разных задач с похожей формулировкой и разными оценками, к тому же решений всё равно нет. Чувствую, что если это и можно сделать за
![$log(N)$ $log(N)$](https://dxdy-02.korotkov.co.uk/f/9/9/7/997293042e13957baac5ce76aa3cdffe82.png)
, задание всё равно слишком сложное и объемное как для "просто лабы". Кто что-то знает по теме? Подскажите что почитать, пожалуйста.