如何删除重复的矩阵(以数组表示)?
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 时如何比较数组中的值以删除重复项