您可能會感興趣Boyer-Moore algorithm這裏可用。將您的列表轉換爲數組並進行搜索。算法代碼取自this post。
static int SimpleBoyerMooreSearch(byte[] haystack, byte[] needle)
{
int[] lookup = new int[256];
for (int i = 0; i < lookup.Length; i++) { lookup[i] = needle.Length; }
for (int i = 0; i < needle.Length; i++)
{
lookup[needle[i]] = needle.Length - i - 1;
}
int index = needle.Length - 1;
var lastByte = needle.Last();
while (index < haystack.Length)
{
var checkByte = haystack[index];
if (haystack[index] == lastByte)
{
bool found = true;
for (int j = needle.Length - 2; j >= 0; j--)
{
if (haystack[index - needle.Length + j + 1] != needle[j])
{
found = false;
break;
}
}
if (found)
return index - needle.Length + 1;
else
index++;
}
else
{
index += lookup[checkByte];
}
}
return -1;
}
然後,您可以搜索這樣的。如果lbyte
在一段時間後會保持不變,那麼您可以將其轉換爲一個數組並將其通過。
//index is returned, or -1 if 'searchBytes' is not found
int startIndex = SimpleBoyerMooreSearch(lbyte.ToArray(), searchBytes);
根據評論更新。下面是IList
實施,這意味着數組和列表(和其他任何實現IList
可以傳遞)
static int SimpleBoyerMooreSearch(IList<byte> haystack, IList<byte> needle)
{
int[] lookup = new int[256];
for (int i = 0; i < lookup.Length; i++) { lookup[i] = needle.Count; }
for (int i = 0; i < needle.Count; i++)
{
lookup[needle[i]] = needle.Count - i - 1;
}
int index = needle.Count - 1;
var lastByte = needle[index];
while (index < haystack.Count)
{
var checkByte = haystack[index];
if (haystack[index] == lastByte)
{
bool found = true;
for (int j = needle.Count - 2; j >= 0; j--)
{
if (haystack[index - needle.Count + j + 1] != needle[j])
{
found = false;
break;
}
}
if (found)
return index - needle.Count + 1;
else
index++;
}
else
{
index += lookup[checkByte];
}
}
return -1;
}
因爲數組和列表實現IList,有你的情況致電時,有必要任何轉換。
int startIndex = SimpleBoyerMooreSearch(lbyte, searchBytes);
什麼是 「1字節」 嗎? – 2013-04-20 00:10:21
@YairNevet一個字節列表 – Paparazzi 2013-04-20 00:16:48
@YairNevet另一個字節列表,這基本上是有序的list.containssequence在這裏必須有一個很好的解決方案,因爲它基本上是用string.contains解決的,但這是一個更通用的情況 – 2013-04-20 00:17:39