>  기사  >  백엔드 개발  >  PHP에서의 고속 검색 알고리즘 및 응용

PHP에서의 고속 검색 알고리즘 및 응용

WBOY
WBOY원래의
2023-06-22 17:31:411589검색

PHP는 널리 사용되는 서버 측 프로그래밍 언어로서 웹 애플리케이션 개발에 없어서는 안 될 역할을 합니다. 실제 개발에서는 대용량 데이터에 대한 조회, 검색 등의 작업을 수행해야 하는 경우가 많습니다. 이때 고속 검색 알고리즘은 매우 중요한 방향이 되었습니다.

이 기사에서는 PHP와 해당 응용 프로그램에서 일반적으로 사용되는 고속 검색 알고리즘을 소개합니다.

1. 개요

데이터 구조에서 검색이란 데이터 수집에서 지정된 조건으로 데이터 레코드를 찾는 것을 의미합니다. 일반적인 검색 방법에는 선형 검색, 이진 검색, 해시 검색 등이 있습니다.

선형 검색은 가장 기본적인 검색 알고리즘으로, 데이터 컬렉션의 모든 요소를 ​​차례로 순회하며 대상 데이터를 찾을 때까지 대상 데이터를 하나씩 일치시킵니다. 시간 복잡도는 O(n)입니다.

이진 검색은 순서화된 시퀀스의 특성을 이용하여 매번 검색 범위를 절반으로 줄이고 대상 데이터의 위치를 ​​빠르게 잠그는 보다 효율적인 검색 알고리즘입니다. 시간복잡도는 O(log2n)로 효율성이 매우 높다.

해시 검색은 해시 테이블을 기반으로 하는 고속 검색 알고리즘으로, 해시 테이블에서 대상 데이터의 위치를 ​​빠르게 찾을 수 있는 매우 효율적인 알고리즘입니다.

PHP에서 일반적으로 사용되는 고속 검색 알고리즘에는 순서 배열 검색, 이진 검색, 해시 검색, 트리 트리 검색 등이 포함됩니다.

2. 정렬된 배열 검색

정렬된 배열 검색은 정렬된 배열을 기반으로 하는 검색 알고리즘으로, 검색할 때마다 검색 범위를 빠르게 좁힐 수 있습니다.

PHP에서는 PHP에 내장된 array_search() 함수를 통해 순서 배열 검색을 구현할 수 있습니다. 이 함수는 이진 검색 알고리즘을 사용하여 구현되며 배열에서 대상 데이터의 위치를 ​​빠르게 찾을 수 있습니다. 예를 들어, 100000개의 정렬된 요소가 포함된 배열에서 요소 10을 찾으려면 코드는 다음과 같습니다.

$arr = range(1, 100000); // 100000개의 요소로 구성된 정렬된 배열 생성
$index = array_search( 10, $arr); // 배열에서 대상 요소 10의 위치를 ​​찾습니다

array_search() 함수는 PHP에 포함된 표준 라이브러리 함수이므로 성능이 매우 효율적이고 시간 복잡도는 O(log2n)입니다.

3. 이진 검색

이진 검색은 정렬된 배열을 기반으로 하는 분할 정복 알고리즘입니다. 배열을 두 개의 동일한 부분으로 나누고 대상 데이터가 왼쪽 절반에 있는지 오른쪽 절반에 있는지 확인하고 계속합니다. 재귀 검색을 통해 데이터를 신속하게 검색할 수 있습니다.

PHP에서는 사용자 정의 함수를 통해 이진 검색을 구현할 수 있습니다. 예를 들어, 100,000개의 정렬된 요소가 포함된 배열에서 요소 20을 찾으려면 코드는 다음과 같습니다.

function bin_search($arr, $low, $high, $target) {

while ($low <= $high) {
    $mid = ($low + $high) >> 1;
    if ($arr[$mid] === $target) {
        return $mid;
    } elseif ($arr[$mid] > $target) {
        $high = $mid - 1;
    } else {
        $low = $mid + 1;
    }
}

return -1;

}

