Il meglio che si può ottenere è O (m), ma che ho un po 'complessa implementazione. Se si soddisfa con una soluzione che ha O (m * n) nel peggiore dei casi si può andare con la soluzione qui sotto. Se le sequenze sono ordinate e l'elemento iniziale nell'array tag
è presente solo una volta in src
, ciò comporterà anche 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;
}
}
ho assunto la sequenza devono essere in questo ordine e ho compilato solo in Firefox, quindi non so se funziona :). Inoltre, l'ho reso generico in modo che gestisca qualsiasi tipo di array, non solo i byte.
UPDATE: Il codice aggiornato compila e funziona ... oppure il mio test semplice ha funzionato.
fonte
2011-01-11 14:03:06
Eventuali duplicati http://stackoverflow.com/questions/3529727/how-to-find-index-of-sublist-in-list – nan
Questo non è un problema facile da risolvere in modo efficiente. La ricerca ingenua e facile da implementare è "O (nm)" nel peggiore dei casi. Puoi migliorarlo sostanzialmente (ad es. Boyer-Moore), ma non è facile. http://en.wikipedia.org/wiki/String_searching_algorithm#Single_pattern_algorithms – Ani
Solo l'indice della prima occorrenza? –