C#-匹配数最多的子序列?
作者:互联网
给定二维数据数组,我将如何找到匹配次数最多的最大组合?
例:
Cust # Prod # C1 P1 C1 P2 C2 P1 C2 P3 C3 P1 C3 P3 C3 P4
(使用haskell-无法弄清楚如何在所需的C#中轻松做到这一点)
子序列为:
> subsequences ["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