1. 해쉬 테이블이란?
- 키(Key)에 데이터(Value)를 저장하는 데이터 구조이다.
- Key를 통해 바로 데이터를 받아올 수 있으므로, 속도가 매우 빨라진다.
- 파이썬에서는 해쉬를 별도 구현할 이유가 없다. - 딕셔너리 타입을 사용하면 된다.
- 해쉬는 임의값을 고정길이로 변환하는 것이다.
- 해쉬 테이블은 해쉬값 또는 해쉬주소와 슬롯을 갖고 있는 데이터 구조이다.
- 해싱 함수는 key값을 넣으면 해쉬주소가 나오는 함수다.
2. 해쉬테이블 체이닝 기법( Chaining )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # 체이닝 기법 hash_table = list([0 for i in range(10)]) def get_key(data): return hash(data) def hash_func(key): return key % 8 def csave_data(data, value): index_key = get_key(data) hash_address = hash_func(index_key) if hash_table[hash_address] != 0: for i in range(len(hash_table[hash_address])): if hash_table[hash_address][i][0] == index_key: hash_table[hash_address][i][1] = value return hash_table[hash_address].append([index_key, value]) else: hash_table[hash_address] = [[index_key, value]] def cread_data(data): index_key = get_key(data) hash_address = hash_func(index_key) if hash_table[hash_address] != 0: for i in range(len(hash_table)): if hash_table[hash_address][i][0] == index_key: return hash_table[hash_address][i][1] else: None | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | csave_data('ab','123') csave_data('ad','456') hash_table ''' output [ [ [-8164117310928844936, '123'], [6320205215618637368, '456'] ], 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ''' | cs |
체이닝 기법은 해쉬 테이블 저장공간 외의 공간을 활용하는 기법이다.
충돌이 일어나면 링크드 리스트라는 자료 구조를 사용해서
링크드 리스트로 데이터를 추가로 뒤에 연결시켜서 저장하는 기법이다.
3. 해쉬테이블 리니어 기법( Linear )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # 리니어 기법 hash_table = list([0 for i in range(10)]) def get_key(data): return hash(data) def hash_func(key): return key % 8 def lsave_data(data, value): index_key = get_key(data) hash_address = hash_func(index_key) if hash_table[hash_address] != 0: for i in range(hash_address, len(hash_table)): if hash_table[i] == 0: hash_table[i] = [index_key, value] return elif hash_table[i][0] == index_key: hash_table[i][1] = value return else: hash_table[hash_address] = [index_key, value] | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | lsave_data('ab','123') lsave_data('ad','456') hash_table ''' output [ [-8164117310928844936, '123'], [6320205215618637368, '456'], 0, 0, 0, 0, 0, 0, 0, 0 ] ''' | cs |
리니어 기법은 충돌이 일어나면, 해당 hash address의 다음 address부터 맨 처음 나오는 빈공간에 저장하는 기법이다.
저장공간 활용도를 높이기 위한 기법이다.
'전체 > 자료구조' 카테고리의 다른 글
파이썬 시간복잡도 이해하기 (0) | 2020.06.08 |
---|---|
파이썬으로 큐 구현하기 (0) | 2020.06.08 |
파이썬으로 스택 구현하기 (0) | 2020.06.08 |