-
자료구조 해쉬 테이블자료구조와 알고리즘 2020. 10. 23. 18:26
1.해쉬 구조
-Hash Table : 키(key)에 데이터(data)를 저장하는 데이터 구조
- Key를 통해 바로 데이터를 받아올 수 있으므로, 속도가 획기적으로 빨라짐
- 파이썬 딕셔너리(Dictionary) 타입이 해쉬 테이블의 예: Key를 가지고 바로 데이터(Value)를 꺼냄
- 보통 배열로 미리 Hash Table 사이즈만큼 생성 후에 사용 (공간과 탐색 시간을 맞바꾸는 기법)
- 단, 파이썬에서는 해쉬를 별도 구현할 이유가 없음 - 딕셔너리 타입을 사용하면 됨
2. 알아둘 용어
- 해쉬(Hash): 임의 값(방대한 데이터)을 고정 길이로 변환하는 것
- 해쉬 테이블(Hash Table): 키 값의 연산에 의해 직접 접근이 가능한 데이터 구조(해쉬주소와 슬롯을 가지고 있는)
- 해싱 함수(Hashing Function): Key에 대해 산술 연산을 이용해 데이터 위치를 찾을 수 있는 함수
- 해쉬 값(Hash Value) 또는 해쉬 주소(Hash Address): Key를 해싱 함수로 연산해서, 해쉬 값을 알아내고, 이를 기반으로 해쉬 테이블에서 해당 Key에 대한 데이터 위치를 일관성있게 찾을 수 있음
- 슬롯(Slot): 한 개의 데이터를 저장할 수 있는 공간
- 저장할 데이터에 대해 Key를 추출할 수 있는 별도 함수도 존재할 수 있음
3. 간단한 해쉬 예
hash_table = list([i for i in range(10)]) hash_table
>실행결과 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
hash_table = list([0 for i in range(10)]) hash_table
>실행결과 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
3.2. 이번엔 초간단 해쉬 함수를 만들어봅니다.
- 다양한 해쉬 함수 고안 기법이 있으며, 가장 간단한 방식이 Division 법 (나누기를 통한 나머지 값을 사용하는 기법)
def hash_func(key): return key % 5
3.3. 해쉬 테이블에 저장해보겠습니다.
- 데이터에 따라 필요시 key 생성 방법 정의가 필요함
# 이름이 데이터일때 이름의 첫 글자의 아스키값을 키로 만듦 data1 = 'Andy' data2 = 'Dave' data3 = 'Trump' data4 = 'Anthor' ## ord(): 문자의 ASCII(아스키)코드 리턴 print (ord(data1[0]), ord(data2[0]), ord(data3[0])) #각 데이터의 첫번째 글자 print (ord(data1[0]), hash_func(ord(data1[0]))) print (ord(data1[0]), ord(data4[0]))
#data1[0]의 출력값은 A ord(data1[0])은 65
3.3.2. 해쉬 테이블에 값 저장 예
- data:value 와 같이 data 와 value를 넣으면, 해당 data에 대한 key를 찾아서, 해당 key에 대응하는 해쉬주소에 value를 저장하는 예
def storage_data(data, value): key = ord(data[0]) hash_address = hash_func(key) hash_table[hash_address] = value
storage_data('Andy', '01012341234')이렇게 넣으면
key = 65
hash_address = 0
hash_table[0]에 '01012341234' 값이 저장된다.
*hash_table은 위에서 이미 만들어 놓았다.
storage_data('Andy', '100') storage_data('Dave', '200') storage_data('Trump', '300') storage_data('Ajun','400')
이렇게 hash_table에 위의 값들을 넣으면
0 1 2 3 4 5 6 7 8 9 400 0 0 200 300 0 0 0 0 0 위와 같다.
첨에 0번 자리에 Andy의 값 100이 들어갔지만 ajun의 값이 덮어 씌웠다.
3.5. 실제 데이터를 저장하고, 읽어보겠습니다.
def get_data(data): key = ord(data[0]) print(key) hash_address = hash_func(key) return hash_table[hash_address]
get_data('Andy')
위 코드를 출력하면 400일 출력된다.
아무튼 Ajun은 강의에 나온 내용은 아니지만 배우다가 의문이 들어 실행해 봤는데 이런 현상을 발견했다 아직 다음 수업을 들어봐야 알겠지만 일단은 여기까지
'자료구조와 알고리즘' 카테고리의 다른 글
자료구조 해쉬 테이블3 (0) 2020.10.25 자료구조 해쉬 테이블2 (0) 2020.10.25 시간 복잡도 (0) 2020.10.23 자료구조 링크드 리스트(Linked List)4 (0) 2020.10.22 자료구조 링크드 리스트(Linked List)3 (0) 2020.10.22