Я столкнулся с этой проблемой при работе с API коллекций Java.По сути, это метод поддержки реализации алгоритма Крускала для нахождения MST.Я создал этот класс для реализации алгоритма union / find.
Мой вопрос, поскольку мне удалось найти обходной путь, заключается в том, знает ли кто-нибудь какую-либо причину, почему метод remove в методе "union" будетне работает последовательно.То есть во время выполнения он удалит некоторые элементы, а не другие.Например, я реализовал это для задачи, связанной с городами, и мне не нравилось удалять некоторые города.В частности, он неоднократно сталкивался с несколькими разными наборами, но всегда одинаковыми.Я задавался вопросом, была ли это проблема со ссылкой на объект, т. Е. Проверял ли я не ту вещь, но я не мог ее обойти.
Я знаю, что остальная часть моей работы была правильной, поскольку я смог заменить еецикл, который исключает элемент, и алгоритм выполняется отлично.Однако, возможно, с немного худшими показателями.
Мне было интересно, может ли кто-нибудь увидеть ошибку.Также я должен отметить, что я вызвал его из другого класса, однако, вызовы были сделаны с элементами, которые были получены с использованием метода find.Обратите внимание, что метод find должен работать хорошо, так как простое изменение метода удаления заставляло все это работать, то есть находило и возвращало соответствующие объекты.
Спасибо
Оскар
/*
* A constructor for creating a new object of this class.
*/
DisjointSets()
{
underlying = new HashSet<HashSet<String>>();
}
/*
* A method for adding a set to this DisjointSets object
*/
void add(HashSet<String> h)
{
underlying.add(h);
}
/*
* A method for finding an element in this DisjointSet object.
*/
HashSet<String> find(String s)
{
// Check each set in the DisjointSets object
for(HashSet<String> h: underlying)
{
if(h.contains(s))
{
return h;
}
}
return null;
}
/*
* A method for combining to subsets of the DisjointSets
*/
void union(HashSet<String> h1, HashSet<String> h2)
{
System.out.print("CHECK ON DS\n");
System.out.print("*********************\n");
System.out.print("H1 is : { ");
for (HashSet<String> n: underlying)
{
System.out.print("Set is : { ");
for (String h : n)
{
System.out.print(h + " , ");
}
System.out.print("} \n ");
}
// Add the objects of h1 to h2
// DOES NOT WORK CONSISTENTLY
h1.addAll(h2);
underlying.remove(h2);
}
}
И я заменил его на
HashSet<HashSet<String>> temp = new HashSet<HashSet<String>>();
for(HashSet<String> f: underlying)
{
if(f != h2)
{
temp.add(f);
}
}
underlying = temp;