检查两个m * n矩阵相等的最有效方法是什么,更重要的是检测两个矩阵不相等的[i] [j]索引(或索引)。
在我的情况下,'m'相对较小(< = 4)并且n相对较大(< = 512)。
问题的背景:我的应用程序有一个Active Standby设置。每当发生导致状态更改的事件时,活动就会向备用数据库发送更新。但是,我们观察到,即使活动已发送所有更新,备用数据库仍然与活动状态不同步。因此,我们计划对同步的数据结构进行审计。审计将计算活动的校验和并将其发送给从站。奴隶会做同样的事情,如果他们不匹配将返回NAk。然后,活动将再次同步从站。我的问题是我希望奴隶返回导致校验和不匹配的[i] [j]位置。
编辑:语言C
答案 0 :(得分:3)
虽然对于m>>的情况没有多大用处。 n,如果m~n,您可以单独校验所有行和列,总共提供m + n个校验和进行传输。通过执行此操作,您知道当i
行校验和与j
列校验和不匹配时,矩阵的条目A_ij
会出现问题。但是可能存在其他问题,这取决于校验和的强大程度以及它们允许误报的频率。
对于您的情况,发送516个单独的校验和并不是发送2048个条目的整个矩阵的重大胜利,因此实现这可能只是浪费您的时间进行过早优化。但对于512×512矩阵,发送1024个校验和比发送262,144个条目好得多。
答案 1 :(得分:0)
由于你不知道矩阵在哪里不匹配,你必须逐个元素地比较它们。只需迭代矩阵并进行比较。
您必须处理可能的缓存未命中处罚 - 您需要按顺序扫描矩阵,以免导致不必要的缓存重新加载。这取决于语言。例如,对于C,您需要让外循环迭代第一个索引,内循环迭代第二个索引。
答案 2 :(得分:0)
正如尖锐的说法,校验和主要是无法逆转的。如果您只能对矩阵的部分进行哈希处理,则可以进行二次搜索,在每次迭代时,您可以消除剩余范围的一半。即使有多个不匹配的元素,这也可以工作:你必须检查两半 此外,您的矩阵有大约2000个单元格,实际上非常小。因此,比较它们应该很快。如果每个对象包含大量数据,你可以散列每个对象(所以你有2000个哈希值,它应该比你的对象小得多),并比较哈希矩阵 - 那么你就可以确定问题所在。<登记/> 同样,请记住,计算校验和意味着要遍历整个矩阵,因此根据建议,比较它们的最佳值可能是一个接一个。
答案 3 :(得分:0)
Information Theory告诉我们,你无法在这里得到任何东西。如果有 m * n 个单元格并且每个单元格包含 k 位信息(例如16位整数),则矩阵的可能空间占用 m * n * k 位。
如果您希望能够发送一条“消息”并处理从“它们同步”到“每个单元格以独特而奇怪的方式不同”的每个案例,那么自然法则要求您做到这一点消息 m * n * k 位长。如果你使用 m * n * b - 1 位,我将能够构建两种你无法区分的情况。事实上,你的一半状态空间将无法区分。
现在,如果您进一步描述您的要求,我们可以削减一些可能性空间。例如,你可以获得的便宜是识别1个单元不同步的能力,正如其他人所描述的那样。请记住,如果有2个差异,设计用于定位1 diff的算法将完全失败。例如当它确实是单元格B和C时,它会告诉你单元格A不同步。