[php] 해시 테이블 VS 연관 배열

최근에 나는 아주 유명한 책 ” Introduction to Algorithms ” 에서 해시 테이블 에 대해 읽었습니다 . 아직 실제 응용 프로그램에서 사용하지는 않았지만 원합니다. 하지만 어떻게 시작해야할지 모르겠습니다.
예를 들어 해시 테이블을 사용하여 사전 응용 프로그램 (예 : ABBYY Lingvo)을 실현하는 방법과 같은 사용 샘플을 누구든지 나에게 줄 수 있습니까?
마지막으로 PHP에서 해시 테이블과 연관 배열의 차이점이 무엇인지 알고 싶습니다. 어떤 기술을 사용해야하며 어떤 상황에서 사용해야합니까?
제가 틀렸다면 (사서 해주십시오) 저를 바로 잡으십시오. 왜냐하면 실제로 저는 해시 테이블로 시작하고 있고 그들에 대한 기본적인 (이론적) 지식을 가지고 있기 때문입니다.
감사합니다.



답변

PHP에서 연관 배열은 약간의 추가 기능과 함께 해시 테이블로 구현됩니다.

그러나 기술적으로 말하면 연관 배열은 해시 테이블과 동일하지 않습니다 . 부분적으로 배후에서 해시 테이블을 사용하여 구현 됩니다. 대부분의 구현이 해시 테이블이기 때문에 해시 테이블이 할 수있는 모든 작업을 수행 할 수 있지만 더 많은 작업도 수행 할 수 있습니다.

예를 들어 for 루프를 사용하여 연관 배열을 반복 할 수 있지만 해시 테이블로는 수행 할 수 없습니다.

따라서 유사하지만 연관 배열은 실제로 해시 테이블이 할 수있는 작업의 상위 집합 을 수행 할 수 있습니다. 따라서 정확히 동일한 것은 아닙니다. 해시 테이블과 추가 기능으로 생각하십시오.

코드 예 :

연관 배열을 해시 테이블로 사용 :

$favoriteColor = array();
$favoriteColor['bob']='blue';
$favoriteColor['Peter']='red';
$favoriteColor['Sally']='pink';
echo 'bob likes: '.$favoriteColor['bob']."\n";
echo 'Sally likes: '.$favoriteColor['Sally']."\n";
//output: bob likes blue
//        Sally likes pink

연관 배열을 통해 반복 :

$idTable=array();
$idTable['Tyler']=1;
$idTable['Bill']=20;
$idTable['Marc']=4;
//up until here, we're using the array as a hashtable.

//now we loop through the array - you can't do this with a hashtable:
foreach($idTable as $person=>$id)
    echo 'id: '.$id.' | person: '.$person."\n";

//output: id: 1 | person: Tyler
//        id: 20 | person: Bill
//        id: 4 | person: Marc

특히 두 번째 예에서 각 요소의 순서가 배열에 입력 된 순서에 따라 유지되는 방식 (Tyler, Bill Marc)에 유의하십시오. 이것은 연관 배열과 해시 테이블의 주요 차이점입니다. 해시 테이블은 보유하고있는 항목 간의 연결을 유지하지 않는 반면, PHP 연관 배열은 수행합니다 (PHP 연관 배열도 정렬 할 수 있음).


답변

PHP 배열은 기본적으로 해시 테이블입니다.


답변

연관 배열과 해시 테이블의 차이점은 연관 배열은 데이터 유형이고 해시 테이블은 데이터 구현이라는 것입니다. 분명히 연관 배열 유형은 Perl, Python, PHP 등 많은 현재 프로그래밍 언어에서 매우 중요합니다. 해시 테이블은 연관 배열을 구현하는 주요 방법이지만, 유일한 방법은 아닙니다. 그리고 연관 배열은 해시 테이블의 주요 용도이지만 유일한 용도는 아닙니다. 따라서 그들이 동일하다는 것은 아니지만 이미 연관 배열이 있다면 일반적으로 차이점에 대해 걱정할 필요가 없습니다.

성능상의 이유로 선호하는 언어의 연관 배열이 해시로 구현된다는 것을 아는 것이 중요 할 수 있습니다. 그리고 해당 구현의 오버 헤드 비용에 대한 아이디어를 갖는 것이 중요 할 수 있습니다. 해시 테이블은 C에서 볼 수 있듯이 선형 배열보다 느리고 더 많은 메모리를 사용합니다.

Perl은 연관 배열을 “해시”라고 호출하여 두 개념을 하나로 묶습니다. Perl의 여러 기능과 마찬가지로, 그것은 틀린 것은 아니지만 엉성합니다.


답변

PHP의 배열은 실제로 해시 테이블이 아닌 정렬 된 맵입니다. 맵과 해시 테이블의 주요 차이점은 요소가 추가 된 순서를 기억할 수 없다는 점입니다. 반면에 해시 테이블은 맵보다 훨씬 빠릅니다. 맵에서 요소를 가져 오는 복잡성은 O (nlogn)이고 해시 테이블에서 O (1)입니다.


답변

연관 배열은 인덱스가 아니라 키로 요소에 액세스하는 배열입니다. 이것이 내부적으로 작동하는 방식은 구현에 따라 다릅니다 (작동 방식에 대한 규칙은 없습니다). 연관 배열은 해시 테이블에 의해 구현 될 수 있지만 (대부분의 구현은 그렇게 할 것입니다), 어떤 종류의 트리 구조 나 스킵리스트로 구현 될 수도 있고, 알고리즘은 배열의 모든 요소를 ​​반복하고 키를 찾습니다. 일치합니다 (이것은 매우 느리지 만 작동합니다).

해시 테이블은 값이 키에 연결되어 있고 일반적으로 거의 일정한 시간 내에 키 값을 찾으려는 위치에 데이터를 저장하는 방법입니다. 이것은 연관 배열에서 기대하는 것과 똑같이 들리므로 대부분의 시간 해시 테이블이 이러한 배열을 구현하는 데 사용되지만 필수는 아닙니다.


답변