alexhemp
Новичок
Построение специализированного индекса для поиска
Итак - имеется - большой список строк (десятки миллионов), храниться в базе, но это для алгоритма не важно
Задача - поиск элементов по совпадению с началом строки, посредством организации своего специализированного индекса.
Т.е. для запроса "1234" нужно найти и "12345" и "123456"
Идея у меня пока только такая - использовать хэш-ф-цию для разбивки данных на некоторые "кластеры". Хеш - должен быть - монотонно возрастающим, чтобы "задавать границу снизу".
Т.е. H("1234") < H("12345") - нужен тот-же порядок что и для обычного сравнения строк.
Далее - строим уже нормальный индекс по кластерам и ищем в выборке (будет обычный линейный поиск).
Пока идея - сделать хеш 64-битным, чтобы влезал в BIGINT. Значения кодов сильно ограничены, латинские буквы + цифры, пока сделаю хэш просто выделением 6 бит на символ, итого влезет 10 символов, пространство поиска сильно сузится и LIKE вполне может заработать.
Строить бинарное дерево - слишком долго, обновлять индекс придется как минимум раз в сутки, а при использовании хешей - вообще не нужно будет обновлять
Основная проблема - вот эта "нечеткость" в поиске.
Но чует мое сердце, что способ не слишком элегантен, я его еще в институте проходил
Быть может кто-нибудь ткнет меня носом в какой-нибудь более сложный и наверняка более эффективный алгоритм?
Итак - имеется - большой список строк (десятки миллионов), храниться в базе, но это для алгоритма не важно
Задача - поиск элементов по совпадению с началом строки, посредством организации своего специализированного индекса.
Т.е. для запроса "1234" нужно найти и "12345" и "123456"
Идея у меня пока только такая - использовать хэш-ф-цию для разбивки данных на некоторые "кластеры". Хеш - должен быть - монотонно возрастающим, чтобы "задавать границу снизу".
Т.е. H("1234") < H("12345") - нужен тот-же порядок что и для обычного сравнения строк.
Далее - строим уже нормальный индекс по кластерам и ищем в выборке (будет обычный линейный поиск).
Пока идея - сделать хеш 64-битным, чтобы влезал в BIGINT. Значения кодов сильно ограничены, латинские буквы + цифры, пока сделаю хэш просто выделением 6 бит на символ, итого влезет 10 символов, пространство поиска сильно сузится и LIKE вполне может заработать.
Строить бинарное дерево - слишком долго, обновлять индекс придется как минимум раз в сутки, а при использовании хешей - вообще не нужно будет обновлять

Основная проблема - вот эта "нечеткость" в поиске.
Но чует мое сердце, что способ не слишком элегантен, я его еще в институте проходил

Быть может кто-нибудь ткнет меня носом в какой-нибудь более сложный и наверняка более эффективный алгоритм?