Аннотация Описание:
У меня есть набор строк, назовите его «активный набор», а набор наборов строк - назовите его «возможный набор».Когда новая строка добавляется в активный набор, наборы из возможного набора могут внезапно стать подмножествами активного набора, поскольку активному набору не хватало только этой строки, чтобы быть надмножеством одного из возможных.Мне нужен алгоритм, чтобы эффективно найти их, когда я добавляю новую строку в активный набор.Бонусные баллы, если та же самая структура данных позволяет мне эффективно находить, какой из этих возможных наборов признан недействительным (больше не является подмножеством), когда строка удалена из активного набора.
(Причина, по которой я сформулировал описанную ниже проблему в терминах наборов и подмножеств строк в приведенном выше резюме, заключается в том, что язык, на котором я пишу это (Io), динамически типизирован. У объектов действительно есть поле типа, ноэто строка с названием типа объекта.)
Фон:
В моем игровом движке у меня есть GameObjects , который может иметь несколько типов Представление объектов, добавленных к ним.Например, если GameObject имеет физическое присутствие, к нему может быть добавлен PhysicsRepresentation (или нет, если это не твердый объект).К нему могут быть добавлены различные виды GraphicsRepresentations, такие как эффект сетки или частицы (и у вас может быть более одного, если у вас есть несколько визуальных эффектов, прикрепленных к одному и тому же игровому объекту).
Суть этогосостоит в том, чтобы разделить подсистемы, но вы не можете полностью отделить все: например, когда GameObject имеет и PhysicsRepresentation, и GraphicsRepresentation, что-то должно создать 3-й объект, который соединяет положение GraphicsRepresentation с местоположением PhysicsRepresentation.Для этой цели, сохраняя при этом все компоненты отдельно, у меня есть Interaction объектов.Объект Interaction включает в себя сквозные знания о том, как должны взаимодействовать два системных компонента.
Но для того, чтобы защитить GameObject от необходимости слишком много знать о представлениях и взаимодействиях, GameObject просто предоставляет общий реестр, в котором прототип Interactionобъекты могут регистрироваться для вызова, когда в GameObject присутствует определенная комбинация представлений.Когда новое Представление добавляется в GameObject, GameObject должен заглянуть в его реестр и активировать только те объекты Interaction, которые вновь активируются при наличии нового Представления, плюс существующие Представления.
Я просто застряло том, какую структуру данных следует использовать для этого реестра и как ее искать.
Ошибки:
Наборы строк не обязательно отсортированы, но я могу сохранить их отсортированными.
Хотя Взаимодействие чаще всего происходит между двумя Представлениями, я не хочу ограничивать его этим;Я должен иметь возможность взаимодействий, которые инициируют с 3 или более различными представлениями, или даже взаимодействий, которые инициируют, основываясь только на одном представлении.
Я хочу оптимизировать это для случая как можно более быстрого добавления/ удалить представления.
У меня будет много активных наборов (у каждого игрового объекта есть активный набор), но у меня есть только один возможный набор (набор всех зарегистрированных типов взаимодействия).Поэтому мне все равно, сколько времени потребуется для построения структуры данных, которая представляет возможный набор, потому что это нужно сделать только один раз, при условии, что алгоритм сравнения различных активных наборов не разрушителен для структуры данных возможного набора.