【发布时间】:2015-02-11 02:34:54
【问题描述】:
假设你有 N 组未排序的字符,这些组之间有共同的字符。我想从这些集合中提取尽可能多的字符以使它们更小。但是将字符分解出来有一个限制:字符必须在您从 N 中选择的 M 个集合的交集中。这在某种程度上是一种无损集合压缩算法。下面的示例是有序集合,但这是为了便于阅读。不要假设集合会被订购。
一个简单的例子:
S1 = a b c d
S2 = a b c e f
S3 = a f g
答案是仅将 S1 和 S2 相交并分解出:a b c。这会减少 6 个字符,而其他任何集合的交集组合都会减少。
一个棘手的例子:
S1 = a b c d e f g h i
S2 = j k l m n
S3 = j k l o p q
S4 = j k l
S5 = a b c d
答案是忽略集合 S1 和 S5,取其余集合 S2、S3 和 S4 的交集得到:j k l。
a b c d 不正确的原因是,当你把这些字符从集合中分解出来时,剩下 19 个字符,而当你把 j k 和 l 分解出来时,只剩下 18 个字符。
有没有比指数时间更快地解决这类问题的算法?似乎您必须测试集合的幂集中每个集合的交集({},{S1},{S2},{S3},{S1,S2},{S1,S3},{S2 , S3}, {S1, S2, S3}) - 如果只有 3 个集合,则计算 8 个交点。
附:这不是一个紧迫的问题,但我认为这是我遇到的一个有趣的问题。
【问题讨论】:
-
嗯,我不太清楚什么条件取交叉口,对于你的第二个例子,如果我们只做两个交叉口会更好吗?
-
您不需要将已分解的部分至少保留一次吗?如果这是某种压缩,我想您将
{abcd, abcef}压缩为(abc + {d, ef})之类的东西,对吧?这很重要,因为在你的计数中,从 2 个集合中提取 5 个字符比从 3 个中提取 3 个要好,但以我的方式更糟。 -
@VincentvanderWeele 我猜压缩器会跟踪删除的内容,从哪些集合中删除。这将允许通过使用 m+n 额外内存来删除 m*n 元素。
-
@JanneKarila 是正确的。我将存储公共交集和一组索引列表,这些集的索引需要与公共交集组合以获取原始集。
-
@PhamTrung 是的,确实如此,两个交叉路口都会更好。但是为了这个问题,假设我们只被允许与 M 个集合执行一个交集。
标签: algorithm set intersection