C# 高效逐点数据搜索查询算法?

C# 高效逐点数据搜索查询算法?,c#,algorithm,performance,search,complexity-theory,C#,Algorithm,Performance,Search,Complexity Theory,我需要搜索一个可能非常大的字节数据结构(高达4GB)来查找给定的十六进制值。问题是十六进制值的字符串输入可以是任何大小,包括奇数,例如“ABC”。与其将字节数据转换为字符串数据并执行字符串搜索(我已经完成了FWIW),我想知道一种可能更好的执行算法,它基本上是逐点搜索 考虑到数据源的大小,搜索当然可以分段执行。理想情况下,输出是匹配项的起始索引或地址的可枚举项。出于这个问题的目的,让我们假设数据结构是一个字节[],输出是一个int索引和一个半字节偏移量(例如bool firstNibbleMat

我需要搜索一个可能非常大的字节数据结构(高达4GB)来查找给定的十六进制值。问题是十六进制值的字符串输入可以是任何大小,包括奇数,例如“ABC”。与其将字节数据转换为字符串数据并执行字符串搜索(我已经完成了FWIW),我想知道一种可能更好的执行算法,它基本上是逐点搜索

考虑到数据源的大小,搜索当然可以分段执行。理想情况下,输出是匹配项的起始索引或地址的可枚举项。出于这个问题的目的,让我们假设数据结构是一个
字节[]
,输出是一个
int
索引和一个半字节偏移量(例如
bool firstNibbleMatch


在开始尝试之前,有没有关于评测、轮班操作的成本与ascii转换(,等等)或任何其他不可预见的方面的想法?我主要关心的是性能。这种方法在理论上会更好吗?

你的模式有多长?(文本)数据大小如何?如文所述,这个问题似乎相当广泛和开放。考虑添加更多关于输入格式、输出格式和正在搜索的结构的详细信息。另外,提出两种方法,并询问有关这两种方法的具体问题,肯定会有助于缩小问题的范围。请参阅以下帖子:对于问题中的示例输入,我将首先扫描整个
字节[]
数组,查找
0xAB
。每次找到后,用
if((数组[i+1]&0xF0)=0xC0)检查下一个字节
。然后重新扫描整个阵列的
0xBC
。找到后,使用
if((数组[i-1]&0x0F)=0x0A)检查上一个字节
您可以将输入和模式实现为字节,然后使用Knuth-Morris-Pratt算法查找子字符串。复杂性将是最小的:
O(n+k)
其中
n
k
是输入和模式的长度。