2013-11-26 28 views
2

我有一个搜索格式的关键字字符串:A,B + C,D + E,B + F,E + G + H。 ..
每个字母代表一个关键字,+表示我希望所有关键字出现。
关键字没有保证的顺序。
稍后我将搜索包含这些关键字的名称的数据库。
所以下面我的例子中,我将在包含名称有趣:
A或(B和C)或(d和E)或(B和F)或(E和G和H),等等从一串关键字创建关键字列表的PHP算法

问题是我只能查询包含单个关键字(它不是我的数据库的API)的名称的数据库,因此我需要创建一个关键字列表来检索名称,然后检查每个名称以查看它是否存在包含所有相关关键字。

我需要一个算法来解析字符串并创建关键字列表,以最小化对数据库的查询。

举例来说,在我的例子,我会得到名称:
一个
B和检查,如果它们也包含用C和F
E和检查,如果它们也包含d或(G和H)

所以算法应该创建A,B,E的关键字列表来查询,并且还要为每个关键字添加它应该出现在关键字中的名称。

我在PHP工作,所以我更喜欢在PHP中的答案,但伪代码也会很好。 我希望它是明确的......

回答

1
Make empty array B. 
Pass over the given array A, for each word X: 
    If not apperars in B, add X to B as index, and set him value to 1/(No. of parts in this conjunction). 
    Else, add 1/(No. of parts in this conjunction) to exist value. 
Sort B by values, biggest first. 
Make your queries from start to end. 

的逻辑是在所有共同字的重要性等级。

一个单独的单词非常重要,但用另一个单词出现四次的单词更重要。

+0

输入是一个字符串,所以我需要首先创建数组A,以什么方式?另外,我不仅需要获取要查询的关键字列表,还需要获取它们应该出现的关键字。 –

+0

输入是“A,B + C,D + E,B + F,E + G + H”,不是吗?爆炸它阵列是不可能的?该算法只给你查询优先级**。当然,在每次查询之后,您需要传递数组,并检查是否有TRUE连接。并找出FALSE连词。 – MeNa

+0

你的算法优先考虑每一个单词,但最后我只需要查询其中的一些,例如我不需要查询D或G,因为它们只用E来检查......无论如何,我认为我我已经算出了它,我按照你的建议设定了一个优先数组,然后我再次迭代关键字并构建一个查询数组,将具有最大优先级的关键字保留为查询关键字并将所有其他相关关键字分配给它们。不管怎么说,还是要谢谢你。 –