请帮我解决以下问题的算法 -
鉴于一系列事实,我们希望尽可能多地消除冗余。该问题涉及的事实是大写字母之间的传递关系的成员。因此,每个事实都是一对大写字母,例如AB,意味着A与B相关。一个字母可能与自身相关,也可能不相关,但是传递性成立:如果A与B相关,而B与C相关,那么我们可以推断A与C有关 创建一个类FactCount,它包含一个方法minFacts,该方法被赋予一个已知的String []并返回最小的事实集合的大小,这些事实将允许我们推断出可以从包含的事实中推断出的所有事物(并且只有那些事物)。已知的。
已知的每个元素将包含由单个空格分隔的1个或多个事实。最小的一组事实可能包含可从已知但未包含在其中的事实。
例如:
{“AB AC CA AA BC”,“AD”}
返回:4
AB,CA,BC和AD允许我们推断AA(AB,BC,CA通过传递性给出AA)和AC(AB,BC通过传递性给出AC),并且没有更小的子集允许我们推断所有已知的事实。
P.S - 它不是功课。只是我在网上找到的一个问题,几个小时都无法解决......
答案 0 :(得分:5)
在我看来,您正在寻找图表的spanning tree。
连接图G的生成树 也可以定义为最大集合 G的边缘不包含循环, 或者作为一组最小的边缘 连接所有顶点。
从生成树中,您可以获得最小的图表表示。任何其他边缘的添加都将创建一个循环,因此节点之间关系的冗余信息。
另请注意,如果在算法结束时,您还有剩余的非连接节点(意味着图表中有MST不接触的节点),则表示您获得的生成树是独立实体,没有关系(边缘)连接生成树的节点和不在其中的节点。
在更多的数学术语中,属于您的生成树的节点和不属于它的节点是不相交的集合,并且它们都不是空集。
您当然可以在剩余的子集上再次执行MST搜索以生成生成林,直到耗尽节点集。