Балансировка двоичного дерева (AVL)

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
14
задан Gustavo Carreno 10 August 2012 в 16:59
поделиться

6 ответов

Дерево козла отпущения возможно имеет самый простой алгоритм определения баланса для понимания. Если какая-либо вставка заставляет новый узел быть слишком глубоким, это находит узел, вокруг которого можно изменять баланс путем рассмотрения баланса веса, а не баланса высоты. Правило для того, изменять ли баланс на, удаляет, также просто. Это не хранит тайной информации в узлах. Это более хитро, чтобы доказать, что это корректно, но Вам не нужно это для понимания алгоритма...

Однако в отличие от AVL это не сбалансировано с высоты в любом случае. Как красно-черный ограничен его дисбаланс, но в отличие от красно-черного это является настраиваемым с параметром, таким образом, для наиболее практических целей это выглядит столь сбалансированным, как Вам нужен он, чтобы быть. Я подозреваю, что при настройке его слишком плотно, тем не менее, это заканчивается как плохое или хуже, чем AVL для вставок худшего случая.

Ответ на редактирование вопроса

я обеспечу свой персональный путь к пониманию деревьев AVL.

Первый необходимо понять, каково древовидное вращение, поэтому проигнорируйте все остальное, что Вы когда-либо слышали алгоритмы AVL и понимаете это. Станьте прямыми в голове, которая является правильным вращением и которая является левым вращением, и что каждый делает к дереву, или иначе описания точных методов просто смутят Вас.

Затем, понимают, что прием для балансировки деревьев AVL - то, что каждый узел записывает в ней различие между высотой его левых и правых поддеревьев. Определение 'высоты, сбалансированной', то, что это между-1 и 1 включительно для каждого узла в дереве.

Затем, понимают, что, если Вы добавили или удалили узел, Вы, возможно, разбалансировали дерево. Но можно было только изменить баланс узлов, которые являются предками узла, который Вы добавили или удалили. Так, что Вы собираетесь сделать, работать, Ваш путь создает резервную копию дерева, с помощью вращений для балансировки любых несбалансированных узлов, которые Вы находите, и обновление их счета баланса, пока дерево не сбалансировано снова.

заключительная часть понимания это должно искать в достойной ссылке определенные вращения, используемые для изменения баланса каждого узла, который Вы находите: это - "техника" его в противоположность высокому понятию. Только необходимо помнить детали при изменении кода дерева AVL или возможно во время экзаменов структур данных. Это - годы, с тех пор как у меня в последний раз был древовидный код AVL так как открытый в отладчике - реализации имеют тенденцию добираться до точки, где они работают и затем остаются рабочими. Таким образом, я действительно не помню. Можно отсортировать, разрабатывают его на таблице с помощью нескольких покерных фишек, но трудно быть уверенным, что Вы действительно получили все случаи (нет многих). Лучше всего только искать его.

Затем существует бизнес перевода всего этого в код.

я не думаю, что рассмотрение листингов кода помогает очень с любым этапом кроме последнего, поэтому проигнорируйте их. Даже в лучшем случае, где код ясно написан, он будет похож на описание учебника процесса, но без схем. В более типичном случае это - путаница управления структурой C. Поэтому просто придерживайтесь книг.

15
ответ дан 1 December 2019 в 07:28
поделиться

Я не думаю, что хорошо отправить полные коды для алгоритмов балансировки узла здесь, так как они становятся довольно крупными. Однако статья Wikipedia о красно-черные деревья содержат полную реализацию C алгоритма и статьи о , деревья AVL имеют несколько ссылок на высококачественные реализации также.

Эти две реализации достаточно для большинства сценариев общего назначения.

16
ответ дан 1 December 2019 в 07:28
поделиться

Я делал некоторую работу с деревьями AVL в последнее время.

лучшая справка я смог найти о том, как сбалансировать их, был посредством поиска Google.

я просто кодировал вокруг этого псевдо кода (если Вы понимаете, как сделать вращения, которые довольно легко реализовать).

IF tree is right heavy
{
  IF tree's right subtree is left heavy
  {
     Perform Double Left rotation 
  }
  ELSE
  {
     Perform Single Left rotation
  }
}
ELSE IF tree is left heavy
{
  IF tree's left subtree is right heavy
  {
     Perform Double Right rotation
  }
  ELSE
  {
     Perform Single Right rotation
  }
}
4
ответ дан 1 December 2019 в 07:28
поделиться

Я соглашаюсь, полная программа не была бы соответствующей.

, В то время как классический AVL и дерево RB используют детерминированный подход, я предложил бы взглянуть на" Рандомизированные деревья двоичного поиска ", которые являются менее дорогостоящими, чтобы сохранить сбалансированными и гарантировать хорошей балансировке независимо статистическое распределение ключей.

1
ответ дан 1 December 2019 в 07:28
поделиться

Дерево AVL неэффективно, потому что необходимо сделать потенциально много вращений на вставку/удаление.

Красно-черное дерево является, вероятно, лучшей альтернативой, потому что вставки/удаления намного более эффективны. Эта структура гарантирует, что самый длинный путь к листу является не больше, чем дважды кратчайшим путем. Таким образом, в то время как менее сбалансированный, чем дерево AVL, худших несбалансированных случаев избегают.

, Если Ваше дерево будет много раз читаться и не будет изменено после того, как оно будет создано, это может стоить дополнительных издержек для полностью сбалансированного дерева AVL. Также Красно-черное дерево требует одного дополнительного бита устройства хранения данных для каждого узла, которые дают "цвет" узла.

0
ответ дан 1 December 2019 в 07:28
поделиться

Для балансировки дерева AVL я просто написал несколько функций, которыми решил поделиться со всеми здесь. Думаю, эта реализация безупречна. Запросы / вопросы / критика, конечно, приветствуются:

http://uploading.com/files/5883f1c7/AVL_Balance.cpp/

Будучи новичком в Stackoverflow, я попытался разместить здесь свой код, но застрял с плохим форматированием вопросы. Итак, загрузили файл по указанной выше ссылке.

Ура.

0
ответ дан 1 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: