C比较两个位图的最快方法

标签 c algorithm bit-manipulation bitwise-operators

有两个char数组形式的位图数组,有数百万条记录。使用 C 比较它们的最快方法是什么。

我可以想象在 for 循环中一次使用按位运算符 xor 1 个字节。

关于位图的要点:

  • 1% 到 10% 的算法运行次数,位图可能不同。大多数时候他们会是一样的。当嘿可以不同时,他们可以高达 100%。连续的条纹中比特变化的概率很高。
  • 两个位图的长度相同。

目标:

  • 检查它们是否不同,如果是,那么在哪里。
  • 每次都正确(如果有错误,检测错误的概率应为1)。

最佳答案

此答案假定您将“位图”表示为一系列 0/1 值而不是“位图图像格式”

如果您只是有两个相同长度的位图并希望快速比较它们,memcmp() 将像评论中有人建议的那样有效。如果您想尝试使用 SSE 类型优化,您可以,但这些并不像 memcmp() 那样简单。 memcmp() 假设您只想知道“它们不同”,仅此而已。

如果您想知道它们相差多少位,例如615 位不同,那么除了对每个字节进行 XOR 并计算差异的数量之外,您别无选择。正如其他人指出的那样,您可能希望一次以 32/64 位甚至 256 位执行此操作,具体取决于您的平台。然而,如果数组有数百万字节长,那么最大的延迟(对于当前的 CPU)将是将主内存传输到 CPU 的时间,并且 CPU 做什么并不重要(这里有很多警告)

如果你的问题更多的是关于比较 A 和 B,但实际上你做了很多次,比如 A 到 B 和 C、D、E 等,那么你可以做几件事

  • A.存储每个数组的校验和并首先比较校验和,如果它们相同,则数组很可能相同。显然这里存在校验和可能相等但数据可能不同的风险,因此请确保在这种情况下错误的结果不会产生显着的副作用。而且,如果您无法承受错误的结果,请不要使用此技术。
  • B.如果数组具有结构,例如它们是图像数据,则为此利用特定的工具,如何超出这个答案来解释。
  • C.如果图像数据可以有效压缩,则压缩每个数组并使用压缩形式进行比较。如果您使用 ZIP 类型的压缩,您无法直接从 zip 中看出有多少位不同,但是其他技术(例如 RLE)可以有效地快速计算位差异(但是要构建并快速正确地进行大量工作)
  • D.如果 (a) 的风险是可以接受的,那么您可以对 262144 位的每个 block 进行校验和,并且只计算校验和不同的差异。这大大减少了主内存访问,并且运行速度会快很多。

所有选项 A..D 都是关于减少主内存访问的,因为这是任何性能提升的核心(对于所述问题)

关于C比较两个位图的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240459/

相关文章:

c - C 中算术指针后增量输出背后的解释

c - Berkeley DB 段错误 - __bamc_put 参数未对齐?

c - 什么是最快的半任意精度数学库?

java - 如何在 java 中使用基本方法实现通用 PriorityQueue?

无法找出为什么我的程序没有做它应该做的事情

java - Kadane 算法实现返回错误结果

c++ - 将排序数组的元素分成最少数量的组,使得新数组的元素之间的差异小于或等于 1

c - 如何获取uint32_t的uint8_t数据

c++ - Q : How bitset are inside?

JavaScript trunc() 函数