【问题标题】:Recreate sets from combinations of these sets从这些集合的组合中重新创建集合
【发布时间】:2011-04-16 20:29:59
【问题描述】:

我遇到了一个特定的问题,并为它寻找一些算法。要解决的问题如下所述。

假设我们有如下组合

1 - 3 - 5

1 - 4 - 5

1 - 8 - 5

2 - 4 - 5

3 - 4 - 5

2 - 4 - 7

这些组合是从给定的集合中生成的,在这种特殊情况下,假设来自

{1},{3,4,8},{5}

{2,3},{4},{5}

{2},{4},{7}

我想做的是从这些组合中重新创建集合。我知道对于这些组合,您有不止一种解决方案,例如

第一种解决方案

{1}、{3、4、8}、{5}

{2, 3}, {4}, {5}

{2}、{4}、{7}

第二个解决方案

{1}、{3、8}、{5}

{1、2、3}、{4}、{5}

{2}、{4}、{7}

第三种解决方案

{1}、{3、4、8}、{5}

{3}、{4}、{5}

{2}、{4}、{5、7}

但最终(最佳)解决方案将是具有尽可能少集合的解决方案或随机解决方案,以防它们在集合计数方面都相同。

存在此类问题的算法吗?如果任何一直在处理此类问题的人可以给我一些提示,我将不胜感激。

编辑:看起来我正在寻找的是 n 元积的分解(N 的笛卡尔积)

编辑:在对该主题进行更多研究后,我发现这个问题在“图论”中被称为“最小集团覆盖”问题

问候, 呵呵

【问题讨论】:

  • 为什么需要这样压缩?数据压缩后是否需要快速检索信息,这是内存问题?
  • 嘿 Loic,也许“压缩”不是描述它的最佳术语,不,这不是记忆的问题。节省空间在这里不是目的,没关系。重要的是表现。

标签: algorithm graph-theory combinatorics cartesian-product clique


【解决方案1】:

这不是真正的答案,更多的是扩展评论。您的“压缩表示”实际上根本没有节省任何空间。

在您存储的未压缩表示中:

  • 表示每组由 3 个符号组成的规则;和
  • 18 个(在您的示例中)符号。

这可以存储在1R+18S中(其中R是存储规则所需的空间,S是存储符号所需的空间)

在您应该存储的压缩表示中:

  • 每组由 3 组符号组成的规则;
  • 每组中的符号;和
  • 另一个将每个集合与下一个集合分隔开的符号。

在您的第一个“压缩”表示中,我计算 1R+12S+8D(其中 D 是存储一个分隔符所需的空间)。如果 S==D 那么这是 1R+20S - 比您的未压缩表示多。

在您的其他两个“压缩”表示中,我计算相同:1R+12S+8D 和 1R+12S+8D。

我还没有弄清楚这种非压缩是您提案的基本特征,还是您选择的示例的偶然特征。

你是说,当你写的时候

组合元素的数量 实际上是N

某些组合将包含 3 个元素,其他 4 个,其他 2 或 5 个等?

我建议你澄清你的问题。

编辑:@bazeusz:现在看来您正在寻找集合的笛卡尔积

【讨论】:

  • 嘿,马克,虽然在这里节省空间不是目的,但我不同意你的看法。压缩表示将减少存储它所需的空间。将其视为数字数组而不是字符串,分隔符不会'没关系。它更像是一种保存在内存中的结构的表示。我正在以未压缩的形式(内部作为数字数组)获取数据,我需要将其转换为压缩形式该过程将反向生成组合来自多个集合。按 N 我认为一个解决方案应该是通用的并且适用于任何 N。但是只对具有相同 N 的数组进行分组。
  • @bazeusz:如果不考虑节省空间,我建议您修改问题的标题并删除“压缩”一词。如果节省空间不是您的目标,您的问题是什么?
  • @Mark:嘿,它正在从这些集合的笛卡尔积中寻找集合;你知道任何现有的算法吗?
  • @bazeusz: yes: foreach element in set 1, foreach element in set 2, foreach element in set3 (etc), 写出元素的序列。仅此而已。
  • @Mark:你描述的过程是你有一些集合,你想从中创建笛卡尔积;这个很明显;但是我对这样一种情况很感兴趣,当我从这样的操作中得到结果并且我想重新创建创建结果的集合时。所以这是与你描述的相反的操作。
猜你喜欢
  • 2014-10-11
  • 1970-01-01
  • 2020-07-03
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多