【发布时间】:2010-10-12 21:00:27
【问题描述】:
我正在寻找一种有效的方法来确定一个集合是否是 Matlab 或 Mathematica 中另一个集合的子集。
示例: 设置 A = [1 2 3 4] 设置 B = [4 3] 设置 C = [3 4 1] 设置 D = [4 3 2 1]
输出应该是:Set A
集合 B 和 C 属于集合 A,因为 A 包含它们的所有元素,因此可以删除它们(集合中元素的顺序无关紧要)。集合 D 与集合 A 具有相同的元素,并且由于集合 A 在集合 D 之前,我想简单地保留集合 A 并删除集合 D。
所以有两个基本规则: 1.删除一个集合,如果它是另一个集合的子集 2. 如果一个集合的元素与前一个集合的元素相同,则删除一个集合
我的 Matlab 代码在这方面效率不高 - 它主要由嵌套循环组成。
非常欢迎提出建议!
补充说明:问题在于,如果有大量集合,就会有非常大量的成对比较。
【问题讨论】:
-
你知道集合的元素吗?它们只是整数吗?它们仅在一定范围内吗?如果是这样,请考虑设置一个一维布尔(位)数组,每个元素对应于 A 中的一个整数。因此,一次通过 A 以形成该数组,然后通过 B 以检查 B 的每个元素是否为在 A 中(只需查看该标志在数组中是否为真)。如果这些是已知范围内的整数,那么为了提高效率,你应该得到 O(n) 范围内的东西。如果它们不是整数或未知范围 - 散列方案可以以类似的方式工作。
-
是的,它们只能是整数。集合的最大大小也是已知的。
-
您是否确实验证了您在成对比较花费太多时间时遇到问题?您可以通过根据大小对集合进行排序来减少比较次数,因为如果 B 小于或与 A 大小相同,则 B 只能是 A 的子集。
-
你打算用集合 { [1,2], [3,4] } 做什么?即,您打算返回空集(“没有集是所有集的超集”)还是打算返回 {[1,2],[3,4]}(“所有集都是这些集的子集”套”)?
标签: matlab set wolfram-mathematica