Основы Union-Find

I. Понятие и введение

Union-Find — это древовидная структура данных, используемая для обработки объединения и запроса некоторых непересекающихся множеств.

Идея Union-Find состоит в том, чтобы использовать массив для представления всего леса (parent). Корневой узел дерева однозначно определяет множество; как только мы находим корень дерева элемента, мы можем определить, к какому множеству он принадлежит.

II. Примечания по применимости

Системы Union-Find используются в некоторыхNВ задачах применения множеств с элементами мы обычно вначале позволяем каждому элементу образовать одноэлементное множество, затем объединяем множества, содержащие элементы одной группы, в определённом порядке и в процессе многократно находим, какому множеству принадлежит элемент. Этот процесс может показаться простым, но когда объём данных чрезвычайно велик, если для его описания используются другие структуры данных, требуемое пространство часто оказывается слишком большим, чтобы компьютер мог его выдержать, и результат невозможно вычислить за короткое время. Поэтому для его обработки можно использовать только систему Union-Find.

III. Базовое представление данных системы Union-Find

Как показано выше0-4Все следующие0,5-9Все следующие1, что означает0、1、2、3、4Эти пять элементов связаны,5、6、7、8、9Эти пять элементов связаны.

Снова, как показано выше0、2、4、6、8Все следующие0Это множество представляет0、2、4、6、8Эти пять элементов связаны,1、3、5、7、9Все следующие1Это множество представляет0,1、3、5、7、9Эти пять элементов связаны.

Создайте класс UnionFind, инициализируйте его так, чтобы каждый id[i] указывал на самого себя, без объединённых элементов:

...
public UnionFind1(int n) {
        count = n;
        id = new int[n];
        // Инициализация: каждый id[i] указывает на самого себя, нет объединённых элементов
        for (int i = 0; i < n; i++)
            id[i] = i;
    }
...

Пример кода на Java

Загрузка пакета исходного кода:Скачать

Код файла UnionFind.java:

package example.union;

public class UnionFind{
    private int[] id;
    // количество элементов данных
    private int count;

    public UnionFind1(int n) {
        count = n;
        id = new int[n];
        for (int i = 0; i < n; i++)
            id[i] = i;
    }

}  
Другие расширения