내가 이해한대로 작성하는 해시 개념
자료구조를 잘 선택하면 사용되는 메모리를 최소화 할수 있으며 공간적으로 효율성을 확보할 수 있다
해시 함수 또는 해시 알고리즘은 임의의 데이터(key)를 고정된 길이의 데이터(hash value)로 매핑하는 함수이다
(입력된 자료의 길이에 관계없이 해시값의 길이는 일정한걸 볼수있다)
해시 테이블의 장점은 O(1)의 시간 복잡도를 가지는 것이다
하지만 단점은 O(n)의 시간 복잡도를 가지는 것이다
이 말이 이상해 보인다
O(1)의 시간복잡도는 이상적인 해시테이블의 경우이다
이상적인 해시테이블은 충돌이 일어나지 않는 경우이다
해시테이블은 해시 충돌이 일어나는 단점이 있다
충돌에 대한 알고리즘 처리가 부족하다면 시간복잡도가 O(n) 으로 늘어나는것이다
키A와B를 해시함수로 해시값을 얻었는데 해시값이 같다면 서로 다른 키가 같은 공간에 저장이 되므로 1:1 대응이 되지않는다 해시 충돌은 필연적이다
해시 충돌이 일어나면 인덱스로 한번더 탐색을 진행하기 때문에 성능이 하락한다
체이닝은 저장소(bucket)에서 충돌이 일어나면 기존값과 새로운 값을 연결 리스트로 만드는 방법이다
체이닝은 충돌이 일어나면 그때 공간을 만들어서 연결을 해주기에 충돌을 대비해서 미리 공간을 많이 만들어 놓을 필요가 없다
같은 해시에 자료들이 많이 연결되면 검색시 효율이 떨어진다
(위의 그림에서 John과 Sandra의 해시가 동일해서 충돌이 일어난다 Sandra는 바로 다음 비어있는 153번에 저장이되고 Ted는 153번이 채워져 있기에 154번에 저장된다)
해시값에서 고정폭으로 건너 뛰면서 탐색하다 비어있는 해시를 발견하면 저장하는 방식이다
해시 충돌이 일어나면 다른 해시 함수를 적용한 결과를 해싱 하는방법
선형탐색의 단점을 보완한 검색법
다음 해시를 검색해 봤을때 채워져 있다면 고정값만큼 내려가면서 탐색
체이닝 : 복잡한 계산식을 개방주소법에 비해 적게 사용
해시테이블이 채워질수록 성능 저하가 선형적으로 발생
개방주소법 : 포인터가 필요 없고 지정한 메모리 외 추가적인 저장공간도 필요 없다 삽입, 삭제시 오버헤드가 적고, 저장할 데이터가 적을 때 유리
새로운 배열에 기존의 배열의 키를 새롭게 재해싱 하는 방법
개방주소법에선 사용되는 고정크기의 배열이 가득차거나 체이닝의 연결 리스트가 길어지면 검색효율이 떨어지기 때문에 버킷의 갯수를 늘려주는 방법
해시에 대해 정리하고 공부 하다 보니 시간복잡도와 공간 복잡도 개념이 있어서 다음은 이에 대해 정리함
자세하게 적느라 고생했어
열심히 하는 모습이 보기 좋아