【问题标题】:Find the Next Different Occurrence查找下一个不同的事件
【发布时间】:2016-01-26 09:12:11
【问题描述】:

在我的项目中,我经常需要检查QByteArray 是否有下一个不同的字节。所以在一个有 999 个零和 1 个非零字节的数组中,我想找到第一个非零字节的索引。

通常,我会遍历每个字节,直到找到一个不为零的字节。但是由于 indexOf 只是查找给定值的下一次出现,是否有类似的函数与 indexOf 完全相反?

表演时间是我这​​样做的原因。我做了很多这样的循环只是为了找到第一个无关紧要的字节。有什么方法可以在不循环每个字节的情况下更快地做同样的事情?

【问题讨论】:

  • 我怀疑indexOf 的任何变体都会比简单的线性查找更快。
  • 嗯。 indexOf 本质上也只是一个循环吗?
  • 对于 1 字节搜索它是。无论如何,没有内置函数来获取第一个不匹配字节的索引。你必须自己实现它。

标签: c++ qt qbytearray


【解决方案1】:

如果您有一个相同字节的统一数组并且只有一些不同,则可以通过将数组指针转换为 (qint64*) 或 (qint32*) 来大幅提高性能,具体取决于您的机器并执行八到四次步骤通过阵列更快。

这是由qint64 * foo = (qint64*)byteArray.data();完成的

这样,要检查的 1024 个字节将分解为 128 次 qint64 比较或 256 次 qint32 比较,以找到要仔细检查的字节集以找到实际的不同字节。

例子:

0000 0000 0000 0000 0100

位置 18 的不同字节

如果您使用 qint32,则需要四个步骤(取决于您启动搜索的方式)才能找到与另一个不同的 qint32,因为它的值不是 0。

这种或类似的方法可能会帮助您加快搜索速度。

【讨论】:

  • 噢噢噢!很聪明!我很快就会试试这个,让你知道它是怎么回事。我喜欢这个主意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多