2014-07-10 1 views
-1

질문 : 하위 선형 성능을 가진 문서에서 내용 본문 내에 문자열의 존재를 찾는 방법과 발견 할 문자열을 순서대로 또는 관련 ID에서 수행해야하는 방법 알파벳 순서가 아닙니다. haystack에서 다중 바늘 찾기 - 문자열 검색

는 트라이 또는 누스 - 프랫 - 모리스 또는 보이어 - 무어 구현 또는 기타 유사한 너 한테 도움이 하위 선형 시간이 일치하는 항목을 찾을 수

바람직 우리는 PHP 및 또는 JAVA에서이 문제를 해결 것입니다 그리고 만약 그렇게 할 수 있습니다 어떻게하는지 보여줘.

일부 자세한 내용

목록 길이는 수백만 행일 수 있습니다. 각 문자열에는 문자 (a-z0-9)와 공백 (예 : "stack overflow", "stackoverflow")이 포함될 수 있습니다. 각 문자열은 고유 한 식별자 (ID)를 정수로 사용합니다. { "s": "stackoverflow", "#": "920001"} 일치하거나 찾은 문자열은 고유 식별자의 순서로 찾아야합니다. 주목할 가치가 있습니다. 문자열 목록은 자주 변경되지 않습니다. 콘텐츠가 않습니다.

문자열 배열 (920,001 고유 문자열) 및 2- 문서 예 *. 목록에있는 콘텐츠의 존재 문자열을 확인하십시오. 3 개의 문자열이 발견 될 때까지 또는 목록이 다 소모 될 때까지 일치하는 것을 계속 찾으십시오. 문자열이 내용물에서 발견되면 새로운 배열의 문자열은 []

과 일치합니다. "stackoverflow"문자열은 마지막에 목록의 맨 아래쪽에 있지만 예제 2에서는 일치 할 것입니다. 문자열과 그들 중 하나는 간단한 루프와 문자열 배열의 일치를 사용하여 일치하는 데 꽤 많은 시간이 걸리는 stackoverflow입니다.

여기에는 920001 개의 행이 있고 12와 920000 사이의 행에있는 문자열에 일치하는 항목이없는 것으로 간주하여 아래 목록을 처리하십시오. 그것을 보는 바와 같이 문제 콘텐츠

content = "Bordered on the west by the Gulf of Mexico and on the east by the Atlantic Ocean, Florida has the longest coastline in the contiguous United States and its geography is dominated by water and the threat of frequent hurricanes. Whether you’re a native or just visiting stackoverflow" 

content ="tourist attractions and amusement parks. Slide to the seaside hot spots and abundant nightlife, what you need to stay on top of all of the new developments in the Panhandle State today stackoverflow" 

** 예리스트

"strings":[ 
    {"s":"Disney World", "#":"1"}, 
    {"s":"Universal Studios", "#":"2"}, 
    {"s":"Disneyland", "id":"3"}, 
    {"s":"Slide", "id":"4"}, 
    {"s":"Disneyland", "id":"5"}, 
    {"s":"Plane", "id":"6"}, 
    {"s":"Walt Disney World", "#":"7"}, 
    {"s":"Florida", "#":"8"}, 
    {"s":"Puerto Rico", "#":"9"}, 
    {"s":"Dominican Republic", "id":"10"}, 
    {"s":"Las Vegas", "#":"11"}, 
    {"s":"Mexico", "#":"12"} 
    .... 
    .... 
    {"s":"United States", "#":"920000"} 
    {"s":"stackoverflow", "#":"920001"} 
] 

** 예. 이게 당신이 나를 도울 수 있기를 바랍니다. 자세한 내용이 필요한 경우 알려 주시기 바랍니다.

미리 감사드립니다.

+0

업데이트 후 목록을 사전 순으로 정렬 할 수없는 이유가 무엇이든간에 쿼리를 실행할 때 결과를 식별자 순서로 정렬해야합니까?내가 경기를 찾고 배열을 루핑 시도 – Jaydee

+0

는 함수의 라인을 따라 뭔가가 ($ 입력, 배열 $ 리퍼러) { 의 foreach ($ $의 리퍼러로 리퍼러) { 경우 (stripos ($ 입력, $의 리퍼러를 포함, 즉)! == false) { return true; } } false를 반환합니다. 쿼리 정렬을 실행할 때 } 경우 (포함 ($의 리퍼러, $ valid_referers)) { 는 // 정렬되지 뒤에 내 생각은 알파벳 순으로 업데이트하고 후 다음 식별자 순서로 결과는 사용하는 것을 } – Orcra

+0

이었다 포함 @Jaydee 방법을 사용하면 매번 전체 목록을 실행해야합니다. ID 순서로 traveresed 경우처럼 당신은 당신이 필요한 일치 항목의 번호를 찾을 때까지만 검색하므로 시간을 절약 할 수 있습니다. 어쨌든 내 이론 이었어. 바보가 된 것을 기뻐하십시오 – Orcra

답변

1

콘텐츠 (콘텐츠마다 접미어 트리를 모두 병합)를 suffix tree 빌드하고이 접미사 트리에서 문자열을 검색하십시오.

Ukkonen's algorithm을 사용하는 경우 선형 (= O (n + m), 여기서 n은 내용의 크기, m은 문자열의 크기 임)입니다.

일치하는 경우 모든 것을 한 번 이상 읽어야하므로 하위 선형 성능을 얻을 수 없습니다.

+0

수십억 개의 고유 한 문서가있을 때 접미어 트리를 효율적으로 신속하게 구축 할 수 있습니까? – Orcra

관련 문제