【问题标题】:Disjoint sets issue不相交集问题
【发布时间】:2013-02-08 08:23:37
【问题描述】:

我正在尝试使用不相交集编写 Kruskal 算法的实现。我想我几乎可以正常工作,但我似乎无法让一段代码正常工作。代码需要检查图表上的节点是否已经在它试图添加到的集合中;否则,您不想添加它。这是我正在使用的代码:

public static boolean difSets(int index1, int index2, ArrayList<Node> sets[], Node nodes[])
{
    int setnum1 = 0;
    int setnum2 = 0;
    for(int i = 0; i < nodes.length; i++)
    {
        for(int j = 0; j < sets[i].size(); j++)
        {
            if(nodes[index1].getX() == sets[i].get(j).getX() && nodes[index1].getY() == sets[i].get(j).getY());
                setnum1 = i;
            if(nodes[index2].getX() == sets[i].get(j).getX() && nodes[index2].getY() == sets[i].get(j).getY());
                setnum2 = i;
        }
    }
    if(setnum1 == setnum2)
        return false;
    else
        return true;
}

一点信息:这个方法是确定两个节点是否已经在同一个集合中。节点数组包含图上的所有点(节点是一个只存储 x 和 y 值并可以检索它们的类。集合是节点的 ArrayLists 数组。在问题开始时,每个节点都将在一个 ArrayList 本身;到最后,它们应该都在同一个 ArrayList 中。索引 1 和 2 对应于 Nodes 数组中的节点。

不幸的是,这段代码似乎没有给我正确的输出;我已经盯着它看了一个多小时,我无法弄清楚问题是什么,所以我希望这里有人能帮助我。

提前致谢。

【问题讨论】:

  • 从您的代码中,我了解到节点数组的长度始终与集合数组的长度相同。当你开始合并集合时会发生什么,这不应该减小集合数组的大小吗?
  • 我只是在空格中留下了空集,而不是缩小它。循环只是忽略了它,因为 .size() 返回 0。回想起来,这可能是对不相交集的复杂实现的一种方式。

标签: java kruskals-algorithm disjoint-sets


【解决方案1】:

解决了。 java中对我来说根本没有意义的许多事情之一。

public static boolean difSets(int index1, int index2, ArrayList<Node> sets[], Node nodes[])
{
    int setnum1 = 0;
    int setnum2 = 0;
    int x1 = nodes[index1].getX();
    int y1 = nodes[index1].getY();
    int x2 = nodes[index2].getX();
    int y2 = nodes[index2].getY();
    for(int i = 0; i < nodes.length; i++)
    {
        for(int j = 0; j < sets[i].size(); j++)
        {
            int x3 = sets[i].get(j).getX();
            int y3 = sets[i].get(j).getY();
            if(x1 == x3 && y1 == y3)
                setnum1 = i;
            if(x2 == x3 && y2 == y3)
                setnum2 = i;
        }
    }
    if(setnum1 == setnum2)
        return false;
    else
        return true;
}

这实际上应该和我之前的完全一样。不过……

【讨论】:

  • 我不知道你的Node 类是什么样的,但我猜getX()getY() 返回Integers。如果是这种情况,则第 9 行和第 11 行中的 == 测试引用相等而不是值相等。在这种情况下,您可以改用 equals 方法,或者像在此解决方案中所做的那样,在与 int 的每次比较中至少拆箱一个值。
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多