Создание сбалансированного двоичного дерева поиска из потока чисел

голоса
10

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

Вопрос был: Напишите функцию, которая данный поток целых чисел (неупорядоченных), строит сбалансированное дерево поиска. Теперь, вы не можете ждать ввода до конца (это поток), так что вам нужно, чтобы сбалансировать дерево на лету.

Мой первый ответ был использовать красно-черное дерево, которое, конечно, делает работу, но я должен предположить, что они не ожидали меня реализовать красное черное дерево в течение 15 минут.

Итак, есть ли простое решение этой проблемы я не знаю?

Благодаря,

Дейв

Задан 29/08/2011 в 22:25
источник пользователем
На других языках...                            


3 ответов

голоса
3

Деревья AA немного проще , чем красно-черных деревьев, но я не мог осуществить один с верхней части моей головы.

Ответил 29/08/2011 в 22:28
источник пользователем

голоса
9

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

  1. Выберите случайное число, чтобы назначить вновь добавленный элемент.
  2. Вставьте элемент в BST, используя стандартную вставку BST.
  3. В то время как ключ нового вставленный элемента больше, чем ключ его родитель, выполнить поворот дерева, чтобы принести новый элемент выше своего родителя.

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

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

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

Надеюсь это поможет!

Ответил 29/08/2011 в 22:33
источник пользователем

голоса
1

Один из самых простых сбалансированного двоичного дерева поиска является BB (α) -tree. Вы выбираете константу а, в котором говорится , сколько несбалансированным может дерево получить. Во все времена, #descendants(child) <= (1-α) × #descendants(node)должно выполняться. Вы относиться к нему как обычный бинарное дерево поиска, но если формула не относится к какому - либо узлу больше, вы просто восстановить ту часть дерева с нуля, так что он отлично сбалансирован.

Амортизируется временная сложность для вставки или удаления все еще O (N журнал), так же как и с другими сбалансированных бинарных деревьев.

Ответил 29/08/2011 в 22:49
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more