Я пишу алгоритм, который ищет строку в файле blob / .txt. По сути, это проверка каждые 8 битов, если она соответствует определенному символу.
Теперь мне интересно, как я могу ускорить поиск. Как не делать проверки 8 бит на 8 бит, а сравнивать более крупные блоки одновременно. Но так как в основном 16 бит (как пример) представляют два символа:
• Как не пропустить начало слова? Например, если я хочу найти «foo» в Моем | f | oo я бы не нашел | fo | 16-битный блок.
• Второй, как перехватить конец строки fo | o * | правильно? Думаю, для этого я мог определить, сколько полных блоков в моей строке, а затем в последнем блоке игнорировать ненужные части.
Я пропустил части, чтобы проверить наличие escape-символов, пустых строк / строк одной длины. , конец потока. Псевдокод:
function find(pattern)
{
myblob.seek( 0, 'b') // pointer to begin of stream.
if (typeof pattern == "integer"){ // only search for one character.
while (true){
if (myblob.readn( '8bits' ) == pattern){
return myblob.position() - 1
}
}
} else { // look for a whole string.
local length = pattern.length()
while (true){
local first = find(pattern[0], myblob.position()) // find first character.
via above string == "integer" part
foreach (char in pattern.slice(1)) // check if the next characters match as well.
{
if (char != myblob.readn('8bits')){
myblob.seek(first + 1) // if not return to the position of first match + 1.
break
}
if (myblob.position() == first + length){ // pointer is at end of word. all matched.
return first
}
}
}
}
}