У меня проблема с проектом, над которым я работаю в свободное время.Я использую 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>
Или я поступаю неправильно?(Любое руководство, общее или конкретное, будет приветствоваться.) Чего я хочу избежать, так это медленного сравнения, ингредиент за ингредиентом, между каждым рецептом и моим списком «под рукой» ингредиентов.
Или... возможно, это невозможно сделать быстро?