Автор: Gregory
Дата сообщения: 03.01.2007 10:06
Знач так.
Скажем, что расстояние между вершинами равно n=2^m.
Каждую итерацию начиная с обоих вершин поднимаемся вверх на 2^k шагов, когда k - это номер итерации. скажем, из вершины u поднялись на u1, а из v - на v1.
Повторяем до тех пор, пока из одной из вершин, до которых поднялись не получится за то же количество шагов добраться до второй.
Чтобы это проверить, по очереди из u1 и v1 поднимаемся 2^k шагов, и если встречаем вторую, закончили.
Другими словами, сравниваем разность между уровнями начальных вершин с 1,2,4,8,...
Таким способом находим разность уровней двух начальных вершин и узнаем, кто из них ниже.
Можно показать, что алгоритм завершится когда хотя бы один из итераторов пройдет общего родителя, то есть в худшем случае через k=log(n) итераций
Идем из нижнего количество шагов, равное числу вершин. Затем продвигаем каждую из вершин на один шаг, пока они не встретятся. Так находим общего родителя и длину пути.
Получается, что в худшем случае совершаем
3*(1+2+4+8+...+2^m)+n=3*(1+2*(2^m-1))+n=3*(1+4*n-2)+n=13n-3=O(n)
операций.
Да, оказалось, что найти путь подразумевало найти его длину. Если бы надо было найти возможность спуститься от родителя к одной из вершин, вряд ли бы что вышло.