У меня есть домашнее задание, в котором я должен реализовать алгоритм поиска объединения с функцией удаления объединения.Предполагается, что функция отмены объединения отменяет последнюю операцию union()
.Например, если я установлю размер на 6 и получу union(0,1) union(1,2) union(2,3)
, у меня будут наборы {0,1,2,3}
, {4}
, {5}
, а если я сделаю deunion()
, у меня будет {0,1,2},{3}, {4}, {5}
private int[] id;
private int [] size;
private int count;
public UFwithDeunion(int n) {
count = n;
id = new int[n];
for (int i = 0; i < n; i++) id[i] = i;
}
/**
* set the total number of elements
* @param n
* @return
*/
public static int setSize(int n){
size = new int [n];
for (int i = 0; i < n; i++) size[i] = 1;
}
/**
* @param a
* @return the identifier for the set containing a
*/
public static int find(int a){
while (a != id[a]) a = id[a] ;
return a;
}
public static void union(int a, int b){
int i = find(a);
int j = find(b);
if (size[i] < size[j]) {
id[i] = j;
size[j] += size[i];
}
else {
id[j] = i;
size[i] += size[j];
}
count--;
}
public static void deUnion(){
//not sure how to keep track of the last union operation
//but trying to find last element merged togeher, and then
//separating them int a separate list
int lastElement = find(id.get(id.size()-1));
}
/**
*
* @param a
* @return number of elements in the set containing a
*/
public static int elementsInSet(int a){
int i = find(a);
return size[i];
}
Моя проблема в том, что я не могу полностью обернуть голову, как я должен найти последнюю операцию объединения в моей функции объединения, и как мне отменить операцию?Просто удалить элемент из списка и поместить его в новый список?