需要帮助来创建算法,根据他们的意见将人们分组

时间:2016-05-05 09:26:52

标签: java python algorithm graph

我有以下问题

输入如下所示:

agree 1 2
disagree 2 3
? 1 2
? 1 3
agree 1 3
? 4 5
agree 0 5

等等。数字代表人(编号从0到n)。 同意意味着这两个人有相同的意见(我不知道哪个,如果是积极的或消极的,我只知道它是相同的)。 不同意意味着他们有不同的意见。 ?是一个程序必须回答的问题,也就是说,如果这两个人有相同的意见。

此特定输入的输出应如下所示:

yes
no
error
don't know

是的,因为第一个问题是1和2是否与第一个输入行有相同的意见。 不是因为1和3有不同的意见,因为我们可以看到1同意2和2不同意3所以1必须不同意3。 错误是因为我们得到的输入1与我们知道的谎言3是一致的,所以我们打印出错误。 不知道是因为最后一个问题是关于4和5之前没有被提及的人,所以我们不知道他们的意见。

所以我的想法是创建一个类Person并赋予它们属性:数字和颜色(意见),但后来我意识到,如果我没有连接组,例如1 2同意,这将无法工作4 5同意然后我会得到问题,如果2 4同意,我不知道答案,但他们会有相同的颜色..

我的问题是,如果你能帮助我找出存储每个人意见信息的最佳方式,最好是用Java或Python。

2 个答案:

答案 0 :(得分:1)

使用不相交的数据结构来获取由agree引起的图形的连通分量。

这会导致顶点(=人)P = {P_1, P_2, ..., P_n}

的分区

然后考虑下图的图表:

G = (P, {(A, B) ∈ P² | ∃ a ∈ A, b ∈ B: disagree(a, b)})

即。在新的Graph中连接了2个分区,如果有不同意的节点中有2个顶点。

现在您可以按如下方式获得结果:

  • don't know如果这些人不在G中属于G的连接组件的顶点内
  • 否则为G中包含两个人的连接组件双色。结果是:
    • error如果连接组件中有任何2个顶点,包含不同意的人或者连接组件没有2个着色
    • yes如果不是error且包含这些人的顶点颜色相同
    • no否则

答案 1 :(得分:0)

最简单的解决方法可能是使用Union - Find算法的变体,它使用名为disjoint-set data structure的数据结构。如果在每个集合中包含一个“颜色”作为root,您可以轻松找到一个人(数字)所属的颜色。合并到集合时,您必须添加一些额外的检查,以便打印“错误”。

如果速度不重要,那么采用天真的方法并跳过折叠联合链可能更容易。