Closed KimDahye closed 6 years ago
완성되면 post에 추가하기. 아래는 draft.
함께하고 있는 알고리즘 스터디 멤버들을 위해 Hash table 자료구조를 정리합니다.
If we have only linked list, binary search tree, and array, then...
linked list
binary search tree
array
Array can be a candidate. But it has the following shortcuts:
내부적으로 Array를 데이터 저장공간으로 사용하지만, key가 꼭 integer일 필요 없다. Hash function을 이용하여 key를 integer 값으로 변환하여 그 값을 array 의 index로 사용한다!
h(key) = index
h(k)
h(k, i) (i는 충돌 횟수)
h(k,i)
h(k) + [i 에 대한 1차식]
h(k) = k % 10
h(k, i) = h(k) + c*i
h(k) + [i 에 대한 2차식]
h(k,i) = h(k) + i^2
저장할 key size / 전체 slot size
따라서, insert, search, delete에 대해 평균 constant time으로 할 수 있다.
HashMap
HashMap<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2); int a = map.get("a"); // a = 1; map.remove("b"); bool contains = map.containsKey("b"); // contains = false;
완성되면 post에 추가하기. 아래는 draft.
함께하고 있는 알고리즘 스터디 멤버들을 위해 Hash table 자료구조를 정리합니다.
Background
If we have only
linked list
,binary search tree
, andarray
, then...Array: direct addressing
Array can be a candidate. But it has the following shortcuts:
Hash table
내부적으로 Array를 데이터 저장공간으로 사용하지만, key가 꼭 integer일 필요 없다. Hash function을 이용하여 key를 integer 값으로 변환하여 그 값을 array 의 index로 사용한다!
h(key) = index
// "hashing 한다"충돌을 피하는 2가지 방법: open addressing & separate chaining
open addressing
h(k)
에 대해 충돌이 나면,h(k, i) (i는 충돌 횟수)
function으로 다음 index 를 구한다.h(k,i)
가h(k) + [i 에 대한 1차식]
으로 이루어진 식일 때 linear probing이라고 한다.h(k) = k % 10
andh(k, i) = h(k) + c*i
where c = 1일 때h(k,i)
가h(k) + [i 에 대한 2차식]
으로 이루어진 식일 때 quadratic probing이라고 한다. ex)h(k,i) = h(k) + i^2
separate chaining
저장할 key size / 전체 slot size
값이 어느정도 높아지면, 검색시 linked list or tree를 순회해야 하므로 성능이 떨어질 수 있다.시간 복잡도
따라서, insert, search, delete에 대해 평균 constant time으로 할 수 있다.
각 언어에서의 Hash Table
HashMap
References