Aquí es una versión más rápida de 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;
}
En un breve ensayo con un pajar de 11 MB y la aguja 9 bytes, esto fue alrededor de tres veces más rápido.
Las optimizaciones son:
- Sin función llamada cada vez a través del bucle exterior.
- La longitud de la aguja y el límite de búsqueda se guardan en caché.
- Se quitó la prueba de longitud redundante al comienzo de
match()
.
Por supuesto, para arreglos de byte largo desearía utilizar algo así como una búsqueda de Boyer-Moore, pero para muchos fines un algoritmo simple como este es suficiente, y tiene la virtud de ser corto y fácil de entender y verificar
Creo que necesitamos más información. ¿Estás tratando de encontrar una subsecuencia de bytes dentro de una matriz de bytes? ¿Podría dar un ejemplo? – Andrew
Véase, por ejemplo, el [algoritmo Knuth-Morris-Pratt] (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm). – jason