Без каких-либо дополнительных знаний о проблеме и различных распределениях, вот что вы должны сделать:
В каждом узле будет храниться n-мерный массив битов, где n - его уровень (Группыуровень 0).Затем, когда вы достигнете уровня i, вы просмотрите все узлы на этом уровне, и для каждого из них увидите, включен ли бит, который соответствует текущей истории.(Между узлами нет указателей или чего-то подобного, узлы - это просто удобное имя, которое я использую).
Размеры массивов на каждом уровне будут соответствовать общему размеру предыдущих уровней, например, в типах.уровень (уровень 2), у вас будут 2-мерные массивы с измерениями (# Groups) * (# Categories).
Пример:
Чтобы узнать, должен ли Type5 появляться в Category4, Group1вы бы пошли к его массиву в ячейке [1] [4], и если он включен (1), то он должен появиться, в противном случае (0) он не должен появиться.
Если вы используетеЯзык, который допускает арифметику указателей (например, c / c ++), вы можете немного оптимизировать доступ к матрице, поддерживая смещение, к которому нужно обращаться, поскольку оно всегда начинается одинаково: [1], [1] [4], [1][4] [5], ..., но это должно произойти гораздо позже, когда все уже работает должным образом.
Если позже вы узнаете больше деталей о вашей проблеме, например, о том, чтоиз этих связей существуют или не существуют, тогда вы могли бы думать о наснапример, разреженных матриц вместо обычных.