检查网格/真值表的对称性

Check the symmetry of a grid/truth table

本文关键字:对称 真值表 网格 检查      更新时间:2023-10-16
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f
t t f f f f t t
t t f f f f t t
f f t t t t f f
f f t t t t f f

是否可以使用 8 输入真值表(例如 OR、AND、XOR 等(确定上述 8x8 的对称性?

假设你的意思和我一样对称,并且你有像bool[][]std::vector<std::vector<bool> >(或char而不是bool之类的东西,只要==工作,这并不重要(,你只需迭代矩阵的一半并与另一半进行比较, 像这样:

bool symmetric = true;
for (unsigned int i = 1; symmetric && i <= n; ++i) {
  for (unsigned int j = i+1; symmetric && j <= n; ++j) {
    symmetric = (M[i][j] == M[j][i]);
  }
}

请注意,您不需要检查对角线,这就是为什么i在上面的代码中从 1 开始,ji+1 开始。

(我倾向于写比某些人喜欢的更多的括号和大括号。我只是碰巧更喜欢这样编写的代码。


编辑:

你可以有一个64个输入的表,告诉你哪些输入是对称的,当然。通过一些压缩,您可以将该表存储在 2097152 TB 的内存中。我想循环代码可以在您完成加载此表以进行查找之前经常运行。相反,您当然可以将平行于对角线的六条非平凡线输入到相应的真值表中,因为如果它们是对称的,则整个矩阵都是对称的。这些表(用于 2、3、4、5、6、7 和 8 个输入(很容易放入几百个字节。

但无论如何,你对对称性的解释似乎与我的不同。如果您对每一行和/或每列是否对称感兴趣,那么很明显,您可以使用真值表。描边它们需要 256 位,所以如果你的空间真的很短,你可以把它们压缩成 8 位,但当你在上面花费 256 字节时,查找可能会更快。

所以,我在评论中所说的是反复检查某些对并对它们进行"非异或"。

这些对的想法是,

如果一行是对称的,则某些对必须相等。请注意,我们零索引数组,我们在每行中都有索引,这些对将具有索引 0 和 7、1 和 6、2 和 5、3 和 4。为了使行对称,所有 4 个都必须是匹配对。总的来说,要使表对称,有 32 对要检查(每行 4 对,超过 8 行(。

NOT XOR 的

诀窍在于,由于 XOR 返回 true iff,两者是不同的,该语句的否定返回 true 如果两者相同。

因此,如果你想只使用布尔运算来执行整个检查,你可以把这些对中的每一个,(现在称之为(a,b((和do(NOT(a XOR b(((!(a^b)在代码中(,然后是所有32个检查的结果。

当然,如果我真的在代码中这样做,我宁愿定期检查相等性。