Java 使用union-find+;树映射太慢
我正在解决这个挑战: 我的解决方案似乎可行,但kattis的测试用例运行太慢,所以我想知道如何提高代码效率。我正在使用定制的union find结构来实现这一点,将“friends”存储到树状图中以供参考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);
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。它很可能会在占用大部分时间的线路上暂停