Java 使用union-find+;树映射太慢

Java 使用union-find+;树映射太慢,java,arrays,network-programming,treemap,union-find,Java,Arrays,Network Programming,Treemap,Union Find,我正在解决这个挑战: 我的解决方案似乎可行,但kattis的测试用例运行太慢,所以我想知道如何提高代码效率。我正在使用定制的union find结构来实现这一点,将“friends”存储到树状图中以供参考 import java.util.*; public class virtualfriends { public static void main(String[] args) { Scanner scan = new Scanner(System.in);

我正在解决这个挑战:

我的解决方案似乎可行,但kattis的测试用例运行太慢,所以我想知道如何提高代码效率。我正在使用定制的union find结构来实现这一点,将“friends”存储到树状图中以供参考

import java.util.*;
public class virtualfriends {

    public static void main(String[] args) {


        Scanner scan = new Scanner(System.in);
        int testcases = scan.nextInt();

        scan.nextLine();

        for (int i= 0; i < testcases; i++) {
            int numFriendships = scan.nextInt();
            scan.nextLine();
            TreeMap<String , Integer> map = new TreeMap<String , Integer>(); 
            int cnt = 0;
            UF unionFind = new UF(50000);
            for (int j = 0; j < numFriendships; j++)
            {

                String p1 = scan.next();
                String p2 = scan.next();
                if (!map.containsKey(p1)) map.put(p1, cnt++);
                if (!map.containsKey(p2)) map.put(p2, cnt++);
                unionFind.unify(map.get(p1), map.get(p2));
                System.out.printf("%d\n", unionFind.getSetSize(map.get(p2)));
            }
        }
    }

    static class UF{
        private int[] id, setSize;
        private int numSets;

        public UF(int size) {
            id = new int[size] ;
            setSize = new int[size];
            numSets = size;
            for(int i = 0 ; i < size ; ++i) {
                id[i] = i;
                setSize[i] = 1;
            }
        }

        int find(int i ) 
        {
            int root = i;
            while (root != id[root]) {
                root = id[root];
            }
            while (i != root) {
                int newp = id[i];
                id[i] = root;
                i = newp;
            }
            return root;
        }

        boolean isConnected(int i , int j) {
            return find(i) == find(j);
        }

        int getNumSets() {
            return numSets;
        }

        int getSetSize(int i) {
            return setSize[find(i)];
        }

        boolean isSameSet(int i, int j) {
            return find(i) == find(j);
        }

        void unify(int i, int j)
        {
            int root1 = find(i);
            int root2 = find(j);
            if (root1 == root2) return;

            if (setSize[root1] < setSize[root2]) 
            {
                setSize[root2] += setSize[root1];
                id[root1] = root2;
            } else {
                setSize[root1] += setSize[root2];
                id[root2] = root1;
            }
            numSets--;
        }

    }

}
import java.util.*;
公共类虚拟朋友{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
int testcases=scan.nextInt();
scan.nextLine();
for(int i=0;i
使用像这样的性能调试器来找出在以下方面占用的大部分时间:。或者你可以试着在debug中运行它,然后随机点击pause。它很可能会在占用大部分时间的行上暂停。请使用类似于此的性能调试器来找出占用大部分时间的位置:。或者你可以试着在debug中运行它,然后随机点击pause。它很可能会在占用大部分时间的线路上暂停