Да, это хорошо. Вместо того, чтобы использовать символы в строке в качестве ключа на каждом уровне, вы можете использовать биты в телефонном номере (если вы храните их как целые числа). По соображениям скорости вы можете использовать 3 или 4 бита за раз.
Это будет работать с помощью структуры trie, которая хранит текущую идентификационную информацию, а затем массив указателей на дочерние структуры trie.
struct phone_number_trie {
struct contact_info *info;
struct phone_number_trie *children[4]; // or 2, 8 or 16 etc.
};
E.g. сохраняя номер телефона «83» (который равен 1100011
в двоичном формате) в дереве, где корень равен root
, вы можете замаскировать нижние 2 бита (например, & 3
), которые равны 11
, поэтому вы можете перечислить в root->children[3]
с оставшимися битами номера телефона 11000
(т.е. сдвиньте его вправо 2). Следующие индексы будут 0
, а затем 10
, а затем 1
(так что вы указали бы на root->children[3]->children[0]->children[2]->children[1]
). На данный момент у вас нет установленных битов в вашем номере телефона, поэтому вы нашли нужное место для вставки.
(Вы можете также рассмотреть вопрос об использовании Patricia trie, но это значительно сложнее реализовать.)
ли искать только операцию, которую нужно поддерживать? – dirkgently
Нет, кроме поиска, я также хочу легко вставить записи. –