코딩테스트 합격자 되기 C++
08장 해시
저자 박경록
목차
- 해시의 개념
- 해시 함수
- 충돌 처리
- 실제 예시
강의 영상
배열로 구현한 연락처
특정 데이터의 위치를 판단할수 있는 정보가 없으므로, 선형탐색 해야 함
인덱스에 이름정보가 없음
인덱스에 이름정보를 어떻게 넣을 것인가?
홍길동 배열 인덱스
해시함수
해시를 적용한 연락처
해시 함수를 사용해서 변환한 값을 인덱스로 삼아 키-값을 저장해서 빠른 데이터 탐
색을 제공하는 자료구조
“함진아”라는 키에 해시함수를 적용하면 인덱스 2를 얻는다.
=> 몇번을 해봐도 “함진아”의 해시함수 적용값은 2가 된다.
=> 이름을 가지고 바로 연락처 위치를 알 수 있다.
=> 이름 자체로 인덱스를 구할 수 있다.
버킷
해시테이블
해시함수(정의)
임의의 키를 해시테이블의 인덱스로 변경해주는 함수
=> 해시 테이블의 크기가 N이라면 해시함수는 0 ~ (N-1)사이 값을 내야 함
=> 충돌을 최소화 할수록 좋은 해시함수
- “홍길동”과 “홍길서”는 다른 키 임
- 서로 다른 키에 대해 해시 함수가 동일한
인덱스를 반환할 경우 충돌이 발생
해시함수(나눗셈 법)
h(x) = x mod k (x는 키, k는 소수)
- k로 나눈 나머지는 0 ~ k-1이므로 해시 테이블의 크기는 k
- k가 소수인 이유는 충돌을 줄이기 위함(소수가 아니면 k주기로 해시값 반복 됨)
결국엔 (k-1)이 됨
해시함수(곱셈법, 정의)
- 나눗셈법은 k가 소수여야 하므로, 테이블 크기가 커지면.. 큰 소수가 필요(어려움)
- 곱셈법은 소수를 활용하지 않고 황금비를 곱하는 방식
- h(x) = (((x * A) mod 1) * m) x는 키, A는 황금 비, m은 최대 버킷의 갯수
a b
해시함수(곱셈법, 황금비란)
a b
a+b
a/b = a /(a+b) = 황금비
황금비는 대략 1.6180339887
곱셈법의 A
해시함수(곱셈법, 실제연산)
키 정수 소수
황금비를 곱함
(x * A)
소수
mod 1을 함
0
m-1
m을 곱함
h(x) = (((x * A) mod 1) * m)
-x는 키, A는 황금 비, m은 최대 버킷의 갯수
해시함수(문자열 해싱)
- 문자열의 아스키 코드 값을 활용한 해싱
해시함수(문자열 해싱, 해시함수 설명)
a b c x f
0 1 2 … (n-1)
키(s)
테이블 크기
- p는 31 (홀수이면서 메르센 소수)
- 숫자가 금방커지므로 구현시 overflow가 발생할 수 있음
* 수정된 공식 사용
- a = 1, b = 2, c = 3, ….. z = 26로 숫자를 매칭해서 사용
해시함수(문자열 해싱, 해시함수 설명)
(a+b)%c = (a%c + b%c)%c를 활용해서 아래와 같이 구현 함
해시 충돌이란?
서로 다른키에 대해 해시 함수 결괏값이 같은 경우 “충돌”이 발생함
- 체이닝, 개방 주소법이 충돌을 처리하는 대표적인 방법
해시충돌처리(체이닝)
- 충돌 발생 시, 해당 버킷에 링크드리스트로 데이터를 연결 함.
-특정 버킷에 데이터가 N개인 경우, 원하는 값을 찾는데 O(N)이 걸릴수 있음
만약 N개 데이터가 충돌이 발생하
면 탐색 성능은 O(N)이 됨
실제로는 이를 좀 더 효율적으로 하는 방법
도 가능하나(선형+이진트리) 체이닝의 특
징을 설명하게 위해 간소화 함
해시충돌처리(개방 주소법 - 선형 탐사)
- 충돌 발생 시, 다른 빈 버킷을 찾아 충돌값을 삽입
- 최대한 기존 테이블을 사용하자는 방식(메모리를 아낄수 있음)
- k는 키, i는 충돌시 이동할 버킷 수, m은 버킷 사이즈
해시충돌처리(개방 주소법 - 이중해싱)
- 용어 그대로 해시 함수를 2개 사용(경우에 따라 N개까지 확장)
- 기존에 i를 더했던 선형탐사와 다르게 2번째 해시함수에 i를 곱하는 방식도 가능
* 이 때 클러스터를 줄이기 위해 m을 제곱수나 소수로 함
- k는 키, i는 임의의 수, h1은 첫번째 해시함수, h2는 두번째 해시함수, m은 테이블크기
언제 해시를 활용해서 문제를 풀어야 하나?
- 키-값 쌍으로 연관된 데이터가 존재하며, 해당 값에 대한 접근이 빈번한 경우
* 예를 들어 사전(단어를 검색해서 뜻을 찾음) 이나, 연락처(이름을 검색해서
번호를 찾음)
- 중복되지 않는 키를 사용하는 경우
* 예를 들어 학번이나 집주소(중복되지 않음)
언제 해시를 활용해서 문제를 풀어야 하나?(예시 1)
학생 정보 관리 시스템
학생들의 정보를 관리하는 시스템을 예로 들어보겠습니다.
학생의 ID를 키로, 성적을값으로 저장한다고 가정합니다.
ID- 점수 한개 ID- 점수 여러개
언제 해시를 활용해서 문제를 풀어야 하나?(예시 2)
문자열 내 문자 빈도수
문자열이 입력됩니다.
문자열의 각 문자의 개수를 확인하고 싶습니다.
해시를 사용하지 말아야 하는 경우
특정 키에 여러 가지 값을 매칭해야 하는 경우
키가 2개 저장되지 않고 이전 키에 대한 값이 변경됨
커뮤니티 소개
- 오픈 카톡방
- 깃허브
- 디스코드
커뮤니티 소개(오픈카톡방) cont’d
- 저자 직접 운영
- 대략 400명 정도 인원이 자유롭게 소통
- 개인적인 주제 및 코딩 관련 소통 가능
커뮤니티 소개(오픈카톡방)
커뮤니티 소개(깃허브) cont’d
- 책 문제의 정답코드
- 코딩테스트 준비를 위해 필요한 자료구조 및 알고리즘
- C++ 기본 문법
- STL의 성능 비교
커뮤니티 소개(깃허브)
커뮤니티 소개(디스코드) cont’d
- 모각코 진행
- 공식 스터디 / 개인 스터디 모집 공고 및 진행
- 책 관련 문의 / 답변
커뮤니티 소개(디스코드)

