如何删除重复的矩阵(以数组表示)?

Posted

技术标签:

【中文标题】如何删除重复的矩阵(以数组表示)?【英文标题】:How to remove duplicated matrix (represented in array)? 【发布时间】:2011-03-08 21:21:40 【问题描述】:

这个标题没有完全描述我的意思,但我就是想不出更好的。让我描述一下我的问题。

我有一个包含许多数组作为元素的数组。好像

[
[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p],
[i, j, k, l, m, n, o, p, a, b, c, d, e, f, g, h],
[m, i, e, a, n, j, f, b, o, k, g, c, p, l, h, d],

...

]

其实每个元素都代表一个矩阵,所以上层数组可以理解为

[
 +-            -+
 |  a, b, c, d  |
 |  e, f, g, h  |
 |  i, j, k, l  |     // matrix1
 |  m, n, o, p  |
 +-            -+ ,

 +-            -+
 |  i, j, k, l  |
 |  m, n, o, p  |
 |  a, b, c, d  |
 |  e, f, g, h  |
 +-            -+ ,

 +-            -+
 |  m, i, e, a  |
 |  n, j, f, b  |    // matrix2
 |  o, k, g, c  |
 |  p, l, h, d  |
 +-            -+ ,

 ...

]

我的数组是由 a 到 p 的字母组成的所有矩阵的超集。数组中的某些矩阵被认为是重复的。如果您水平、垂直、通过两条对角线翻转矩阵,或将其旋转 90、180、270 度并且结果矩阵包含在我的数组中,则这两个矩阵被认为是“重复的”。例如,如果您将 matrix1 顺时针旋转 90 度,您将得到 matrix2。所以 matrix2 和 matrix1 被认为是重复的。我们只需要其中之一。我的问题是,删除原始数组中的重复项的最佳(最简单)方法是什么(删除哪个,保留哪个不是问题,您只需保留其中一个)?

谢谢。

【问题讨论】:

【参考方案1】:

我建议您定义一些表示矩阵的“标准”方式。表示应该具有这样的性质,即互为旋转和镜像的矩阵具有相同的表示,并且所有互不互为旋转和镜像的矩阵具有不同的表示。由于矩阵中的所有字母在您的情况下都是唯一的,您可以按如下方式定义“标准”表示:给定一个矩阵,旋转并翻转它,以便所有角字母中最低的字母最终位于左上角,并且第二个最低的字母(在与最小字母相邻的两个角中)最终位于右上角。然后,将矩阵“压缩”成一个字符串。例如,两个

h b d j
l n f i
o g a k
n c p e

e k i j
p a f d
c g n b
n o l h

(这是第一个顺时针旋转 90 度然后倒置的矩阵)将具有标准表示 ekijpafdcgnbnolh。您现在可以遍历所有矩阵,为每个矩阵生成标准表示并将其放入 HashSet(如果尚不存在)。丢弃集合中已经存在其标准表示的所有矩阵。

【讨论】:

好主意,我会试一试。谢谢。

以上是关于如何删除重复的矩阵(以数组表示)?的主要内容,如果未能解决你的问题,请参考以下文章

NSSet 在使用 SetWithArray 时如何比较数组中的值以删除重复项

如何在工作表中动态创建具有列数的数组,以删除多列中的重复项

如何从 php 数组中删除具有特定值的所有元素? (以尽可能最短的方式)[重复]

matlab如何让数组每个元素重复出现?

如何从数组的numpy数组中删除外部数组[重复]

如何在android中删除arraylist中的重复名称[重复]