模式匹配

时间:2011-02-28 08:21:58

标签: functional-programming pattern-matching combinatorics

假设我有一组这样的元组(每个元组将有1,2或3个项目):

Master Set:

 {(A) (A,C) (B,C,E)}

并假设我有另一组这样的元组:

真实套装:{(BOB) (TOM) (ERIC,SALLY,CHARLIE) (TOM,SALLY) (DANNY) (DANNY,TOM) (SALLY) (SALLY,TOM,ERIC) (BOB,SALLY) }

我想要做的是从Real Set中提取元组的所有子集,其中元组成员可以替换为与Master Set相同。

在上面的示例中,将返回两个集合:

{(BOB) (BOB,SALLY) (ERIC,SALLY,CHARLIE)}

(让BOB = A,ERIC = B,SALLY = C,CHARLIE = E)

{(DANNY) (DANNY,TOM) (SALLY,TOM,ERIC)}

(让DANNY = A,SALLY = B,TOM = C,ERIC = E)

它的模式匹配,我想是一种组合。我真的不知道如何对这个问题进行分类,以及对它有什么共同的攻击计划。 stackoverflow专家会建议什么?

2 个答案:

答案 0 :(得分:2)

按大小将元组分成几组。在每个集合中,创建一个数据结构,允许您有效地查询包含给定元素的元组。这个结构的第一部分是你的元组作为一个数组(所以每个元组都有一个规范的索引)。第二组是:Map String (Set Int)。这有点太空间,但希望不是禁止的。

然后,你,基本上,蛮力强迫它。对于第一个主集的所有分配,将所有分配限制为其他主集。对于第二个的所有剩余分配,将所有分配限制在第三个和更高的分配等。算法基本上是归纳的。

我应该补充一点,我不认为这个问题是NP完全的,而不仅仅是平坦的最坏情况指数。这不是决策问题,而是枚举问题。并且可以很容易地想象输入的情景呈指数级增长。

答案 1 :(得分:1)

由于您的问题可能是NP完全的(它包括子图同构作为一种特殊情况),因此很难有效地完成。但是,假设模式和数据库的大小各不相同。你在搜索多少数据?你的模式有多复杂?我会首先推荐蛮力解决方案,然后测试是否太慢,你需要更高级的东西。