编程语言
首页 > 编程语言> > C#-匹配数最多的子序列?

C#-匹配数最多的子序列?

作者:互联网

给定二维数据数组,我将如何找到匹配次数最多的最大组合?

例:

Cust #  Prod #
C1      P1
C1      P2
C2      P1
C2      P3
C3      P1
C3      P3
C3      P4

(使用haskell-无法弄清楚如何在所需的C#中轻松做到这一点)
子序列为:


    > subsequenc­es ["P1"­,"P2","P3"­, "P4"]­
    => [[],["P1"],["P2"],["P1","P2"],["P3"],["P1","P3"],["P2","P3"],["P1","P2","P3"],["P4"],["P1","P4"],["P2","P4"],["P1","P2","P4"],["P3","P4"],["P1","P3","P4"],["P2","P3","P4"],["P1","P2","P3","P4"]]

我想找到X个大小大于Y个匹配项的子序列…

因此,在此示例中,具有多个匹配项的最大子序列为:[“ P1”,“ P3”]-具有2个计数

因为各个客户顺序是:


    C1 => ["P1, "P2"]
    C2 => ["P1", "P3"]
    C3 => ["P1", "P3", "P4"]

因此,这些集合中有两个[“ P1”,“ P3”]实例.

我最初的想法是先生成子序列然后进行匹配,但是我的数据集太大.

注意:我的数据集包含13000个2D数据的唯一组合,因此子序列方法可能会溢出,也可能永远不会结束,具体取决于语言.

编辑:我对最长的子集感兴趣(未排序)

编辑:@吉米:如果将以下内容添加到列表中,我希望结果是P1,P2,P4,因为它拥有该购物篮的最多顾客.不幸的是,您的解决方案不起作用

    { "C4", new HashSet<string>(new[] { "P1", "P2","P4"})},
    { "C5", new HashSet<string>(new[] { "P1", "P2","P4"})},
    { "C6", new HashSet<string>(new[] { "P1", "P2","P4"})},

编辑:@埃里克·利珀特

我理想的输出将是每种组合以及每种组合的子集.然后,我可以查询最大的购物篮,而该购物篮中的商品数量最少.

编辑:从业务角度来看,我想找到许多客户购买的最频繁出现的商品.我意识到很多而且篮子的大小模糊不清-但这就是分析结果的地方.

解决方法:

这个问题可以表述如下(如果我对您的理解很好):

给定n套:C1 … CN,
每个元素都由元素{P1 … PN}组成

找到这些子集的X与至少Y个元素的交集.

找到这些N个集合的最大子集相交的更复杂的问题是NP-Hard(参见此proof).

您的问题也可能是NP-Hard或NP-complete(因为它看起来像是找到最大交点的问题的决策版本).您将无法找到有效的解决方案来解决您的问题.

您应该查找最大子集相交问题的启发式方法,或者寻找一些相似(但不同)和更流行的问题(如集合覆盖问题)的启发.

标签:c,algorithm,haskell
来源: https://codeday.me/bug/20191208/2088220.html