My ConsoleApplication создает правильное AVL-дерево из ввода. Для моего университета мне нужно сделать программу, которая:
- правильно вставить данные в AVL-Tree
- держать его сбалансированным
- дать вывод достаточно быстро и правильно для определенного ввода
Мой вопрос: почему метод/часть моей программы, которую я представлю позже в этом разделе, настолько медленная (96% всего времени выполнения программы)?
Другие методы/части в моей программе, которые также используют обходы по дереву, занимают около 0,05% или меньше моей программы.
Я объясню часть/метод ранг узла в дереве, тот, который, в соответствии с DotTrace (инструментом аналитики), этот метод занимает 96% всей моей программы (все остальные методы занимают около 0,05% или меньше). И именно поэтому я получаю ограничение по времени на свое задание, когда оно представлено в системе думджейдж.
- если строка ввода начинается с T: вставить новый узел в дерево AVL
если входная строка начинается с G: определяемый ранг указанного ранга узла - это количество людей, которые получили более высокий балл, чем вы +1, чем вывод с помощью Console.Writeline(variable);
пример:
значения узлов: x(10) y(5) z(2) k(5) l(4) m(9)
ранги узлов: X(1) y(3) z(6) k(3) l(5) m(2)
- если строка ввода начинается с чего-то другого: не нужно объяснять, эта часть работает правильно
Я пробовал много вещей, но я не понимаю, почему он замедляется. Надеюсь, вы, ребята, поможете мне, дайте мне понять, что я делаю неправильно.
переменные:
- MyAVLTree T: содержит корень дерева AVL.
- MyNode NodeX, содержит узел, из которого мы хотим определить ранг
- Int compareVALue — это значение nodeX, которое мы сравниваем с другими узлами, чтобы определить, является ли оно выше (счетчик++) или ниже (ничего не делать).
Когда нет более высоких узлов, чем nodeX, метод вернет переменную счетчика, которая содержит ранг узла, чтобы ее можно было распечатать в качестве вывода.
все входные линии, которые производят выходные или вставляемые данные в дерево AVL, занимают около 0,05% или меньше моей программы... кроме метода/части моей программы, которая создает/возвращает ранг узла в дереве AVL (96%)
Я надеюсь, что мой код читабелен, заранее спасибо за вашу помощь и время.
public static int RankElement(MyAVLTree T, MyNode nodeX, int compareValue)
{
int counter = 1;
while (true)
{
if (nodeX == T.root)
{
UnkownTreeWalk(T, nodeX.Right, compareValue, ref counter);
return counter;
}
else if (nodeX == nodeX.Parent.Right)
{
UnkownTreeWalk(T, nodeX.Right, compareValue, ref counter);
while (nodeX == nodeX.Parent.Right)
{
nodeX = nodeX.Parent;
if (nodeX == T.root)
{
return counter;
}
}
nodeX = nodeX.Parent;
if (nodeX.playerScore > compareValue)
counter++;
}
else
{
UnkownTreeWalk(T, nodeX.Right, compareValue, ref counter);
nodeX = nodeX.Parent;
if (nodeX.playerScore > compareValue)
counter++;
}
}
}
public static void UnkownTreeWalk(MyAVLTree T, MyNode nodeX, int compareValue, ref int counter)
{
if (nodeX != null)
{
if (nodeX.playerScore > compareValue)
{
counter++;
}
UnkownTreeWalk(T, nodeX.Right, compareValue, ref counter);
UnkownTreeWalk(T, nodeX.Left, compareValue, ref counter);
}
}