У меня есть большой набор строк порядка ~ 10 ^ 12 или около того, и мне нужно выбрать подходящую структуру данных, чтобы при наличии строки я мог получить и связанное целочисленное значение в чем-то вроде O (log (n)) или O(m) раз, где «n» — длина списка строк, а «m» — длина каждой строки.
Мы можем ожидать, что наш набор строк, каждая из которых имеет длину «m» и закодирован в некотором алфавите размера «q», покрывает почти все возможные строки этой длины. Например, представьте, что у нас есть 10 ^ 12 уникальных двоичных строк длины m = 39. Это означает, что мы покрыли ~ 54% набора всех возможных двоичных строк этой длины.
Таким образом, я беспокоюсь о том, чтобы найти подходящую функцию хэширования для строк, которая позволяет избежать коллизий. Есть ли хороший, который я могу использовать? Сколько времени мне потребуется, чтобы проиндексировать мой набор из n строк?
Или я должен пойти с деревом суффикса? Мы знаем, что алгоритм Укконена позволяет построить линейное время, и я предполагаю, что это сэкономит место, учитывая большое количество похожих строк?