I’m looking for a best way to represent a set of structural data.
I’m designing a product picker. It will ask user some questions to narrow down to the set of products.
i.e.
1st question: “What’s the product Group?”
Answer: Group1
In Group1, available Product Categories are (pick one):
Category1
Category2
Category4
Answer: Category4
In Category4 for Group1, available Types are:
Type3
Type5
Answer: Type5
For Type5, in Category4, in Group1 available Product Chacteristics are… etc.
So each new question shows list based not only on the previous answer, but on all the answers before. (i.e. some Types available in category4 would be different if that Category4 was in Group2). It’s like a tree, where each child could be under multiple parents.
There may be up to 10 such levels.
What’s the most efficient structure to store this hierarchy?
Without any extra knowledge of the problem and the different distributions, here is what you should do:
Each node will have an n-dimensional array of bits stored in it, where n is its level (Groups are level 0). Then, when you reach level i, you will look over all nodes in that level, and for each one see if the bit that fits the current history is on or off. (There are no pointers or such between the nodes, nodes are just a convenient name I’m using).
The dimensions of the arrays in each level would be the total size of the previous levels, e.g. in Types level (level 2), you would have 2-dimensional arrays, with the dimensions (# Groups)*(# Categories).
Example:
To know whether or not Type5 should appear in Category4, Group1, you would go to its array in the cell [1][4], and if it is on (1) then it should appear, otherwise (0) it shouldn’t.
If you are using a language that allows pointer arithmetics (like c/c++), you can slightly optimize the matrix access by maintaining the offset you need to go to, since it always starts the same: [1], [1][4], [1][4][5], …, but this should come at a much later time, when everything already works properly.
If later on you get to know more details about your problem, such as that most of these connections do or don’t exist, then you could think about using sparse matrices, for example, instead of regular ones.