我正在做一个项目,它有一个复杂的数据结构,我不知道如何解析。我一直在试图建立一个解决方案,但我提出的每一个想法,我得到的感觉,它不会有100%的准确性。如果有一个已经存在的已知和经过测试的方法,那么我可以依靠它。
下面是一个例子:
假设一个商店有一个促销列表,每个促销都有自己的列表,显示它是否可以与其他促销联系起来我需要想出一堆相互联系的促销手段,一点也不遗漏任何促销手段。
所以假设我有促销活动,A、B、C、D。我会得到一个列表,告诉我哪些促销活动与哪些促销活动对应:
A->B=S(可堆叠)
A->C=N(不可堆叠)
A->D=S
B也有它的清单,D也有它的清单我不能假设没有N意味着它是可堆叠的,但我可以假设没有S意味着它是不可堆叠的可能有从1到无限的促销活动。
我需要确保我得到所有可能的促销组合。最后,我需要一个所有组合的数组(最好是唯一的组合),但如果列出了每个组合,即使是非唯一的也可以。如果你知道这样一个问题的名字,你可以用这个名字来回答,你不需要编辑我的问题,只要一个名字就足够我自己在谷歌上搜索它了。

最佳答案

我认为这可以表述为clique problem
你需要构造一个图,其中提升是顶点,如果提升可以叠加,则两个顶点之间有一条边。一个可能的提升现在是一个完整的子图或团,这是一个子图,其中每个顶点在子图中彼此连接。
这是一个np完全问题,但如果你的系统不是太大,它应该是可行的解决方案。
蛮力算法是非常直截了当的。有两种特殊情况。
首先,所有顶点都是团(每个提升单独进行)
连接两个顶点的所有边都是团(两个提升的列表)
然后休息

k = 2 .. (number of vertices)
  v in vertices
    if (v.neighbors.size >= k)
      s in distinct combination of k neighbors of v and v
        if each vertex in s has a link to other vertices in s add s to the list

从算法上可以看出,当组合的数量呈指数增长时,如果有大量的链接,则速度会变慢。

09-06 17:25