【问题标题】:How to reduce a set of sets to one where no element is a subset of another?如何将一组集合减少到一个没有元素是另一个子集的集合?
【发布时间】:2015-01-24 02:33:15
【问题描述】:

首先:不,这不是作业!这适合我正在为游戏编写的求解器。我只是将问题简化为这个简洁的陈述:

给定一组集合 S,找出并删除 S 的任何元素,这些元素是 S 的其他元素的子集。

1

1 i|

2

10

详情

Si 是 [0, K)

的子集

min(|Si|) >= logC(|S|)

我目前的方法是通过我所说的“NatSet”(即bool[K])将每个集合保持在 S 内。然后我按 |Si| 对 S 进行排序并进行 O(|S|^2) 搜索以查找作为其他元素子集的元素。不幸的是,这对于我的目标值 C=6 和 K=16*9 来说太慢了。

【问题讨论】:

  • 嗯,好吧,如果您正在检查特定元素 A,那么 S 中唯一可能将 A 作为子集的元素是大小至少为 @987654325 的元素@。因此,这可能会稍微缩小您的搜索范围。您还可以从 S 中的最大集合(或集合列表,如果有多个具有最大大小的集合)开始,然后搜索 S 中的其余集合以查看哪些是所讨论的最大集合的子集。丢弃任何存在并继续使用第二小的集合(或具有第二小的集合的集合),等等。
  • 你能按一些标准排列(排序)你的集合(内部的)的元素吗?
  • 更大的,|S|还是 K?
  • 你是怎么拿到这一套的?加Si的时候可以过滤吗?
  • @Tony 我正在考虑提出一个新问题,详细说明我正在尝试做什么。无论哪种方式,我都是通过对可能移动的 C-ary 树进行 DFS 来获得集合。 S 是树的整个级别。我在这里提出的问题是我修剪一些分支的策略。

标签: algorithm set-theory


【解决方案1】:

考虑到我无法尝试(set S 的输入对我来说是不可见的)并决定以下是否有帮助,我只能为您提供一些提示:

  1. 比较两个集合时: 'diminished' binary search: 当你比较集合 A (x1...xn) 是否是集合 B( y1...ym ) 的子集时,假设你找到yk = x1 (n

        y1, y2, ...,yk, yk+1 ... ym
                    |
                   x1   
    

    那么你可以在[yk+1, ym]的范围内搜索x2。其他都一样。

  2. 选择两组进行比较时: 选择大的(即s1sk,然后是s1sk-1),您说按大小排序,大的更有可能包含它。
  3. Sort Si?我不确定 sort S 是否可以提高您的性能,您可以尝试不进行排序或使用 max-heap(参见技巧 4)
  4. 使用最大堆: 将叶子与根和根的儿子之一进行比较...如图所示)。

如果叶子没有被移除(即不是它父亲的子集),只需将它从堆中移除,您就可以将它交换到叶子被移除的地方。 (如下图)

注意:使用堆不能保证所有子集都被删除。

  1. 如何排序?:在您的情况下,counting sort 似乎是一种合适的排序方式,即线性排序。

更多:

1.你说你在修剪树,你要Alpha–beta pruning吗?

2.Efficient list intersection algorithm

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这里的内在问题是,给定两个集合,一个包含 p 个元素,另一个包含 q 个元素(不失一般性,我们可以说 p

    据我了解,您正在进行 O(K^2) 搜索,因此您的总运行时间为 O((n^2)*(K^2)),其中 n 是 S 的元素数. 您可以使用 HashSet 方法将其减少到 O((n^2)K)。这是 Java http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html 的链接,几乎所有主要语言在其标准库中都有一些实现。尽管如果您的集合 S 在 n= 6^(16*9) 附近的任何地方,那么我认为这不会有太大帮助(我什至不确定您是否可以在这种大小的现代计算机中容纳任何相关数据)。

    如果您可以将 k 降低到

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2013-01-10
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多