이미지 출처 : https://dev-kani.tistory.com/1
hash_table = list([i for i in range(10)])
print(hash_table) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list comprehension
[출력표현식 for 요소 in 입력 Sequence [if 조건식]]
- 입력 Sequence는 Iteration이 가능한 데이터 Sequence 혹은 컬렉션
- [if 조건식]에서 []는 리스트 괄호가 아니라 옵션이라는 뜻, 즉 조건이 있을 때만 넣으면 된다는 뜻임
# list comprehension 예시
# 위 코드의 출력표현식을 i에서 i*i로 바꾼 결과
hash_table = list([i*i for i in range(10)])
print(hash_table) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 종류가 다른 데이터에서 정수 리스트만 가져오기
dataset = [False, 49, "seunghye", 31.43, 6, 10]
int_data = [num for num in dataset if type(num)==int]
print(int_data) # [49, 6, 10]
def hash_func(key):
return key % 5
data1 = 'seunghye'
data2 = 'lee'
data3 = 'biscoff'
data4 = 'Lotus'
## ord(): 문자의 ASCII(아스키)코드 리턴
print(ord(data1[0]), ord(data2[0]), ord(data3[0])) # 115 108 98
print(ord(data1[0]), hash_func(ord(data1[0]))) # 115 0
print(ord(data1[0]), ord(data4[0])) # 115 76
def storage_data(data, value):
key = ord(data[0])
hash_address = hash_func(key)
hash_table[hash_address] = value
storage_data('seunghye', '01043809999')
storage_data('cy', '01045006622')
def get_data(data):
key = ord(data[0])
hash_address = hash_func(key)
print(hash_table[hash_address])
get_data('seunghye') # 01043809999
O(1)
O(n)
hash_table = list([0 for i in range(8)])
print(hash_table) # [0, 0, 0, 0, 0, 0, 0, 0]
def get_key(data):
return hash(data)
get_key('seunghye') # 5687436291790947533
def hash_func(key):
return key % 8
def save_data(data, value):
hash_address = hash_func(get_key(data))
hash_table[hash_address] = value
def read_data(data):
hash_address = hash_func(get_key(data))
print(hash_address)
print(hash_table[hash_address])
save_data('seunghye', '01043005555')
save_data('cy', '01045778844')
read_data('seunghye') # 2 # 01043005555
read_data('cy') # 0 # 01045778844
print(hash_table) ['01045778844', 0, '01043005555', 0, 0, 0, 0, 0]
Chaining 방식은 Linked List를 이용하는 방법으로 저장하려는 해시테이블에 이미 같은 키값의 데이터가 있다면, 노드를 추가하여 다음 노드를 가르키는 방식으로 구현하는 것
hash_table = list([0 for i in range(8)])
print(hash_table) # [0, 0, 0, 0, 0, 0, 0, 0]
def get_key(data):
return hash(data)
def hash_func(key):
return key % 8
def save_data(data, value):
index_key = get_key(data) # index_key 추가
hash_address = hash_func(index_key) # 해싱 함수에 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_func(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:
print(hash_table[hash_address][index][1])
return None
else:
return None
save_data('sh','01043885555')
save_data('st','01044998855')
save_data('sn','01033226666')
print(hash_table) #
[
0,
[[-7316118316409785375, '01043885555'], [-2016450872523258815, '01033226666']], << 충돌된 부분 chaining 처리
0,
[[-6747111481167668693, '01044998855']],
0,
0,
0,
0
]