, . ( ), .
public static int GetOffsetOfArrayInArray(byte[] bigArray, int bigArrayOffset, int bigArrayCount, byte[] smallArray)
{
if (smallArray.Length == 0)
return 0;
List<int> starts = new List<int>();
int offset = bigArrayOffset;
while (offset < bigArrayOffset + bigArrayCount)
{
for (int i = 0; i < starts.Count; i++)
{
if (bigArray[offset] != smallArray[offset - starts[i]])
{
starts.RemoveAt(i);
i--;
}
else if (offset - starts[i] == smallArray.Length - 1)
{
return starts[i];
}
}
if (bigArray[offset] == smallArray[0] &&
offset <= (bigArrayOffset + bigArrayCount - smallArray.Length))
{
if (smallArray.Length > 1)
starts.Add(offset);
else
return offset;
}
offset++;
}
return -1;
}
starts smallArray bigArray. , smallArray[0] smallArray ( ). bigArray , smallArray, , smallArray , . , bigArray. O (1), O (1).
, ( ). , ( ), ( , , , ), , .
, , smallArray . , while, , starts.Length != 0 || offset <= (bigArrayOffset + bigArrayCount - smallArray.Length). .