Lo mejor que se puede conseguir es O (m), pero que poco compleja implementación. Si satisface con una solución que tiene O (m * n) como el peor caso, puede ir con la solución a continuación. Si sus secuencias están ordenadas y el ítem inicial en la matriz tag
solo está presente una vez en src
, esto también dará como resultado O (m).
class Program
{
static void Main(string[] args)
{
var src = new byte[] { 1, 2, 3, 4, 5 };
var tag = new byte[] { 3, 4 };
var index = FindIndexOfSeq(src, tag);
Console.WriteLine(index);
Console.ReadLine();
}
static int FindIndexOfSeq<T>(T[] src, T[] seq)
{
int index = -1;
for (int i = 0; i < src.Length - seq.Length + 1; i++)
{
bool foundSeq = true;
for (int j = 0; j < seq.Length; j++)
{
foundSeq = foundSeq && src[i + j].Equals(seq[j]);
}
if (foundSeq)
{
index = i;
break;
}
}
return index;
}
}
asumí la secuencia tiene que ser en ese orden y sólo han compilado en Firefox, así que no sé si funciona :). Además, lo hice genérico para que maneje cualquier tipo de matrices, no solo bytes.
ACTUALIZACIÓN: El código actualizado se compila y funciona ... o mi simple prueba funcionó.
posible duplicado http://stackoverflow.com/questions/3529727/how-to-find-index-of-sublist-in-list – nan
Esto no es un problema fácil de resolver de manera eficiente. La búsqueda ingenua y fácil de implementar es el peor caso de 'O (nm) '. Puede mejorar sustancialmente (por ejemplo, Boyer-Moore), pero no es fácil. http://en.wikipedia.org/wiki/String_searching_algorithm#Single_pattern_algorithms – Ani
¿Solo el índice de la primera aparición? –