Как быстро сравнить один набор логических значений со многими другими наборами логических значений (порядок имеет значение)? - PullRequest
0 голосов
/ 28 октября 2011

У меня проблема с проектом, над которым я работаю в свободное время.Я использую Google App Engine (версия Java), но этот вопрос не относится к конкретной платформе, и я хотел бы рассмотреть другие языки / платформы, если они могут решить эту проблему.

Следующее иллюстрирует проблему:

Предположим, у меня есть хранилище данных с тысячами рецептов и ингредиентами для каждого рецепта.(Ради этой иллюстрации забудьте об измерениях.) Я хочу иметь возможность ввести список ингредиентов, которые у меня есть, а затем быстро получить все рецепты, для которых у меня есть как минимум XX% ингредиентов (скажем,75%).Я готов пожертвовать некоторой точностью и некоторыми результатами ради скорости, но хочу определенную степень точности.Я могу провести более тщательное сравнение после того, как получу «быстрые результаты».

Моя попытка решения: анализируя базу данных рецептов, я составляю список, скажем, 200 общих пищевых ингредиентов (яйца, мука, соль, сахар, розмарин и т. д.).Почти все ингредиенты для рецептов содержатся в этом основном списке:

Common Food Ingredients: [ eggs , flour , salt , sugar , cinnamon ... ]

Затем я просматриваю каждый отдельный рецепт и сравниваю ингредиенты с этим основным списком, и в итоге получаю набор из 200 логических значений длякаждый рецепт:

Recipe #106: [ T , T , F , T , F ... ]
Recipe #107: [ F , T , T , T , F ... ]

Я бы сохранил эту информацию вместе с рецептами.(До этого момента это вся работа по подготовке данных, которую у меня есть все время в мире.)

Теперь я вхожу в список своих ингредиентов под рукой.Я бы сделал то же самое сравнение с основным списком:

My ingredients on hand: [ F , F , T , T , F ... ]

И вот где я застрял.Как я могу быстро сравнить этот набор логических значений с наборами для рецептов, чтобы я мог определить рецепты, для которых у меня есть не менее 75% ингредиентов?

Или (и это будет Святой Грааль) во времяПри подготовке данных вместо сохранения набора логических значений для каждого рецепта можно ли выполнить вычисление, которое даст мне одно значение, из которого я смогу впоследствии отфильтровать?(Например, "ВЫБРАТЬ * ИЗ РЕЦЕПТОВ, ГДЕ master_list_boolean_metric <= 29") </p>

Или я поступаю неправильно?(Любое руководство, общее или конкретное, будет приветствоваться.) Чего я хочу избежать, так это медленного сравнения, ингредиент за ингредиентом, между каждым рецептом и моим списком «под рукой» ингредиентов.

Или... возможно, это невозможно сделать быстро?

1 Ответ

1 голос
/ 28 октября 2011

use BitSet .

. Храните каждый ингредиент как один бит, делайте И с ингредиентами, которые у вас есть, а затем фильтруйте по количеству элементов ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...