首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现联合查找算法混淆

实现联合查找算法混淆
EN

Stack Overflow用户
提问于 2014-10-21 03:20:54
回答 1查看 561关注 0票数 1

我在努力实现一个联盟-为克鲁斯卡尔找到艾格。我使用的是伪代码,我不理解下面的联合部分step2 (它不是递归调用),也不理解我是否接近它。如果这种方法不起作用,只要我理解它,我就可以使用任何实现。提前谢谢。U和V是我的边缘节点,现在只是ints。

代码语言:javascript
复制
  Init(V)
  1.for every vertex v do
  2.boss[v]=v
  3.size[v]=1
  4.set[v]={v}

  Find (u)
  1.Return boss[u] 

  Union (u,v)
  1.if size[boss[u]]>size[boss[v]] then
  2.set[boss[u]]=set[boss[u]] union set[boss[v]]
  3.size[boss[u]]+=size[boss[v]]
  4.for every z in set[boss[v]] do
  5.boss[z]=boss[u]
  6.else do steps 2.-5. with u,v switched

我不明白第二步,到目前为止,这是我的代码:

代码语言:javascript
复制
public class UnionFind {

    private int[] _boss;
    private int[] _size;
    private int[] _set;

    public UnionFind(int max) 
    {
        _boss = new int[max];
        _size = new int[max];
        _set  = new int[max];
    }

    public void init(Set<Integer> vertSet)
    {
        //for every vertex do
        int j=0;
        for(int i : vertSet)
        {
            _boss[j]=i;
            _size[j]=1;
            _set[j]=i;
            j++;
        }
    }

    int find(int u)
    {
        return(_boss[u]);
    }

    void union(int u, int v)
    {
        if(_size[_boss[u]]>_size[_boss[v]])
        {
            _set[_boss[u]]=_set[_boss[u]];
             //_set[_boss[v]];
            _size[_boss[u]]+=_size[_boss[v]];

            for(int z=0;z<_boss.length;z++)
            {
                _boss[z]=_boss[u];
            }
        }
        else
        {
            //switch u and v
            _set[_boss[v]]=_set[_boss[v]];
            //union(_set[_boss[v]],_set[_boss[u]]);
            _size[_boss[v]]+=_size[_boss[u]];

            for(int z=0;z<_boss.length;z++)
            {
                _boss[z]=_boss[v];
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-21 03:49:53

第2步意味着集合u现在成为u和v的联合集,因此不能分配setv = setv。因此,如果设u是{u},集合v是{v},那么在这一步之后,集合u将是{u,v},另一个例子是设置u= {1,2},集合v= {3,4},在此之后,集合u= {1,2,3,4}。根据您正在使用的数据结构,您需要以不同的方式实现它。一种方法是使用ArrayList

代码语言:javascript
复制
ArrayList<Integer> set[] = new ArrayList[max];
//Initialize each set, add element into set
for(int i = 0; i < max; i++)
   set[i] = new ArrayList();
   set[i].add(i);
//For step 2
set[boss[u]].addAll(set[boss[v]]);

最后一件事是,您的步骤4是错误的,对于当前的实现,您只需将每个元素添加到set[bossu]中,但是在这个步骤中,它们只需要set[bossv]中的元素。所以:

代码语言:javascript
复制
        int bossV = boss[v];//This is important! Answer why this is needed by yourself.
        for(int z=0;z<_boss.length;z++)
        {
            if(boss[z] == bossV)
               _boss[z]=_boss[u];
        }

注意:这个版本你使用的不是最快的版本,为联合-查找,试着阅读更多关于它!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26478352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档