【发布时间】:2011-04-02 00:08:14
【问题描述】:
我有两个byte[],我想在第一个byte[](或其中的一个范围)中找到第二个byte[]的第一次出现。
我不想使用字符串来提高效率(将第一个 byte[] 转换为 string 效率会很低)。
基本上我相信这就是 strstr() 在 C 中所做的。
最好的方法是什么(因此它既高效又易于使用)?
它应该是这样的:
int GetOffsetOfArrayInArray(byte[] bigArray, int bigArrayOffset, int bigArrayCount, byte[] smallArray);
谢谢!
更新:
我想要一个比简单搜索更有效的解决方案。这意味着应该使用比较缓冲区可以更有效的事实 - memcmp() 比迭代字节更有效。
另外,我知道有一些算法可以优化这样的场景:
- 大数组:“12312351231234”
- 小数组:“1231234”
- 朴素算法: 7比较发现“1231235”与“1231234”不同,2比较发现下一个“1”,4比较发现“1235”与“1231”不同, 3比较查找下一个“1”,7比较查找匹配。总共 7+2+4+3+7=23 次比较。
- 智能算法: 7比较发现“1231235”与“1231234”不同,直接跳转到下一个“1”(不比较),4比较发现“1235”与“不同” 1231”,直接跳出“5”,7比对。总共 7+4+7=18 次比较。
【问题讨论】:
-
首先,使用转换对其进行编码,然后对其进行分析。如果您发现它处于性能瓶颈中,则只有对其进行优化,以免进行转换。将您的检查包装在一个函数调用中,这样您就可以在以后需要对其进行优化时简单地替换实现。
-
memcmp() 不是 strstr() 的替代方案。标准 CRT 不具备您正在寻找的功能。您可以从 msvcrt.dll 中 pinvoke strstr(),可在任何版本的 Windows 上使用。但是,它不会容忍包含零的 byte[]。
-
“memcmp() 比迭代字节更有效” - 如果(且仅当)它在幕后实现以进行字长比较或使用硬件的特殊功能。尝试优化 memcmp,其中输入缓冲区从不同的对齐方式开始是相当……繁琐的。
标签: c# .net arrays algorithm strstr