Набор неупорядочен, поэтому сортировка наборов бесполезна. «Сортированный» набор такой же, как и сам набор, даже при нехватке памяти.
Представлять набор в не дефицитной памяти - это все равно, что представлять набор в дефицитной памяти. Однако если памяти недостаточно, мы могли бы создать двоичный предикат для каждого значения или объекта в памяти, заявив: «Я являюсь членом множества X».
Если вы хотите проверить, является ли объект Y членом множества X, просто проверьте двоичный предикат; это либо правда, либо ложь.
Итерация всех объектов в наборе похожа на массив. Он также может быть реализован как двойной связанный список или с использованием хеш-таблицы. Разница заключается в деталях; какие объекты вы хотите в наборе?
Если бы памяти не было мало, и у вас осталось достаточно мощности в вашем ЦП, то я бы сохранял каждое хеш-значение объекта в памяти, вместо этого вычисляя его на лету. Тогда реализация набора в стиле хэш-таблицы действительно быстра для перечисления возможностей. Добавление / удаление объектов из набора происходит довольно медленно.
Если добавление / удаление более необходимо, чем перечисление, подойдет любой связанный список.
Оба способа могут использовать значение предиката для каждого объекта. Это зависит от ваших требований; Например, вы разрешаете два объекта одновременно в двух наборах? (Обычно это «да»), тогда вам потребуется хранилище массивов / связанных списков для каждого объекта в наборе, чтобы хранить информацию о его членстве.
Хотя не существует "одного правильного" решения. Просто мои две копейки.