2015-06-19 1 views
1

Прежде чем думать о написании функции для ее выполнения, я пытаюсь придумать алгоритм. h обозначается как максимальное расстояние между основным родителем и данным узлом. Он должен работать в o (h^2), что означает, что ему будет проще придумать такой алгоритм, но я постоянно нахожусь с алгоритмом o (h). Я также смущаюсь, когда дело доходит до понимания, если я действительно выполняю операцию h^2. Я действительно мог использовать лидерство.Поиск наименее общего предка в двоичном дереве с o (h^2) для изменения

+2

Почему вы * хотите * медленный алгоритм? И если вам нужен алгоритм с квадратичным временем, почему бы не просто запустить алгоритм с линейным временем, а затем занятый цикл для h^2 шагов? – user2357112

+0

Меня просят. И я хочу получить полное теоретическое понимание этого. – Meitar

ответ

2

Простейший алгоритм для LCA будет работать в O(h^2) - создать два вложенных цикла, один из которых будет работать над всеми предками первой вершины, другой - над всеми предками второго, а внутри цикла просто сравните их.

a1 = a // a is the first given vertes 
while a1 != nil // assume root's parent is nil 
    a2 = b // b is the second given vertex 
    while a2 != nil 
     if (a1 == a2) 
      compare with current-best solution 
     a2 = a2.parent 
    a1 = a1.parent 

Итак, перейдите от первой данной вершины, то есть через всех своих предков. Для каждого его предка a1 перейдите от второй заданной вершины до корня и проверьте, встречаете ли вы вершину a1 по пути.

+0

Можете ли вы уточнить? Боюсь, я не слишком хорошо это понял. У меня две заданные вершины. Что мне делать с каждым из них? Обозначим их a и b. Я иду от вверх и всегда проверяет, является ли это родителем b, тогда я перехожу от b вверх, делая то же самое? – Meitar

+0

@Meitar, я немного расширил ответ – Petr