Рандомизированные деревья двоичного поиска, такие как treap, дают хорошую производительность (в порядке O (log n)) с высокой вероятностью, избегая при этом сложных (и дорогостоящих) операций перебалансировки, которые необходимы для детерминированных сбалансированных деревьев, таких как AVL, red-blackm, АА и т. Д.
Мы знаем, что если мы добавим случайные ключи к простому BST, мы можем ожидать, что он достаточно сбалансирован. Простая причина заключается в том, что число сильно несбалансированных деревьев для n узлов намного меньше, чем количество «почти сбалансированных» деревьев, и, следовательно, случайный порядок вставки ключей, скорее всего, закончится приемлемым деревом.
В этом случае в «Искусстве компьютерного программирования» Кнут дает чуть более 1,3 * lg2 (n) как среднюю длину пути, что довольно неплохо. Он также говорит, что удаление случайного ключа из случайного дерева сохраняет его случайность (и, следовательно, хорошую среднюю балансировку).
Таким образом, представляется, что двоичное дерево поиска, в котором ключи вставляются и удаляются в случайном порядке, скорее всего, даст производительность в порядке O (log n) для всех трех операций: поиск, вставка и удаление.
Тем не менее, мне интересно, даст ли следующий подход те же хорошие свойства:
- взять хеш-функцию h (x), которая, как известно, является «хорошей» (например, она обеспечивает равномерное распределение ключей)
- использовать порядок, установленный h (x) на клавишах вместо порядка на k.
- в случае столкновения, заказать по ключу. Это должно быть редкостью, если хеш-ключ достаточно хорош и диапазон хеш-функции намного больше, чем набор ключей.
Чтобы привести пример BST для ключа {4, 3, 5, 1, 2}, вставленного в таком порядке, будет:
4
/ \
3 5
/\
1 2
Предполагая, что хеш-функция отобразит их (соответственно) {221,142,12,380,18), мы получим.
221(4)
/ \
142(3) 380(1)
/ \
12(5) 18(2)
Ключевым моментом является то, что «обычный» BST может вырождаться, потому что ключи вставляются в соответствии с тем же отношением порядка, которое используется для их сохранения в дереве (их «естественный» порядок, например, в алфавитном порядке строки), но хеш-функция вызывает упорядочение ключей, совершенно не связанное с «естественным», и, следовательно, должно давать такие же результаты, как если бы ключи были вставлены в случайном порядке.
Сильное предположение, что хеш-функция "хорошая", но я думаю, что она не является необоснованной.
Я не нашел ссылки на подобный подход в литературе, поэтому он может быть совершенно неверным, но я не понимаю, почему!
Видите ли вы какие-либо недостатки в моих рассуждениях? Кто-нибудь уже пытался это сделать?