Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 模式匹配_Functional Programming_Pattern Matching_Combinatorics - Fatal编程技术网

Functional programming 模式匹配

Functional programming 模式匹配,functional-programming,pattern-matching,combinatorics,Functional Programming,Pattern Matching,Combinatorics,假设我有一组这样的元组(每个元组将有1、2或3项): 主数据集: {(A) (A,C) (B,C,E)} 假设我有另一组元组,如下所示: 真实场景:{(鲍勃)(汤姆)(埃里克,萨利,查理)(汤姆,萨利)(丹尼)(丹尼,汤姆)(萨利)(萨利,汤姆,埃里克)(鲍勃,萨利)} 我想做的是从实集合中提取元组的所有子集,其中元组成员可以替换为与主集合相同的元组 在上面的示例中,将返回两个集合: {(BOB) (BOB,SALLY) (ERIC,SALLY,CHARLIE)} (让BOB=A,ERIC

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

主数据集:

 {(A) (A,C) (B,C,E)}
假设我有另一组元组,如下所示:

真实场景:
{(鲍勃)(汤姆)(埃里克,萨利,查理)(汤姆,萨利)(丹尼)(丹尼,汤姆)(萨利)(萨利,汤姆,埃里克)(鲍勃,萨利)}

我想做的是从实集合中提取元组的所有子集,其中元组成员可以替换为与主集合相同的元组

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

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

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


我想这是一种模式匹配,一种组合数学。我真的不知道如何对这个问题进行分类,也不知道有什么常见的攻击计划。stackoverflow专家会提出什么建议?

由于您的问题可能是NP完全问题(它包括子图同构作为特例),因此很难有效地解决。不过,这假设模式和数据库的大小都不同。您正在搜索多少数据?你的模式有多复杂?我建议首先使用暴力解决方案,然后测试速度是否太慢,是否需要更高级的解决方案。

按大小将元组分成若干组。在每个集合中,创建一个数据结构,使您能够高效地查询包含给定元素的元组。这个结构的第一部分是元组作为数组(这样每个元组都有一个cannonical索引)。第二组是:
映射字符串(set Int)
。这有点占用空间,但希望不是禁止性的

然后,你,本质上,粗暴地强迫它。对于第一个主控集的所有指定,将所有指定限制为其他主控集。对于第二个的所有剩余赋值,将所有赋值限制在第三个及以上,等等。该算法基本上是归纳的


我应该补充一点,我不认为这个问题是NP完全问题,而只是简单的最坏情况指数问题。这不是一个决策问题,而是一个枚举问题。而且很容易想象输入会以指数级增长。

真正的集合中会有几千个元组it@freddy:主套(图案)有多大?最多6个tuples@freddy:您可以有一个数据库,其中每个元组有一个表。然后可以为模式匹配执行联接。索引可能会使性能合理,但最坏的情况可能仍然是缓慢的。
{(DANNY) (DANNY,TOM) (SALLY,TOM,ERIC)}