October 30, 2020
효율적인 데이터 관리 가능
문자를 숫자로 변환
문자를 특정 숫자로 변환하는데 사용한 코드
Component sum
Polynomial accumulation
💡 키를 이용하면 바로 검색하는 것이 가능하기 때문에 시간복잡도는 이다.
But, 해시테이블에 충돌이 일어나 모든 데이터가 해시 테이블의 한 셀에 들어간다면 소요
해시 함수가 반환하는 값이 동일하여 이미 채워진 셀에 데이터를 추가하는 것
😎 분리 연결법으로 해결할 수 있다.
개방 해슁 또는 Open Hashing 기법 중 하나: 해쉬 테이블 저장공간 외의 공간을 활용하는 기법
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_function(key):
return key % 8
def save_data(data, value):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
hash_table[hash_address][index][1] = value
return
hash_table[hash_address].append([index_key, value])
else:
hash_table[hash_address] = [[index_key, value]]
def read_data(data):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
return hash_table[hash_address][index][1]
return None
else:
return None
배열: 충돌이 발생했을 때 셀에 하나의 값을 넣는 대신 배열로의 참조를 통해 저장
해당 주소에 값이 아닌 배열들의 배열이 있음 발견
Linear Probing(선형 탐색)
Quadratic Probing(제곱 탐색)
Double Hahsing(이중 해시)
해시 테이블에서 사용 가능한 셀의 수
사용하는 해시 함수의 종류
💡 해시테이블 설계시 메모리 낭비와 충돌 모두 고려해야 한다.
데이터와 셀 간 비율
각 데이터를 해시 테이블의 key, value에는 true 등 boolean값 할당
var set = {};
set["candy"] = 1;
set["chocolate"] = 1; // O(1)에 삽입 가능
/*이미 있는 키를 추가한다면*/
set["candy"] = 1; // O(1)에 삽입 가능, 덮어쓰기 때문에 검색이 필요없다
var votes = {};
function addVote(candidate) {
if(votes[candidate]) { // 이미 항목이 있으면
votes[candidate]++; // 투표수 추가
} else {
votes[candidate] = 1; // 없으면 1 배정
}
}
function countVotes() {
return votes; // 각 키에 득표수가 저장되어 있는 해시테이블 반환
}
Source