【问题标题】:Performance Way to check if a byte array contains another byte Array C#检查字节数组是否包含另一个字节数组C#的性能方法
【发布时间】:2019-10-06 04:47:58
【问题描述】:

我正在检查一个字节数组是否包含另一个带有此代码的字节数组:

private int IndexOf(int index, byte[] AllBytes, byte[] searchByteArray)
{
    for (int i = index; i <= AllBytes.Length - 1 - searchByteArray.Length - 1; i++)
    {
        for (int j = 0; j <= searchByteArray.Length - 1; j++)
        {
            if (AllBytes[i + j] == searchByteArray[j])
            {
                if (j + 1 == searchByteArray.Length)
                    return i;
            }
            else
                break;
        }
    }
    return -1;
}

这很完美,我得到了第一个字节的索引。

但问题是我想检查非常大的数据。

我的“大”数组包含大约 900000000 个字节,而我的 searchArray 大约包含 10-20 个字节。这样,我的功能非常非常慢。有没有办法让性能更好?

谢谢。

【问题讨论】:

  • 这在SO这里太宽泛了,所以我认为你在Code Review有这样的问题会更好。
  • 方法有很多。这是一个string search,有几种不同的算法可以实现不同的权衡。

标签: c# arrays optimization


【解决方案1】:

您可以将Boyer–Moore string-search algorithm 调整为字节。

首先,您创建一个数组int[256],其中数组索引对应于所有可能的字节值。该数组包含从末尾开始的搜索模式中每个字节值的位置,以及未出现在搜索模式中的值的搜索模式长度。

然后将模式的最后一个位置与输入数组中的位置进行比较。如果值不匹配,您可以通过在索引处找到的表中与输入数组中的值相等的值来推进搜索位置。如果它们匹配,则将模式与输入进行比较。

例子

intput:         100 206 002 250 123 075 074 109 184 222
search pattern:             200 109 100 150 123
                                             ^
                                             |

桌子

...
[108] = 5
[109] = 3
[110] = 5
...

值123 与109 不匹配,因此您在位置109 查找表并得到3。 IE。您可以将搜索位置增加3,使两个109 值对齐。如果值为108,您可能已经移动了5 位置(完整的搜索模式长度)。

上面的链接更详细地解释了算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2013-09-30
    相关资源
    最近更新 更多