лучшее, что вы можете получить это O (м), но я немного сложным реализация. Если вы удовлетворены решением, которое имеет O (m * n) в худшем случае, вы можете перейти к решению ниже. Если ваши последовательности упорядочены, и начальный элемент в массиве tag
присутствует только один раз в src
, это также приведет к 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;
}
}
Я предположил, последовательность должны быть в таком порядке, и я только скомпилирован в Firefox, так что не уверен, если это работает :). Кроме того, я сделал его общим, поэтому он обрабатывает любые типы массивов, а не только байты.
UPDATE: Обновленный код компилируется и работает ... или мой простой тест работал.
можно дублировать http://stackoverflow.com/questions/3529727/how-to-find-index-of-sublist-in-list – nan
Это не простая задача для эффективного решения. Наивный, простой в использовании поиск - это «O (nm)» наихудший случай. Вы можете улучшить это по существу (например, Boyer-Moore), но это непросто. http://en.wikipedia.org/wiki/String_searching_algorithm#Single_pattern_algorithms – Ani
Только индекс первого вхождения? –