시간복잡도 O(1)
Hash Collision
hash_table = list([0 for i in range(2)])
def custom_hash_function(val):
ascii_sum = ord(val[0]) + ord(val[-1])
return ascii_sum % 2
def store_data(key, value):
hash_address = custom_hash_function(key)
hash_table[hash_address] = value
def get_data(val):
hash_address = custom_hash_function(val)
return hash_table[hash_address]
name1 = 'choonsik'
name2 = 'lion'
store_data(name1, '배가고픔')
store_data(name2, '배부름')
print(get_data(name1)) # 배부름
print(get_data(name2)) # 배부름
print(hash_table) # ['배부름', 0, 0]
해결책1 (Chaining)
hash_table = list([0 for i in range(3)])
def custom_hash_function(val):
ascii_sum = ord(val[0]) + ord(val[-1])
return ascii_sum, ascii_sum % 2
def get_data(val):
ascii_sum, hash_address = custom_hash_function(val)
if hash_table[hash_address] != 0:
for idx in range(len(hash_table[hash_address])):
if hash_table[hash_address][idx][0] == ascii_sum:
return hash_table[hash_address][idx][1]
return None
else:
return None
def store_data(key, val):
ascii_sum, hash_address = custom_hash_function(key)
if hash_table[hash_address] != 0:
for idx in range(len(hash_table[hash_address])):
if hash_table[hash_address][idx][0] == ascii_sum:
hash_table[hash_address][idx][1] = val
return
hash_table[hash_address].append([ascii_sum, val])
else:
hash_table[hash_address] = [[ascii_sum, val]]
name1 = 'choonsik'
name2 = 'lion'
store_data(name1, '배가고픔')
store_data(name2, '배부름')
print(get_data(name1)) # 배가고픔
print(get_data(name2)) # 배부름
print(hash_table) # [[[206, '배가고픔'], [218, '배부름']], 0, 0]
해결책2 (Linear Probing)
hash_table = list([0 for i in range(3)])
def custom_hash_function(val):
ascii_sum = ord(val[0]) + ord(val[-1])
return ascii_sum, ascii_sum % 2
def get_data(val):
ascii_sum, hash_address = custom_hash_function(val)
if hash_table[hash_address] != 0:
for idx in range(hash_address, len(hash_table)):
if hash_table[idx] == 0:
return None
elif hash_table[idx][0] == ascii_sum:
return hash_table[idx][1]
return None
else:
return None
def store_data(key, val):
ascii_sum, hash_address = custom_hash_function(key)
if hash_table[hash_address] != 0:
for idx in range(hash_address, len(hash_table)):
if hash_table[idx] == 0:
hash_table[idx] = [ascii_sum, val]
return
elif hash_table[idx][0] == ascii_sum: # 수정
hash_table[idx][1] = val
else:
hash_table[hash_address] = [ascii_sum, val]
name1 = 'choonsik'
name2 = 'lion'
store_data(name1, '배가고픔')
store_data(name2, '배부름')
print(get_data(name1)) # 배가고픔
print(get_data(name2)) # 배부름
print(hash_table) # [[206, '배가고픔'], [218, '배부름'], 0]