2013-11-26 3 views
2

A, B + C, D + E, B + F, E + G + H와 같은 형식으로 검색 할 키워드 문자열이 있습니다. ..
각 문자는 키워드를 나타내며 +는 모든 키워드를 표시하려는 경우를 나타냅니다.
키워드에 대한 보장 된 순서는 없습니다.
나중에 이러한 키워드가 포함 된 이름을 DB로 검색합니다. 등키워드 문자열에서 키워드 목록을 만들기위한 PHP 알고리즘


A 또는 (B 및 C) 또는 (D 및 E) 또는 (B 및 F) 또는 (E 및 G 및 H)
그래서 내 예컨대 다음 I가 포함 이름에 흥미로운 것이다

문제는 하나의 키워드 (내 DB가 아닌 API)를 포함하는 이름에 대해서만 DB를 쿼리 할 수 ​​있기 때문에 이름을 검색하기 위해 키워드 목록을 만들어 각 이름을 확인해야합니다. 모든 관련 키워드가 포함되어 있습니다.

문자열을 구문 분석하고 DB에 대한 쿼리를 최소화하는 키워드 목록을 만드는 알고리즘이 필요합니다.

예를 들어, 내 예제에서, 나는의 이름 얻을 것이다 :

B를 체크 그들은 또한 E C 또는 F
를 포함 할 경우 그들은 또한 D 또는 (G와 H)이 포함되어 있는지 확인

그래서 알고리즘은 쿼리 할 A, B, E의 키워드 목록을 만들고 각 키워드에 표시 할 키워드를 추가해야합니다.

나는 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. 

... 분명히 희망 논리는 모든 관련 단어의 중요성에 의해 속도입니다.

혼자있는 단어는 매우 중요하지만 다른 단어로 4 번 나타나는 단어가 더 중요합니다.

+0

입력이 문자열이므로 먼저 배열 A를 작성해야합니다. 또한 쿼리 할 키워드 목록뿐만 아니라 함께 표시해야하는 키워드도 가져와야합니다. –

+0

입력은 "A, B + C, D + E, B + F, E + G + H"입니다. 그것을 배열로 폭발시키는 것은 불가능하다? 이 알고리즘은 ** 쿼리 우선 순위 **만을 제공합니다. 물론, 각 질의가 끝나면 배열을 넘겨주고 TRUE를 얻었는지 확인해야합니다. FALSE를 찾아 내면됩니다. – MeNa

+0

귀하의 알고리즘은 모든 단어에 우선 순위를 부여하지만, 결국에는 그 중 일부를 쿼리해야합니다. 예를 들어 E만으로 검사되기 때문에 D 또는 G를 쿼리 할 필요가 없습니다. 어쨌든 저는 당신이 제안한 것처럼 우선 순위 배열을 만들었지 만 키워드를 다시 반복하고 쿼리 배열을 작성하여 키워드를 우선 순위가 가장 높은 키워드를 쿼리 키워드로 유지하고 다른 모든 관련 키워드를 할당합니다. 어쨌든 고마워. –