해시 테이블이란?
해시 테이블은 보통 여러가지 이름으로 나오기도 합니다만, 예를 들면 python/swift의 dictionary, JSON, PHP의 배열, java/c++의 hashmap등
이것은 컴퓨터안에서 어떻게 실현했는지 설명하고자 합니다.
해시테이블의 특징
1개의 값에 대해서 유일한 키
응? 반대아니야? 라고 생각하는 사람 있을지 모르지만, 사실은 해시테이블을 만들었을때 다른 값을 같은 키로 나누어 버리는 경우도 있는데, 이것을 '충돌'이라고 부른다.
추가라고 부르는 것이 빠르다.
해시테이블도 배열계의 데이터구조의 한 종류로써, 다른 두가지는 배열과 링크리스트가 된다.
배열은 값을 부를때 주소가 있으면 한순간에 끝나지만, 1개의 값을 추가, 삭제하면, 다른 값도 채워지고, 이사하지 않으면 안된다.
링크 리스트는 추가가 빠르지만 (마지막에 들어가기 때문에), 호출 할 때 들어가있는 데이터를 하나씩 확인하지 않으면 안된다.
해시 테이블은 추가 할 때 해시 함수를 돌려 키에서 주소를 얻고 다른 값에 영향을주지 않는쪽으로 호출 할때 키 만 있으면 주소도 키에서 알게 즉시 값을 질문한다.
원리
key ====해시 함수를 건다.====> H(key) ====주소 GET====> (key|value)
이것으 흐름이다.
해시 함수
그러면 해시 함수는 어떤 것일까
간단하게 말하면 : 어떤 키가 와도 우선 고유 한 숫자로 변환하는 메서드
예 :
input = [23, 7, 11, 4, 10 (키)
이것은 분명히 5를 나누어 그 나머지를 가지고가는 경우에 중복이 없을 것
Hash 함수 h (key) = n mod 5
Hash 후 [3, 2, 1, 4, 0 (H (key))
해시 테이블에 사용하는 해시 함수는이 세 가지를 요구하고있다
알기 쉬울것
주소를 평균적으로 배부
키의 중복을 피할것
자주 사용되는 해시 함수
1.키가 숫자의 경우 일차 방정식을 취할 : H (key) = a · key + b
2.키가 숫자 인 경우 그 키는 징계 여부를 찾는 중복이 적은 일부를 가지고
3.키가 숫자의 경우, 그리고 징계도 없을 것 같고, 키를 제곱을 복용 제곱 한 결과 가운데 일부를 취한다. (제곱 한 결과 중간 부분은 숫자 전체와 관계 있기 때문에 중복을 피할 수)
4.키를 몇 등분하여 그것을 전부 더한다.
5.난수 함수를 사용
6.테이블의 길이를 나누어 나머지를 구한다.
다양한 소개했다고 생각하지만, 실제로 사용할 때 해시 함수는 중복없이 없으면 어느것이라도 좋다.
해시 테이블의 예
데이터:
이름 |
손오공 |
크리닝 |
피콜로 |
성적 |
76 |
78 |
66 |
이것을 이름 -> 성적의 형태로 해시테이블을 만들면
이름의 생략어의 알파벳순이라는 해시함수를 사용하자.
이름 |
손오공 |
크리닝 |
피콜로 |
이름의 약어 |
OK |
RN |
KR |
알파벳 순 |
15 11 |
18 14 |
11 18 |
H(key) |
15+11 |
18+14 |
11+18 |
주소 |
26 |
32 |
29 |
성적 |
76 |
78 |
66 |
이런 느낌