У меня есть словарный запас, a
, abandon
, ..., z
.
По какой-то причине я буду использовать для их хранения массив, а не Trie.
Таким образом, простой метод может быть: wordA\0wordB\0wordC\0...word\0
Но я думаю, что есть еще несколько экономичных методов для памяти.
Поскольку like
является подстрокой likely
, мы можем сохранить только первую позицию и длину like
вместо самой строки. Таким образом, мы генерируем «большую строку», содержащую все слова словаря, и используем position[i]
и length[i]
для получения i
-го слова.
Например, словарный запас содержит три слова ab
, cd
и bc
. Я создаю abcd
как "большую строку".
position[0] = 0, length[0] = 2
position[1] = 2, length[1] = 2
position[2] = 1, length[2] = 2
Итак, как сгенерировать «большую строку» — это ключ к этой проблеме, есть ли какие-нибудь интересные предложения?
Я думаю, что проблема похожа на проблему TSP (задача коммивояжера), которая является проблемой NP.
i
слово за постоянное время (произвольный доступ к словам), вы можете выполнять двоичный поиск, если записи вpos / length
упорядочены. Нет никакого преимущества в том, что массивы pos/length не в порядке, потому что каждый pos занимает, вероятно, 16-битноеuint16_t
, а каждая записьlength
занимает 8-битноеuint8_t
. - person Peter Cordes   schedule 16.11.2015pos[]
записи не обязательно должны монотонно возрастать. - person Peter Cordes   schedule 16.11.2015memcmp(needle, bigstr[pos[i]], len[i])
обычно быстро находит разницу. Что касается общих префиксов: ОП никогда не утверждал, что это помогло с общими префиксами. Возможно, в его словаре много слов, являющихся подстроками других слов, а не много разных форм одного и того же слова. Или, может быть, он просто хочет попробовать эту идею, хотя для английского она, вероятно, не сработает. - person Peter Cordes   schedule 16.11.2015