코딩테스트 합격자 되기 C++ 08장 해시를 설명한 강의 자료 입니다.

  • 1.
    코딩테스트 합격자 되기C++ 08장 해시 저자 박경록
  • 2.
    목차 - 해시의 개념 -해시 함수 - 충돌 처리 - 실제 예시
  • 3.
  • 4.
    배열로 구현한 연락처 특정데이터의 위치를 판단할수 있는 정보가 없으므로, 선형탐색 해야 함 인덱스에 이름정보가 없음
  • 5.
    인덱스에 이름정보를 어떻게넣을 것인가? 홍길동 배열 인덱스 해시함수
  • 6.
    해시를 적용한 연락처 해시함수를 사용해서 변환한 값을 인덱스로 삼아 키-값을 저장해서 빠른 데이터 탐 색을 제공하는 자료구조 “함진아”라는 키에 해시함수를 적용하면 인덱스 2를 얻는다. => 몇번을 해봐도 “함진아”의 해시함수 적용값은 2가 된다. => 이름을 가지고 바로 연락처 위치를 알 수 있다. => 이름 자체로 인덱스를 구할 수 있다. 버킷 해시테이블
  • 7.
    해시함수(정의) 임의의 키를 해시테이블의인덱스로 변경해주는 함수 => 해시 테이블의 크기가 N이라면 해시함수는 0 ~ (N-1)사이 값을 내야 함 => 충돌을 최소화 할수록 좋은 해시함수 - “홍길동”과 “홍길서”는 다른 키 임 - 서로 다른 키에 대해 해시 함수가 동일한 인덱스를 반환할 경우 충돌이 발생
  • 8.
    해시함수(나눗셈 법) h(x) =x mod k (x는 키, k는 소수) - k로 나눈 나머지는 0 ~ k-1이므로 해시 테이블의 크기는 k - k가 소수인 이유는 충돌을 줄이기 위함(소수가 아니면 k주기로 해시값 반복 됨) 결국엔 (k-1)이 됨
  • 9.
    해시함수(곱셈법, 정의) - 나눗셈법은k가 소수여야 하므로, 테이블 크기가 커지면.. 큰 소수가 필요(어려움) - 곱셈법은 소수를 활용하지 않고 황금비를 곱하는 방식 - h(x) = (((x * A) mod 1) * m) x는 키, A는 황금 비, m은 최대 버킷의 갯수 a b
  • 10.
    해시함수(곱셈법, 황금비란) a b a+b a/b= a /(a+b) = 황금비 황금비는 대략 1.6180339887 곱셈법의 A
  • 11.
    해시함수(곱셈법, 실제연산) 키 정수소수 황금비를 곱함 (x * A) 소수 mod 1을 함 0 m-1 m을 곱함 h(x) = (((x * A) mod 1) * m) -x는 키, A는 황금 비, m은 최대 버킷의 갯수
  • 12.
    해시함수(문자열 해싱) - 문자열의아스키 코드 값을 활용한 해싱
  • 13.
    해시함수(문자열 해싱, 해시함수설명) a b c x f 0 1 2 … (n-1) 키(s) 테이블 크기 - p는 31 (홀수이면서 메르센 소수) - 숫자가 금방커지므로 구현시 overflow가 발생할 수 있음 * 수정된 공식 사용 - a = 1, b = 2, c = 3, ….. z = 26로 숫자를 매칭해서 사용
  • 14.
    해시함수(문자열 해싱, 해시함수설명) (a+b)%c = (a%c + b%c)%c를 활용해서 아래와 같이 구현 함
  • 15.
    해시 충돌이란? 서로 다른키에대해 해시 함수 결괏값이 같은 경우 “충돌”이 발생함 - 체이닝, 개방 주소법이 충돌을 처리하는 대표적인 방법
  • 16.
    해시충돌처리(체이닝) - 충돌 발생시, 해당 버킷에 링크드리스트로 데이터를 연결 함. -특정 버킷에 데이터가 N개인 경우, 원하는 값을 찾는데 O(N)이 걸릴수 있음 만약 N개 데이터가 충돌이 발생하 면 탐색 성능은 O(N)이 됨 실제로는 이를 좀 더 효율적으로 하는 방법 도 가능하나(선형+이진트리) 체이닝의 특 징을 설명하게 위해 간소화 함
  • 17.
    해시충돌처리(개방 주소법 -선형 탐사) - 충돌 발생 시, 다른 빈 버킷을 찾아 충돌값을 삽입 - 최대한 기존 테이블을 사용하자는 방식(메모리를 아낄수 있음) - k는 키, i는 충돌시 이동할 버킷 수, m은 버킷 사이즈
  • 18.
    해시충돌처리(개방 주소법 -이중해싱) - 용어 그대로 해시 함수를 2개 사용(경우에 따라 N개까지 확장) - 기존에 i를 더했던 선형탐사와 다르게 2번째 해시함수에 i를 곱하는 방식도 가능 * 이 때 클러스터를 줄이기 위해 m을 제곱수나 소수로 함 - k는 키, i는 임의의 수, h1은 첫번째 해시함수, h2는 두번째 해시함수, m은 테이블크기
  • 19.
    언제 해시를 활용해서문제를 풀어야 하나? - 키-값 쌍으로 연관된 데이터가 존재하며, 해당 값에 대한 접근이 빈번한 경우 * 예를 들어 사전(단어를 검색해서 뜻을 찾음) 이나, 연락처(이름을 검색해서 번호를 찾음) - 중복되지 않는 키를 사용하는 경우 * 예를 들어 학번이나 집주소(중복되지 않음)
  • 20.
    언제 해시를 활용해서문제를 풀어야 하나?(예시 1) 학생 정보 관리 시스템 학생들의 정보를 관리하는 시스템을 예로 들어보겠습니다. 학생의 ID를 키로, 성적을값으로 저장한다고 가정합니다. ID- 점수 한개 ID- 점수 여러개
  • 21.
    언제 해시를 활용해서문제를 풀어야 하나?(예시 2) 문자열 내 문자 빈도수 문자열이 입력됩니다. 문자열의 각 문자의 개수를 확인하고 싶습니다.
  • 22.
    해시를 사용하지 말아야하는 경우 특정 키에 여러 가지 값을 매칭해야 하는 경우 키가 2개 저장되지 않고 이전 키에 대한 값이 변경됨
  • 23.
    커뮤니티 소개 - 오픈카톡방 - 깃허브 - 디스코드
  • 24.
    커뮤니티 소개(오픈카톡방) cont’d -저자 직접 운영 - 대략 400명 정도 인원이 자유롭게 소통 - 개인적인 주제 및 코딩 관련 소통 가능
  • 25.
  • 26.
    커뮤니티 소개(깃허브) cont’d -책 문제의 정답코드 - 코딩테스트 준비를 위해 필요한 자료구조 및 알고리즘 - C++ 기본 문법 - STL의 성능 비교
  • 27.
  • 28.
    커뮤니티 소개(디스코드) cont’d -모각코 진행 - 공식 스터디 / 개인 스터디 모집 공고 및 진행 - 책 관련 문의 / 답변
  • 29.