Algorithm 找到可以从提供的食物中烹饪的食谱

Algorithm 找到可以从提供的食物中烹饪的食谱,algorithm,Algorithm,对不起,英语不好:( 假设我可以以任何方式初步组织食谱和配料数据。 我如何才能有效地按用户提供的配料搜索配方,最好按最大匹配排序-因此,使用最多提供配料且不包含任何其他配料的第一批配方,使用较少提供配料集且仍不包含任何其他配料的第二批配方,之后是具有最低附加要求的配方等等 我所能想到的就是像位掩码一样表示配方元素,并将所需的位掩码与所有配方进行比较,但这显然是一种不好的方法 还有一些相关的东西,比如Levenstein距离,我不知道如何在这里使用 我相信这应该是一项非常普通的任务…事实上,我会使

对不起,英语不好:(

假设我可以以任何方式初步组织食谱和配料数据。
我如何才能有效地按用户提供的配料搜索配方,最好按最大匹配排序-因此,使用最多提供配料且不包含任何其他配料的第一批配方,使用较少提供配料集且仍不包含任何其他配料的第二批配方,之后是具有最低附加要求的配方等等

我所能想到的就是像位掩码一样表示配方元素,并将所需的位掩码与所有配方进行比较,但这显然是一种不好的方法

还有一些相关的东西,比如Levenstein距离,我不知道如何在这里使用


我相信这应该是一项非常普通的任务…

事实上,我会使用Lucene这样的工具,因为它已经知道如何或多或少地满足您的需要。您的配料将是Lucene索引中的关键字,配方将是文档。然后您可以搜索Lucene索引,它将为您提供所有匹配的配方和ca甚至告诉你你的信心水平


Lucene是开放源代码的,提供了多种语言的实现,包括.NET、Java、PHP和许多其他语言。有关更多信息,请参阅此页。该页上有一个链接,介绍了所有相关项目。

听起来你在谈论集合-“可用成分”是一个集合,您希望找到其成分构成该集合子集的所有配方,按大小排序。集合有效地实现为平衡树或哈希表

当你想要处理不同数量的成分时,它变得有点复杂


编辑:如果您的配方数据存储在SQL数据库中,那么作为SQL查询(将在内部使用hastables和Tree),应该可以有效地完成整个过程。但是这将是一个非常复杂的查询;最好问问比我更擅长SQL的人(当然,实际的表结构是必要的)。

只是为了索引——我正在做一些基准测试,也是我测试的第一种方法——是PostgreSQL实现,使用子查询和intarray类型

因此,我使用了传统的规范化数据库和表
食谱(id、名称、描述)、主食(id)
InGridents(id、姓名、描述)、主键(id)
r2i(recipe\u id,ingridient\u id),unique(recipe\u id,ingridient\u id)(似乎我不需要那个索引,它等于整个表)

name和descr列中填充了一些垃圾,只是为了使表变大;-) 总的来说,我用200种配料、5000种配方填满了表格,每个配方有3到10种配料,r2i中总共约35k行

假设我想搜索我的配料集129,99,56180的配方
查询将如下所示:

SELECT recipe_id, recipe_ingrs, icount('{129,99,56,180}'::int[] - recipe_ingrs) as shortage, icount(recipe_ingrs - '{129,99,56,180}'::int[]) as excess
FROM (
  SELECT id as recipe_id, array(select ingridient_id from r2i where r2i.recipe_id = recipes.id)::int[] as recipe_ingrs
  FROM recipes WHERE recipes.id IN (select distinct recipe_id from r2i where ingridient_id IN (129,99,56,180))
) as t
ORDER BY excess ASC, shortage ASC;
查询成本约为7k(取决于您要查询的设置),但在我的windows测试笔记本电脑(c2duo,2gb内存)上,它运行速度非常快-对人眼来说是即时的:)

有大约一个阵列类型


测试尚未完成,我还有两个解决方案要测试,+获取一些关于速度的数字。

听起来像是数据结构或数据库管理类中的家庭作业问题。您是否在寻找通用算法的伪代码?您使用的是什么语言/技术?如果我正确理解了你的问题,你可能会想将你的问题改写为:“在给定成分列表的情况下,我可以实现什么算法来找到最匹配的配方”?Atomiton,是的,我可以这样改写问题)我使用的是perl、SQL、memcached、Redis key-value storage,以及该算法应该在网站上使用。John,这不是家庭作业的问题,我完全可以用蛮力解决它,但我想建立一个快速且可扩展的解决方案:-)这听起来有点像零件组装问题。哦。或者我可以使用Sphinx,MySQL搜索引擎。。。这肯定是一条路要走,但我相信,通过为这项任务实施更简单的解决方案,我可以做得更好。也许我可以在谷歌上搜索搜索引擎算法并采用一些?是的,通过集合描述的任务非常好。让我们检查一下我是否正确地理解了你——每个食谱都有一套说明。如何构建一棵树?例如,它的根、叶等是什么,我将如何执行查询?@skaurus:该树的存在只是为了提供日志(n)查找时间,所以任何平衡的搜索树都可以。您不应该自己实现它,所有公共语言都有数据结构库。如果你使用的是perl,哈希是内置在语言中的。我只是不明白,我要在树中存储什么。)@skaurus:树只是实现集合的一种方式。正如我所说,你不应该在那个抽象层次上工作。如果您已经在使用SQL,那么它也应该能够完成任务——可能是最好的解决方案。其中一个是Redis,试图使用SINTER、SDIFF来完成这项工作,但速度非常慢。另一个-具有非规范化表位配方(id int,配料int[])的Postgres-配料字段为intarray类型。和查询一样,SELECT id作为recipe_id,ingridients,icount({129,99,56180}):int[]-ingridients)作为短缺,icount(ingridients-{129,99,56180}::int[])作为bitrecipes的过剩,其中ingridients和&{129,99,56180}:int[]按过剩ASC排序,短缺ASC在表中的5k行仅花费了大约100。