$arr = range ( 1, 100000); // 100000개 요소의 정렬된 배열을 생성합니다
$index = binary_search($arr, 0, 99999, 20) // 이진 검색으로 인해 배열에서 대상 요소 20의 위치를 ​​찾습니다. 알고리즘 시간복잡도는 O(log2n)이므로 매우 효율적이며 대용량 데이터 검색에 적합합니다.

4. 해시 검색

해시 검색은 해시 테이블 기반의 고속 검색 알고리즘으로, PHP에 내장된 hash() 함수를 통해 구현될 수 있습니다.

먼저 해시 테이블에 데이터를 삽입해야 합니다. foreach 루프를 통해 배열을 탐색하고, 각 요소의 값을 키로 사용하고, 요소의 인덱스를 값으로 해시 테이블에 삽입할 수 있습니다. 예:

$arr = range(1, 100000); // 100000개 요소의 배열 생성

$hash = array();


foreach ($arr as $k => $v) {

$hash[$v] = $k; // 插入元素到哈希表中

}

그런 다음 hash() 함수를 통해 대상 요소를 검색할 수 있습니다. 예를 들어 위의 예에서 요소 20을 검색하는 코드는 다음과 같습니다.

$index = isset($hash[20]) ? $hash[20] : -1; the array

해시 조회 알고리즘의 시간 복잡도는 O(1)이므로 매우 효율적이며 대규모 데이터 검색에 적합합니다.

5. 트리 트리 검색

트리 트리는 트리 구조를 기반으로 하는 효율적인 문자열 검색 알고리즘으로 빠른 문자열 일치 및 접두어 검색이 가능합니다. PHP에서는 Trie 트리 클래스를 사용자 정의하여 이를 달성할 수 있습니다.

먼저 Trie 트리를 만들고 Trie 트리에 문자열을 삽입해야 합니다. 예를 들어, 다음 코드에서는 세 개의 문자열 "hello", "world" 및 "php"가 Trie 트리에 삽입됩니다.

class Trie {

private $root;

public function __construct() {
    $this->root = new TrieNode();
}

public function insert($word) {
    $node = $this->root;

    for ($i = 0; $i < strlen($word); $i++) {
        $char = $word{$i};

        if (!isset($node->children[$char])) {
            $node->children[$char] = new TrieNode();
        }

        $node = $node->children[$char];
    }

    $node->is_end = true;
}

}

class TrieNode {

public $children = array();
public $is_end = false;

}

$ trie = new Trie();

$trie->insert("hello");

$trie->insert("world");
$trie->insert("php");

then , Trie 트리를 통해 대상 문자열을 찾을 수 있습니다. 예를 들어 위의 예에서 문자열 "php"를 찾는 코드는 다음과 같습니다.

function search($trie, $word) {

$node = $trie->root;

for ($i = 0; $i < strlen($word); $i++) {
    $char = $word{$i};

    if (!isset($node->children[$char])) {
        return false;
    }

    $node = $node->children[$char];
}

return $node->is_end;

}

$found = search($trie, "php "); // 문자열 "php"를 검색합니다

Trie 트리의 시간 복잡도는 문자열 길이와 관련이 있으므로 Trie 트리는 키워드 필터링, 문자열 일치 등 문자열 길이가 고정된 시나리오에 적합합니다. 시나리오.

6. 요약

이 기사에서는 순서 배열 검색, 이진 검색, 해시 검색, 트리 트리 검색 등 PHP 및 해당 응용 프로그램에서 일반적으로 사용되는 고속 검색 알고리즘을 소개합니다.

이러한 알고리즘은 각각 고유한 장점과 단점이 있으며 효율적인 데이터 검색 및 문자열 일치를 달성하기 위해 다양한 시나리오에서 사용할 수 있습니다. 실제 개발에서는 특정 상황에 따라 적절한 알고리즘을 선택해야 합니다.

위 내용은 PHP에서의 고속 검색 알고리즘 및 응용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.