Share
Sign In
TIL 웹개발
TIL 웹개발 - 해시테이블
서경태
👍
Created by
  • 서경태
Created at
해시테이블(해시 맵)
키, 밸류 구조로 딕셔너리형태의 자료형
자료를 저장하고 검색하는데 사용하는 중요한 기법
좋은 해시 함수의 조건
해시 함수 값 충돌의 최소화
쉽고 빠른 연산
해시 테이블 전체에 해시 값이 균일하게 분포
사용할 키의 모든 정보를 이용하여 해싱
해시 테이블 사용 효율이 높아야함
로드 팩터
해시테이블에 저장된 데이터 개수 n을 버킷의 개수 k 로 나눈 것
로드 팩터 비율에 따라 해시 함수를 재작성 할지, 크기를 조정할 지 결정한다.
로드팩터가 증가할 수록 해시 테이블 성능은 점점 감소하기에 해시테이블의 공간을 재할당한다.
해시 함수
해시 함수를 통해 키가 해시 값으로 변경되는 과정을 도식화 한 것이다.
윤아와 서현의 값은 해시 함수를 통해 동일한 2를 가지며 충동한 것을 알 수 있다.
해결 방식
개별 체이닝
윤아와 서현의 해싱 함수 값이 충돌날 경우 그 뒤에 연결리스트로 붙이는 해결 방법
개별 체이닝의 원리
1.
키의 해시 값을 계산한다.
2.
해시 값을 이용해 배열의 인덱스를 구한다.
3.
같은 인덱스가 있다면 연결 리스트로 연결한다.
오픈어드레싱
충돌 발생 시 탐사를 통해 빈 공간을 찾아 나서는 방식 = 리니어 프로븍 (선형 탐사)
클러스터링 - 선형 탐사의 경우 데이터들이 뭉치는 경향이 생기는데 이것을 클리스터링이라고 한다.
일정 이상 크기가 채워지면 리해싱한다.
개별 체이닝과 리니어 프로빙의 차이
파이썬의 해시 테이블 구현방식
해시 테이블로 구현된 파이썬의 자료형은 딕셔너리 형태이고 오픈 어드레싱 방식으로 구현되어있다.
Subscribe to 'kyugntae-ai'
Welcome to 'kyugntae-ai'!
By subscribing to my site, you'll be the first to receive notifications and emails about the latest updates, including new posts.
Join SlashPage and subscribe to 'kyugntae-ai'!
Subscribe
👍
Other posts in 'TIL 웹개발'See all
서경태
TIL 웹개발 - DFS, BFS
DFS(Depth Fisrt Search) 깊이우선탐색으로 말 그대로 연결된 노드 트리를 따라 끝까지 탐색 후 다시 올라와 나머지를 탐색한다. 위와 같은 노드 트리를 탐색한다면 순서는 아마 [0, 1, 3, 4, 2]가 될 것이다. DFS를 재귀함수로 구현한 코드다. 함수에 함수가 쓰여 조건이 달성될 때까지 반복한다. BFS( Breadth First Search) 너비우선탐색으로 노드트리를 위에서 아래로 차례대로 탐색하는 특징을 갖고 있다. DFS와 달리 BFS로 위 노드 트리를 탐색하면 [0, 1, 2, 3, 4]의 순서를 가진다. 코드로 표현하면 아래와 같다. deque를 사용해 탐색할 노드의 맨 앞에서부터 가져오기때문에 아래에서 위로 순차적인 탐색이 가능하다. dfs, bfs의 특징을 이용해 풀 수 있는 문제가 나뉘기도하고 혹은 두 방법으로 동일한 문제를 풀 수도 있다.
  • 서경태
서경태
TIL 웹개발 - 리스트(list)와 세트(set)의 시간 복잡도 차이
백준 11725번 문제를 푸는데 계속해서 시간초과로 난항을 겪고 있었다. 이 문제를 풀기 위해 내가 짠 코드는 다음과 같다. 파이참에서 실행시켰을때는 입출력 예제와 똑같이 나왔기에 이제 여기서 줄일 만한 곳을 찾기 시작했다. graph를 딕셔너리로 만들었는데 리스트로 변경하면 좀 더 시간이 줄어들까 싶어 시도했지만 역시나 실패였다. 그후 몇 가지 시도를 하다보니 코드가 아예 틀리기도 했다. 결국 나는 그를 찾아갔다. 거의 솔루션은 간단했다. 리스트(list)를 세트(set)로 변경하는 것이다. 위 코드 중 일부를 보면 입력값을 받아 그래프를 만든 후 부모 노드를 찾기 위해 bfs를 사용했다. def bfs_queue(start): parent = [0] * (n+1) visited = [start] q = deque([start]) while q: node = q.popleft() for adj in graph[node]: if adj not in visited: parent[adj] = node q.append(adj) visited.append(adj) def bfs_queue(start): parent = [0] * (n+1) visited = set([start]) q = deque([start]) while q: node = q.popleft() for adj in graph[node]: if adj not in visited: parent[adj] = node q.append(adj) visited.add(adj) visited는 방문한 노드를 중복 방문하지 않기 위해 만든 리스트다. if문에 인접 노드가 이미 visited에 없다면 아래 코드를 반복해서 실행한다. 이때 if adj not in visited의 시간 복잡도는 O(n)이다. 하지만 visited를 세트(set)로 바꾸면 시간 복잡도는 O(1)이 된다. 리스트와 세트의 연산 차이점을 나타낸 표를 참고해보면, 리스트(list)
  • 서경태
서경태
TIL 웹개발 - 파이썬 scope
Scope 파이썬에서 변수의 유효 범위를 말한다. 위치에 따라 작성한 코드가 작동하거나 작동하지 않을 수도 있고 때로는 원하는 대로 값이 안나올 수도 있다. 변수의 위치를 알맞게 작성해야 한다. LEGB rule 이 규칙에 따라 순서대로 작동한다. Local scope 함수 내부에서 선언된 변수나 함수로 그 범위에만 유효하다. Enclosed scope 외부함수에 정의되었지만 내부함수까지 사용된다. 주로 중첩 함수가 정의될 때 사용된다. Global scope 외부에 선언된 변수로 전체적인 범위에 유효하다. Built-in scope 파이썬 설치 파일 안에 바로 내장된 것으로 별다른 선언없이 실행된다. ex) len(), input(), print() 등
  • 서경태
👍
1