Если вы готовы принять амортизацию, вы можете достичь желаемых границ времени O (lg n) как для объединения, так и для поиска, используя двоичное дерево поиска для представления каждого набора.Для объединения двух деревьев размером m и n требуется время O (m log (n / m)), где m
Я думаю, вы также можете использовать коллекцию отсортированных массивов для представления каждого набора, но аргумент амортизации немного сложнее.
Как указано в других ответах, вы можете использовать кучи, но для получения O (LG N) для комбинации и выбора требуется некоторая работа.