Как изобразить дерево, где каждый ребенок может находиться под несколькими родителями - PullRequest
1 голос
/ 22 сентября 2011

Я ищу лучший способ представления набора структурных данных.

Я разрабатываю сборщик продуктов.Он задаст пользователю несколько вопросов, чтобы сузить набор продуктов.

т.е.

1-й вопрос: «Что такое группа продуктов?»

Ответ: Group1

В группе 1 доступны следующие категории продуктов (выберите одну):
Категория1
Категория2
Категория4

Ответ: Категория4

В категории 4 для группы1 доступны следующие типы::
Type3
Type5

Ответ: Type5

Для Type5, в Category4, в Group1 доступны характеристики продукта ... и т. Д.

Так что каждый новыйВопрос показывает список, основанный не только на предыдущем ответе, но и на всех предыдущих ответах.(то есть некоторые типы, доступные в категории 4, были бы другими, если бы эта категория 4 была в группе 2).Это как дерево, где у каждого ребенка может быть несколько родителей.

Таких уровней может быть до 10.

Какая структура наиболее эффективна для хранения этой иерархии?

1 Ответ

0 голосов
/ 23 сентября 2011

Без каких-либо дополнительных знаний о проблеме и различных распределениях, вот что вы должны сделать:

В каждом узле будет храниться n-мерный массив битов, где n - его уровень (Группыуровень 0).Затем, когда вы достигнете уровня i, вы просмотрите все узлы на этом уровне, и для каждого из них увидите, включен ли бит, который соответствует текущей истории.(Между узлами нет указателей или чего-то подобного, узлы - это просто удобное имя, которое я использую).

Размеры массивов на каждом уровне будут соответствовать общему размеру предыдущих уровней, например, в типах.уровень (уровень 2), у вас будут 2-мерные массивы с измерениями (# Groups) * (# Categories).

Пример:
Чтобы узнать, должен ли Type5 появляться в Category4, Group1вы бы пошли к его массиву в ячейке [1] [4], и если он включен (1), то он должен появиться, в противном случае (0) он не должен появиться.

Если вы используетеЯзык, который допускает арифметику указателей (например, c / c ++), вы можете немного оптимизировать доступ к матрице, поддерживая смещение, к которому нужно обращаться, поскольку оно всегда начинается одинаково: [1], [1] [4], [1][4] [5], ..., но это должно произойти гораздо позже, когда все уже работает должным образом.

Если позже вы узнаете больше деталей о вашей проблеме, например, о том, чтоиз этих связей существуют или не существуют, тогда вы могли бы думать о наснапример, разреженных матриц вместо обычных.

...