如何快速比较一组布尔值和许多其他布尔值(订单问题)?

时间:2011-10-27 20:06:53

标签: arrays math comparison set

我在业余时间正在处理的项目遇到问题。我正在使用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%成分的食谱?

或者(并且这将是圣杯),在数据准备期间,不是在每个食谱中存储一组布尔本身,是否有我可以执行的计算,这将给我一个值,我可以在以后过滤掉的? (例如,“SELECT * FROM recipes WHERE master_list_boolean_metric< = 29”)

或者我是以错误的方式来做这件事的? (任何指导,一般或具体,将不胜感激。)我想避免的是在每个食谱和我的“现有”成分列表之间进行缓慢的比较,逐个成分。

或者......也许不可能很快这么做?

1 个答案:

答案 0 :(得分:1)

使用BitSet

将每种成分存储为一位,用你所拥有的成分进行AND,然后过滤基数()