Oto szybsza wersja Ergwun's excellent answer:
static int SearchBytes(byte[] haystack, byte[] needle) {
var len = needle.Length;
var limit = haystack.Length - len;
for(var i = 0; i <= limit; i++) {
var k = 0;
for(; k < len; k++) {
if(needle[k] != haystack[i+k]) break;
}
if(k == len) return i;
}
return -1;
}
W krótkim teście z stogu siana 11MB i igły 9 bajtów, to było około trzy razy szybciej.
optymalizacje są:
- bez funkcji połączenia każdorazowo przez zewnętrzną pętlę.
- Długość igły i limit wyszukiwania są buforowane.
- Test nadmiarowej długości na początku
match()
został usunięty.
Oczywiście dla tablic z długim bajtem warto użyć czegoś takiego jak wyszukiwanie Boyera-Moore'a, ale dla wielu celów prosty algorytm, taki jak ten, jest wystarczająco dobry i ma zaletę, że jest krótki i łatwy w użyciu. zrozumieć i zweryfikować.
Myślę, że potrzebujemy więcej informacji. Czy próbujesz znaleźć podciąg bajtów w tablicy bajtów? Czy mógłbyś podać przykład? – Andrew
Zobacz na przykład algorytm Knuth-Morris-Pratt (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm). – jason