У меня есть список рецептов, полученных из базы данных, которая выглядит следующим образом:
List<RecipeNode> _recipeList;
RecipeNode
, кроме всего прочего, имеет свойство, которое ссылается на один или несколько тегов (например, Ужин , Завтрак , Сиде , Вегетарианец , Праздник и около 60 других).
public sealed class RecipeNode
{
public Guid RecipeId;
public Byte[] Tags; //Tags such as 1, 5, 6, 8, 43
//... More stuff
}
Найти случайный рецепт из _recipeList
в O (1), конечно, было бы легко, однако мне нужно найти случайный рецепт, который имеет, скажем, 5 в Tags
в O (1).
Прямо сейчас, моя единственная идея - создать массив List<RecipeNodes>
с ключом по тегу. Например:
List<RecipeNode>[] _recipeListByTag;
Тогда _recipeListByTag[5]
будет содержать список всех рецептов, которые имеют 5 в массиве Tags
. Затем я могу выбрать случайный разрешенный тег и случайный рецепт внутри этого тега в O (1).
Недостатком этого подхода является то, что размер этого многомерного массива будет Recipes * Tags
(например, сумма Tags.length по всем рецептам), что начинает занимать много памяти, так как я храню потенциально Огромное количество рецептов в этом массиве. Конечно, поскольку RecipeNode
является ссылочным типом, я повторяю только 4-байтовые указатели на рецепты, так что это может быть лучшим способом.
Существует ли более эффективная структура данных или алгоритм, который я мог бы использовать, чтобы позволить мне найти случайный рецепт, который содержит определенный разрешенный тег? Спасибо!