例如:我有数组
var src = new byte[] {1, 2, 3, 4, 5};
var tag = new byte[] {3, 4};
谁知道快速查找标签数组索引的方法? 我需要如下内容:
int FindIndexOfSeq(byte[] src, byte[] sequence);
一个序列在src中可以出现多次
最佳答案
你能得到的最好的是 O(m),但我的实现有点复杂。如果您对最坏情况为 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 中编译它,所以不确定它是否有效 :)。此外,我将其设为通用的,因此它可以处理任何类型的数组,而不仅仅是字节。
更新:更新后的代码可以编译并工作...或者我的简单测试工作。
关于c# - 如何确定一个数组是另一个数组的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658305/