Почему Двоичные деревья Важны?

StringBuilder, вероятно, предпочтителен. Причина состоит в том, что это выделяет больше места, чем в настоящее время необходимый (Вы определяете номер символов) уезжать, комната для будущего добавляет. Тогда будущие добавляют, которые помещаются в текущий буфер, не требуют никакого выделения памяти или сборки "мусора", которая может быть дорогой. В целом я использую StringBuilder для сложной строки concatentation или нескольких форматирование, затем преобразовываю в нормальную Строку, когда данные завершены, и я хочу неизменный объект снова.

19
задан Andrew Grimm 5 November 2010 в 04:41
поделиться

7 ответов

Двоичные деревья - это простейшая форма многосторонних деревьев, поэтому их легче изучать в этом смысле.

Многосторонние деревья имеют узлы, состоящие из N ] ключей и N + 1 указателей в строках:

               |
   +-----+-----+-----+-----+
   | k00 | k01 | k02 | k03 |
   +-----+-----+-----+-----+
  /      |     |     |      \
p00     p01   p02   p03     p04

Чтобы узнать, по какому указателю следует следовать при поиске, вы сравниваете ключ, который ищете, с ключами в узле. Этот пример выше представляет собой многоходовое дерево порядка 2 (я определяю порядок n как имеющий 2n ключей и 2n + 1 указателей).

Когда вы «вырождаете» эту структуру, чтобы получить наименьший возможный узел, вы получаете один ключ и два указателя, ваше классическое двоичное дерево:

      |
   +-----+
   | k00 |
   +-----+
  /       \
p00       p01

Когда я учился в университете (и я открыто признаю, что это было некоторое время назад), мы сначала изучили бинарные деревья , просто потому, что алгоритмы были элегантными. Поиск был простым сравнением узла и выбором одного из двух поддеревьев. Вставка и удаление также были относительно простыми.

Затем мы перешли к сбалансированным двоичным деревьям, где поиск был точно таким же, но вставка и удаление были немного сложнее, включая «вращение» поддеревьев. через корень поддерева, где это необходимо для поддержания баланса.

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

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

Я никогда не находил, чтобы многосторонние деревья были более полезными, чем двоичные деревья, за исключением одного очень специфическая ситуация. Это когда вы читаете узлы дерева с медленного носителя, такого как диск, и вы оптимизировали его для размеров сектора / кластера / блока.

Мы разработали реализацию многостороннего дерева под OS / 2 (здесь показан мой возраст) которые вопили, гарантируя, что узлы идентичны по размеру лежащим в основе дисковым блокам. Несмотря на то, что это могло привести к потере некоторого места, улучшение скорости того стоило.

Для содержимого в памяти: бинарные деревья обладают всеми преимуществами многосторонности без каких-либо дополнительных сложностей (необходимость сочетать последовательный поиск узла с выбором поддерева).

Бинарные деревья сводятся к следующему: «Должны ли мы двигаться влево или вправо?», Множественные способы - «Где в этом узле ключ, чтобы мы могли выбрать поддерево?».

28
ответ дан 30 November 2019 в 03:52
поделиться

Преимущество бинарных деревьев перед «n-арными» деревьями состоит в том, что их обход часто сводится к простой проблеме принятия решения «да / нет», как в разделении двоичного пространства .

1
ответ дан 30 November 2019 в 03:52
поделиться

Бинарные деревья - это простая концепция, их легко понять, легко реализовать, они работают хорошо и быстро - я полагаю, этого достаточно для их обучения и / или использования.

5
ответ дан 30 November 2019 в 03:52
поделиться

Я не собираюсь останавливаться на достигнутом ... потому что вопрос в том, почему двоичному дереву придается такое большое значение в DataStructure. Двоичное дерево, означает дерево, основанное на T / F, Да / Нет и т. Д. Означает комбинацию Duo. Практически мы сталкиваемся с ситуацией, когда нам нужно решить: да или нет ... Верно или нет. Двоичное дерево представляет такую ​​ситуацию. Программное обеспечение, над которым мы работаем, - это решения, которые будут использовать внутренние структуры данных для решения реальных жизненных сценариев. Вот почему двоичное дерево появляется на картинке и широко используется и даже важно. Остальные деревья представляют собой дальнейшие уточнения или дополнительные сложности, чтобы сопоставить их с типичными ситуациями. Для запуска двоичного дерева всегда важно.

-1
ответ дан 30 November 2019 в 03:52
поделиться

Например, двоичные деревья используются для сортировки кучи (двоичная куча). Это способ очень быстрой сортировки данных, так что самый большой (или самый низкий) элемент всегда находится впереди. Это используется, например, в AI (алгоритм A *).

-2
ответ дан 30 November 2019 в 03:52
поделиться

Поскольку древовидные структуры данных часто используются для организации упорядоченных элементов, например: a> b> c. Если ваши элементы, которые вставлены в деревья, упорядочены, все, что вам нужно, это две ветви в каждом узле, чтобы разделить элементы, которые больше, в левое поддерево, и элементы, которые меньше, в правое поддерево.

Вот почему бинарные деревья гораздо более распространены, чем м-арные. Это не имеет ничего общего с легкостью принятия решения да / нет по сравнению с обычным решением!

1
ответ дан 30 November 2019 в 03:52
поделиться

В дополнение ко всем приведенным выше ответам, дерево любой арности может быть представлено двоичным деревом (где левая ссылка ведет к первому дочернему элементу узла, а правая ссылка ведет к следующему «брату»).

1
ответ дан 30 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

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