我有两个byte[]
我想找到第二个的第一次出现byte[]
在第一个byte[]
(或其中的一个范围)。
我不想使用字符串来提高效率(翻译第一个byte[]
to a string
会效率低下)。
基本上我相信就是这样strstr()
在 C 中做。
最好的方法是什么(这样既高效又易于使用)?
它应该是这样的:
int GetOffsetOfArrayInArray(byte[] bigArray, int bigArrayOffset, int bigArrayCount, byte[] smallArray);
Thanks!
UPDATE:
我想要一个比简单搜索更有效的解决方案。这意味着应该使用比较缓冲区可以更有效的事实 -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次比较。
我没有任何代码给您,但您会找到的最快解决方案的名称是博耶-摩尔 http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm算法。它可以比 O(n) 做得更好。
Here http://www.codeproject.com/KB/recipes/BoyerMooreSearch.aspx是 CodeProject 上字符串的实现。看起来像是转换为byte[]
应该不会太难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)