# 자료구조란?
- 자료를 저장하는 구조
- ADT 에서 자료 저장 방법과 연산방법을 자세히 구현
- 잘 사용한 다는 것은? 구현하고자 하는 목적에 맞는 자료구조 사용해 효율적인 성능으로 구현
## 추상적 자료형 (Abstract Data Type)
자료를 담는 방법과 자료에 대한 연산에 대한 정의가 담긴 것. 구현방법은 정의되어있지 않다.
## 리스트라는 ADT를 구현한 자료구조 ?
- 배열
- 연결 리스트
- 서로 장점과 단점이 일치함..
# 해시테이블
- Key-Value Store를 구현하기 위해 생긴 개념
- 각각 data 고유한 key에 대응하도록 저장
## 정의
- 배열에 value를 저장하고, 배열의 index를 key로 이용하는 방식으로 구현하자
- put : key value쌍 입력
- get : key, value 조회
```
db = keyvalueStore()
db.put(2,7)
#2라는 키에 7 넣기
db.get(4)
#4번키가 갖고있는 게 무엇인지
```
## 배열의 index를 key로 사용하는 방법
- 장점 : 자료의 쓰기, 읽기 연산이 빠르다
- 단점 : 자료가 없다는 것을 표현하는 게 쉽지 않다. 공간이 낭비될 수 있다.
# key와 value를 각각 배열에 저장하기
- key를 저장하는 배열과 value를 저장하는 배열, 두 개의 배열을 사용해 저장
- 같은 인덱스끼리 key,value인, 2개의 배열(myKey, myValue)을 만든다
- 장점 : 공간의 낭비가 없다. 자료가 없는 경우를 표현할 수 있다.
- 단점 : 자료의 읽기(조회), 쓰기(입력)연산이 느리다. (순차탐색 해야하므로)
# 해시(Hash)
- 임의의 데이터에 해시함수를 이용하여 고정된 길이의 데이터(문자열 등)으로 변환하는 것을 의미한다.
- 변환하는 과정 자체를 hashing, 변환된 값을 hash value라고도 부름
- 해시알고리즘의 대표적인 예시 ) SHA-256
- Python 내장함수
- hash()를 이용하여 임의의 값의 해시값(정수)를 알 수 있다.
- 보안을 이유로 프로그램을 실행할 때마다 반환값이 달라진다.
- 앞 4자리만 같고, 그 뒤에 무작위 정수값
- hash 충돌
- 인덱스가 겹치게 되는 문제
- 비둘기집의 원리 : n개의 비둘기 집에 (n+1)마리의 비둘기를 한 집에 한 마리씩 넣는 것은 불가능하다는 원리를 말한다.
- 비둘기가 최대 1마리씩 들어있는 비둘기집이 n개 있다면, 전체 비둘기 집에는 비둘기가 많아야 n마리 존재한다. 따라서 (n+1)마리의 비둘기를 n개의 비둘기 집에 한마리씩 넣는 것은 불가능
- 연락처에 있는 사람 366명의 생일을 올해 달력에 적으려고 할 때, 윤년이 아니고 2월 29일이 생일인 사람이 없다면 한 날짜에 두 사람의 이름을 적어야 하는 경우가 반드시 생김
-> 충돌 필연적으로 발생
- hash 충돌 해결하는 방법
- 개별 chaining
- key-value store의 각 인덱스를 '연결리스트'로 만들어서 동일한 인덱스의 값들을 연결하는 방법
- 동일한 index를 갖는 자료를 서로 연결
- 오픈 addressing
- 충돌발생했을 때 자료를 저장하기 위해 빈 공간을 탐색하는 방식
- 모든 원소가 자신의 해시값과 일치하는 인덱스에 저장된다는 보장은 없음
- 선형 탐사 방식 : 다음 인덱스부터 탐색하여 가장 가까운 빈 공간을 찾는 방법
- Python에서는 딕셔너리의 해시 값 충돌 발생 시, 오픈 어드레싱 방식으로 해결한다.
'ComputerScience > Algorithm, Data structure' 카테고리의 다른 글
python round() (0) | 2021.10.31 |
---|