2012-02-15 2 views
0

다른 문자열 내에서 문자열의 발생을 찾는 데 도움이되는 효율적인 PHP 알고리즘을 작성하는 데 도움을 찾고 있습니다. 여기에 현재 상황이 있습니다.PHP 문자열을 검색하기 위해 배열을 반복하는 좋은 알고리즘입니까?

두 개의 어레이가 있습니다. 첫 번째 배열은 검색이 필요한 텍스트가있는 배열입니다 (haystack). 두 번째 배열은 find (needle)이라는 용어의 배열입니다.

첫 번째 배열에는 적어도 바늘에서 내 조건이 하나 있다는 것을 알고 있습니다. 따라서 알고리즘은 'array2 [0]이 array1 [0] 안에 있다고 말합니까? 그렇지 않다면, loop, array2 [1]이 array1 [0], inside '안에 있습니다. 발견되면, array1 [1] 포인터를 끝내고 과정을 반복하십시오.

저는이 값이 1000s 인 항목을 10 가지 값으로 계산할 수 있으며, 바늘 배열에는 1100 개의 개별 바늘이 있습니다.

+1

[Boyer-Moore 알고리즘] (http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm) 또는 그 변형 중 하나를 찾고 있습니다. - 그들은 대략 ** O (N) ** 복잡성을 가지고 있습니다. 원본을 사용하면 동일한 바늘을 많이 재사용하면 시간을 절약 할 수있는 사전 처리 단계를 캐시 할 수 있습니다. – millimoose

+1

(http://johannburkard.de/software/stringsearch/)에는 PHP 알고리즘을 구현하거나 기존의 알고리즘을 검색 할 수있는 적절한 알고리즘이 많이 있습니다. – millimoose

답변

0

이 알고리즘부터 시작해 보겠습니다. 가장 빠른 것은 아니지만 결과는 원하는 것입니다. ?

<?php 
for ($i = 0; $i < 1000; $i++) { 
    $haystack[] = "Lorem ipsum dolor"; 
    $needle[] = "no match"; 
} 
// $haystack = array("Lorem ipsum dolor", "Quisque placerat", "Cras quis porttitor orci"); 
//$needle = array("quis", "Lorem"); 
$timestamp1 = time() + microtime(); 
foreach ($haystack as $word){ 
    foreach ($needle as $pattern){ 
     if(strpos($word, $pattern) === false){ 
      //Keep looping 
     }else{ 
      //exit inner loop 
      print "'".$pattern."' is in '".$word."'<br />"; 
      break; 
     } 
    } 
} 

$timestamp2 = time() + microtime(); 
print "It took me ".($timestamp2 - $timestamp1)." seconds to realize there was no match"; 

>

// 편집을 (당신이 첫 경기를 찾아 낼 때까지 loping 유지) : 나는 하드 코딩 배열 댓글을 달았습니다, 지금 동적으로이 타이머를 추가 생성. 일치하는 항목이없는 경우 최대 약 1 초가 걸립니다.

+0

요하네스, 고마워요. 내 스크립트가 stristri를 사용하는 동안 스크립트에서 strpos를 사용합니다. 함수 전환 기능을 사용하면 스크립트를 더 잘 수행 할 수 있습니다. – user658182

1

단어 위치 (페이지, 줄 및 단어 번호)와 같은 다른 정보로 기록 된 건초 더미의 데이터 구조가 더 효율적입니다. 쓸데없는 조회를 피하기 위해 분할 및 정복 전략을 사용합니다. 루프 전략을 사용하면 건초 더미의 모든 항목을 검색 할 수 있습니다. 토이가 건초 더미를 분류하면 건초 더미를 건너 뛸 수 있습니다. 다음은 PHP의 예입니다. http://phpir.com/tries-and-wildcards

관련 문제