Algorytm dopasowania liniowego?

Mam liniową listę zer i jedynek i muszę dopasować wiele prostych wzorów i znaleźć pierwsze wystąpienie. Na przykład muszę znaleźć0001101101, 01010100100, LUB10100100010 na liście o długości 8 milionów. Muszę tylko znaleźć pierwsze wystąpienie któregokolwiek z nich, a następnie zwrócić indeks, w którym występuje. Jednak wykonywanie pętli i dostępów na dużej liście może być kosztowne, a wolałbym nie robić tego zbyt wiele razy.

Czy jest szybsza metoda niż robienie

foreach (patterns) {
    for (i=0; i < listLength; i++)
        for(t=0; t < patternlength; t++)
            if( list[i+t] != pattern[t] ) {
                 break;
            }
            if( t == patternlength - 1 ) {
                 return i;  // pattern found!
            }
        }
    }
}

Edytować: BTW, zaimplementowałem ten program zgodnie z powyższym pseudokodem, a wydajność jest OK, ale nic spektakularnego. Szacuję, że przetwarzam około 6 milionów bitów na sekundę na jednym rdzeniu mojego procesora. Używam tego do przetwarzania obrazu i będzie musiał przejść przez kilka tysięcy zdjęć o rozdzielczości 8 megapikseli, więc każdy drobiazg pomaga.

Edytować: Jeśli nie jest jasne, pracuję z tablicą bitową, więc są tylko dwie możliwości: JEDNA i ZEROWA. I jest w C ++.

Edytować: Dziękujemy za wskaźniki do algorytmów BM i KMP. Zauważyłem, że na stronie Wikipedii dla BM, mówi

Algorytm przetwarza poszukiwany ciąg (klucz) docelowy, ale nie przeszukiwany ciąg (w przeciwieństwie do niektórych algorytmów, które przetwarzają wstępnie przeszukiwany ciąg, a następnie mogą amortyzować koszt przetwarzania wstępnego poprzez wielokrotne przeszukiwanie).

To wygląda interesująco, ale nie podaje żadnych przykładów takich algorytmów. Czy coś takiego też pomoże?

questionAnswers(5)

yourAnswerToTheQuestion