Поиск строки в BLOB. Попытка сделать это быстрее / использовать блоки большего размера - PullRequest
0 голосов
/ 09 января 2020

Я пишу алгоритм, который ищет строку в файле 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
                }
            }   
        }
    }
}
...