해시 테이블 VS 연관 배열


84

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




답변:


123

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 연관 배열도 정렬 할 수 있음).


3
흠, 짧은 설명입니다. 그래서 그들은는 절대적으로 같은 일?
Bakhtiyor 2010-06-28

2
그들은 일반적으로하지 @Bak, 그러나 빠른 비트를 재생 PHP,에 덜 성능을 통해 우려가 이후 데이터 구조와 느슨한
마이클 Mrozek

알겠습니다.하지만이 경우 해시 함수에 대한 알고리즘이 그렇게 많은 이유는 무엇입니까?
Bakhtiyor 2010-06-28

4
@Michael 당신은 그것을 단점처럼 들리게 만들었습니까? PHP는 다르지만 좋은 차이라고 생각합니다.

1
@Bakhityor : 마지막 문장은 완벽합니다. 하지만 해시 테이블에 대해 '잊을'필요는 없습니다. 사실 해시 테이블을 이미 이해하고 있다는 사실이 좋습니다. 이제 그 지식을 연관 배열에 적용 할 수 있기 때문입니다. 나는 당신을 위해 일을 더 명확히하기 위해 내 대답에 몇 가지 예를 추가하고 있습니다.
Cam

21

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


편집 : 아-이길 :) +1.

그게 내가 :) 찾던
Faizan

10
절대 안돼. 해시 테이블에는 PHP 배열에없는 일종의 충돌 해결이 필요합니다. 그들의 충돌 해결 전략은 단지 이전 값을 대체하는 것이며 정의에 따라 해시 테이블이 아닙니다.
Juan

4
지금까지 내가 기억으로는, 해시 테이블에서 충돌 해결은위한 해시 키가 아닌 원래의 키 (어떻게해야 심지어 사용할 수 있습니까?)
엠마누엘 오스터

18

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

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

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


7

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


4
"맵에서 요소를 가져 오는 복잡성은 O (nlogn)입니다."-이것은 사실이 아닙니다. LinkedList의 경우에도 주어진 요소를 가져 오는 것은 O (n)뿐입니다. 또한 en.wikipedia.org/wiki/Hash_table 에서 언급
했듯이

1
여기서 설명한 바와 같이 PHP의 연관 배열은 "해시에 저장된 각 값이 이전에 저장된 값과 이후에 저장된 값에 연결" 되는 해시 테이블로 구현되어 연결 목록입니다. 따라서 추가 메모리를 사용하지만 키를 사용하여 특정 요소에 액세스하는 것은 일반적인 해시 테이블 O (1)만큼 빠르며 느리지 않습니다.
Leopoldo Sanczyk

2

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.