搜索树顺序无关紧要[食谱]

时间:2012-03-10 03:01:24

标签: algorithm

我想知道是否有任何已知的算法允许我过滤k项目列表,其中项目的顺序无关紧要。

例如,让我们说有几十个接收来制作鸡肉沙拉

x1 + x2 + x3 + ... + xk = y

chicken+onions+mushroom+lettuce = chicken salad
onions+mushrooms+lettuce+chicken = chicken salad
mushrooms+lettuce+chicken+onions = chicken salad 
lettuce+mushrooms+onions+chicken = chicken salad
chicken+mushrooms+onions+lettuce = chicken salad

所以基本上鸡肉沙拉可以用上面提到的成分烹饪,但顺序无关紧要。因此,假设那些组件(成分)使Set1(鸡肉沙拉)有任何算法,允许我将组件匹配到集合?这些成分可能是不同组合的一部分(即洋葱+蘑菇+生菜+金枪鱼=金枪鱼沙拉)。另外,我应该加你也可以有不同量的每种成分所以鸡+鸡+蘑菇+洋葱+生菜=豪华鸡肉沙拉

我可以使用if语句加载进行O(n)搜索,其中n是集合的数量,但我想知道是否有高效(或更结构化的)算法可以帮助解决这个问题。

由于

3 个答案:

答案 0 :(得分:0)

  1. 在集合中定义一些顺序,例如按字母顺序排序成分。
  2. 将此有序集用作数据库表或哈希表中的键。
  3. 完成。

答案 1 :(得分:0)

简答:使用 BitSet 哈希

答案很长:你有一定数量的成分,比方说64.将每个字符串映射到0..63之间的整数索引,即洋葱 - > 0,奶酪 - > 1,蘑菇 - >给定一个成分列表,将每个索引映射到无符号64位整数,即洋葱是64位数字仅第0位设置,奶酪是64位数字仅第1位设置,蘑菇第2位设置。给定一组成分,将相应的UInt64相加以具有单个UInt64。例如,集合洋葱+蘑菇对应于1 + 4 = 5.构建从UInt64到List< Dish>的散列(字典)。即5 - > “GrilledMushroomsWithOnion”

答案 2 :(得分:0)

最佳策略取决于搜索中成分数量的相对大小(称之为k)与食谱数量(n)与不同可能成分的数量之比。

最简单的策略是在集合上定义散列函数。也就是说,一个不关心顺序的哈希函数。应用于元素的任何可交换操作都适用于此。此外,排序比散列列表有效。一旦你有了这个,那么你只需将所有食谱存储在一个关联容器中,并搜索你的特定成分。使用快速哈希函数,您可以获得O(k)搜索+一些初始设置成本,如果您进行足够的搜索,将会摊销。

这种方法存在的问题是,它找不到只有您要搜索的成分子集的食谱。一种选择是为您的成分的每个子集单独运行此算法,但这会带您到O(2 ^ k)。

这还取决于您的成本模型。如果您在山景中像某个公司一样操作并且保持有效的无限数量的处理器,但想要接近实时地生成答案,那么简单地检查每个配方是否可以并行是可能的。这可以非常快速地完成(对于每个配方),并且实际上可以容易地扩展以返回配方中使用的配料的数量,允许您提供订购。