Красно-черные деревья

Совместимость Python 2/3 для configparser может быть решена просто библиотекой six

from six.moves import configparser
54
задан Björn Lindqvist 3 November 2016 в 06:34
поделиться

9 ответов

Красные Черные деревья хороши для создания хорошо-сбалансированных-деревьев. Основная проблема с деревьями двоичного поиска состоит в том, что можно сделать их несбалансированными очень легко. Предположите, что Ваше первое число является 15. Тогда все числа после этого все больше меньше, чем 15. У Вас будет дерево, которое очень тяжело на левой стороне и ничего не имеет на правой стороне.

Красные Черные деревья решают это, вынуждая Ваше дерево быть сбалансированными каждый раз, когда Вы вставляете или удаляете. Это выполняет это через ряд вращений между узлами предка и дочерними узлами. Алгоритм на самом деле довольно прост, хотя это немного длинно. Я предложил бы взять СБРАСЫВАНИЕ (Cormen, Lieserson, Rivest и Stein) учебник, "Введение в Алгоритмы" и читающий на Деревьях RB.

реализация также не действительно так коротка, таким образом, это, вероятно, не действительно лучше всего для включения его здесь. Тем не менее, деревья используются экстенсивно для высокопроизводительных приложений, которые должны получить доступ к большому количеству данных. Они обеспечивают очень эффективный способ найти узлы с относительно маленькими издержками вставки/удаления. Снова, я предложил бы смотреть на, СБРАСЫВАЕТ для чтения о том, как они используются.

, В то время как BSTs не может использоваться явно - один пример использования деревьев в целом находится почти в каждом современном RDBMS. Точно так же Ваша файловая система почти наверняка представлена как своего рода древовидная структура, и файлы аналогично индексируются тот путь. Google питания деревьев. Питание деревьев примерно каждый веб-сайт в Интернете.

54
ответ дан Jacob 7 November 2019 в 08:00
поделиться

Я хотел бы обратиться только к вопросу "Поэтому, что делает двоичные деревья полезными в некоторых общих задачах, которые Вы делаете при программировании?"

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

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

, Если Вы вовлечены в большее количество высокоэффективных усилий или ситуаций, которые являются несколько вне нормы бизнес-программирования, Вы найдете, что деревья непосредственный друг. Как другой сказанный плакат, деревья являются базовыми структурами данных для баз данных и индексов всех видов. Они полезны в анализе данных и визуализации, усовершенствованная графика (2-й и 3-й), и хост других вычислительных проблем.

я использовал двоичные деревья в форме BSP (двоичное разделение пространства) деревья в 3-й графике. Я в настоящее время смотрю на деревья снова для сортировки больших сумм геокодируемых данных и других данных для визуализации информации в приложениях Flash/Flex. Каждый раз, когда Вы раздвигаете границу аппаратных средств, или Вы хотите работать на более низких спецификациях оборудования, понимание и выбирание лучшего алгоритма могут иметь значение между отказом и успехом.

18
ответ дан Jonathan Branam 7 November 2019 в 08:00
поделиться

BSTs заставляют мир вращаться, как сказано Micheal. Если Вы ищете хорошее дерево, чтобы реализовать, смотреть на деревья AVL (Википедия). У них есть балансирующееся условие, таким образом, они, как гарантируют, будут O (logn). Этот вид ищущей эффективности делает логичным поместить в любой вид индексации процесса. Единственной вещью, которая была бы более эффективной, будет хеш-функция, но те становятся ужасными быстрый, быстро, и второпях. Кроме того, Вы сталкиваетесь День рождения Paradox (также известный как проблема ящика).

, Какой учебник Вы используете? Мы использовали Структуры данных и Анализ в Java Mark Allen Weiss. У меня на самом деле есть он открытый в моей полировке, поскольку я ввожу это. Это имеет большой раздел о Красно-черных деревьях, и даже включает код, необходимый для реализации всех деревьев, о которых это говорит.

2
ответ дан helloandre 7 November 2019 в 08:00
поделиться

Красные Черные Деревья и B-деревья используются во всех видах персистентного устройства хранения данных; потому что деревья сбалансированы, производительность обходов ширины и глубины смягчена.

Почти все современные системы баз данных используют деревья для хранения данных.

4
ответ дан mmattax 7 November 2019 в 08:00
поделиться

Лучшее описание красно-черных деревьев, которые я видел, является тем в Cormen, Leisersen и 'Введении Rivest в Алгоритмы'. Я мог даже понять его достаточно для неравнодушной реализации одного (только вставка). Существует также довольно много апплетов такой как Этот на различных веб-страницах, которые анимируют процесс и позволяют Вам смотреть и ступать через графическое представление алгоритма, создающего древовидную структуру.

2
ответ дан 2 revs, 2 users 86% 7 November 2019 в 08:00
поделиться

Если требуется видеть, как Красно-черное дерево, как предполагается, смотрит графически, я кодировал реализацию Красно-черного дерева, что Вы можете загрузка здесь

0
ответ дан Brock Woolf 7 November 2019 в 08:00
поделиться

IME, почти никто не понимает древовидный алгоритм RB. Люди могут повторить правила назад Вам, но они не понимают, почему те правила и куда они происходят из. Я не исключение :-)

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

0
ответ дан 7 November 2019 в 08:00
поделиться

Это может оказаться излишним для того, что вы пытаетесь сделать, но если вы хотите разбить URL-адрес на части, попробуйте функцию PHP parse_url . Вот справочная страница PHP .

Затем вам понадобится часть "путь" результирующего массива.

Примером преимущества этой постоянной сложности является случай, когда вы можете хранить постоянный источник данных, если вам нужно отслеживать изменения для отката, вам придется отслеживать O (log N) возможных изменений с помощью дерева AVL.

Почему вы готовы платить за дерево за хеш-таблицу? ПРИКАЗ! Хеш-таблицы не имеют порядка, с другой стороны, BST всегда имеют естественный порядок в силу своей структуры. Так что, если вы обнаружите, что бросаете кучу данных в массив или другой контейнер, а затем сортируете их позже, BST может быть лучшим решением.

Свойство order дерева дает вам ряд возможностей упорядоченной итерации в следующем порядке: в глубину, в ширину, предварительный заказ, пост-заказ. Эти итерационные алгоритмы полезны в различных обстоятельствах, если вы хотите их найти.

Красно-черные деревья используются внутри почти в каждом упорядоченном контейнере языковых библиотек, C ++ Set and Map, .NET SortedDictionary, Java TreeSet и т. Д.

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

10
ответ дан 7 November 2019 в 08:00
поделиться

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

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

В любом случае, AVL-дерево было первым сбалансированным алгоритмом двоичного дерева, и статья в Википедии об этом довольно ясно. Честно говоря, статья в Википедии о красно-черных деревьях чиста как грязь.

Помимо двоичных деревьев, B-деревья - это деревья, в которых каждый узел может иметь много значений. B-Tree - это не двоичное дерево, это просто его имя.Они действительно полезны для эффективного использования памяти; размер каждого узла дерева может быть изменен таким образом, чтобы он умещался в одном блоке памяти, так что вы не будете (медленно) искать в памяти множество разных вещей, выгруженных на диск. Вот феноменальный пример B-Tree .

0
ответ дан 7 November 2019 в 08:00
поделиться
Другие вопросы по тегам:

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