Я пытаюсь реализовать дизъюнктные множества для использования в алгоритме Крускала, но у меня возникают проблемы с пониманием, как именно это должно быть сделано и, в частности, как управлять лесом деревьев. После прочтения описания непересекающихся множеств в Википедии и прочтения описания в разделе Введение в алгоритмы (Кормен и др.) Я пришел к следующему:
class DisjointSet
{
public:
class Node
{
public:
int data;
int rank;
Node* parent;
Node() : data(0),
rank(0),
parent(this) { } // the constructor does MakeSet
};
Node* find(Node*);
Node* merge(Node*, Node*); // Union
};
DisjointSet::Node* DisjointSet::find(DisjointSet::Node* n)
{
if (n != n->parent) {
n->parent = find(n->parent);
}
return n->parent;
}
DisjointSet::Node* DisjointSet::merge(DisjointSet::Node* x,
DisjointSet::Node* y)
{
x = find(x);
y = find(y);
if (x->rank > y->rank) {
y->parent = x;
} else {
x->parent = y;
if (x->rank == y->rank) {
++(y->rank);
}
}
}
Я почти уверен, что это неполно, и что я что-то упускаю.
Во введении к алгоритмам упоминается, что должен быть лес из деревьев, но это не дает никакого объяснения практической реализации этого леса. Я смотрел CS 61B Лекция 31: Непересекающиеся множества (http://www.youtube.com/watch?v=wSPAjGfDl7Q), и здесь лектор использует только массив для хранения как леса, так и всех его деревьев и значений. Как я уже говорил, не существует явного типа класса Node. Я также нашел много других источников (я не могу опубликовать более одной ссылки), которые также используют эту технику. Я был бы счастлив сделать это, за исключением того, что это зависит от индексов массива для поиска, и, поскольку я хочу хранить значения типа, отличного от int, мне нужно использовать что-то другое (на ум приходит std :: map).
Другая проблема, в которой я не уверен, это распределение памяти, потому что я использую C ++. Я храню деревья указателей, и моя операция MakeSet будет: new DisjointSet :: Node; , Теперь эти узлы имеют только указатели на своих родителей, поэтому я не уверен, как найти нижнюю часть дерева. Как я смогу пройти через мои деревья, чтобы освободить их всех?
Я понимаю основную концепцию этой структуры данных, но я просто немного озадачен реализацией. Любые советы и предложения будут приветствоваться, спасибо.