Как реализовать строковый ключ в B + Tree? - PullRequest
4 голосов
/ 15 декабря 2010

Многие примеры b + дерева реализованы с использованием целочисленного ключа, но я видел некоторые другие примеры, использующие как целочисленный ключ, так и строковый ключ, я изучил основы b + tree, но я не понимаю, как работает строковый ключ?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2015

Я также использую многоуровневое B-дерево. Имея строку, скажем, test можно рассматривать как массив [t, e, s, t]. Теперь подумайте о дереве деревьев. Каждый узел может содержать только один символ для определенной позиции. Вам также необходимо подумать о реализации определенного массива ключ / значение, например, о растущем связанном списке массивов, деревьев или чего-либо еще. Это также может сделать размер узла динамическим (ограниченное количество букв).

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

И теперь, поскольку каждый узел знает свою букву и позицию, вы можете убрать эти символы из ключей в листе и восстановить их при поиске или, если вы знаете лист + позицию в листе.

Если вы теперь, после того как вы создали дерево, напишите дерево в определенном формате, у вас будет сжатие строк, при котором вы сохраняете каждую буквенную комбинацию (префикс) только один раз, даже если она разделена 1000 концов строк.

Простое сжатие часто приводит к сжатию 1:10 для обычного текста (на любом языке!) И к памяти в 1: 4. А также вы можете искать любое данное слово (какие строки в вашем словаре вы использовали для B + Tree.

Это один край, где вы можете использовать многоуровневый.

Базы данных обычно используют определенное префиксное дерево (первые x символов и сохраняют остальные в листах и ​​используют бинарный поиск в листе). Также есть реализации, которые используют переменные длины префикса, основанные на фактической плотности. Таким образом, в конечном итоге это зависит от конкретной реализации, и существует множество вариантов.

Если дерево должно помочь в поиске точной строки. Часто добавление длины и использование хеша младших битов каждого символа делают свое дело. Например, вы можете сгенерировать хеш из длины (8 бит) + 4 бита * 6 символов = 32 бита -> ваш хэш-код. Или вы можете использовать первый, последний и средний символы вместе с ним. Поскольку длина является одной из самых селективных, вы не найдете много коллизий при поиске вашей строки.

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

0 голосов
/ 15 декабря 2010

Строковый ключ может быть указателем на строку (очень вероятно).

Или размер ключа может соответствовать большинству строк.64 бита содержат 8-байтовые строки, и даже 16-байтовые ключи не слишком смешны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...