我正在开发一个具有复杂数据结构的项目,我不知道如何解析。我一直在努力建立一个解决方案但是我提出的每个想法都让我感觉它不会有100%的准确性。如果已经存在一个众所周知且经过测试的方法,那么我可以依靠它。
所以这是一个例子:
想象一下,商店有一个促销列表,每个促销都有自己的列表,列出是否可以与其他促销联系。我需要提出一堆可以相互联系的促销活动,而不是任何促销活动。
所以我想说我有促销活动,A,B,C,D。我会得到一个清单,告诉我哪些促销活动与哪些促销活动有关:
A - > B = S(可堆叠)
A - > C = N(不可堆叠)
A - > D = S
B也有它的列表,D将有它的列表。我不能假设没有N意味着它是可堆叠的,但我可以假设没有S意味着它不可堆叠。可能有从1到无限促销的任何地方。
我需要确保获得所有可能的促销组合。最后,我需要一个包含所有组合的数组(最好是唯一的组合),但如果列出每个组合,即使非唯一也是如此。如果你知道这个问题的名称,你可以只用名字来回答,你不需要编辑我的问题,只要一个名字就足以让我自己在Google上搜索更多。
答案 0 :(得分: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
从算法中可以看出,如果组合数量呈指数增长,那么如果有很多链接则会变慢。