🔷 키와 값을 받아 키를 해싱하여 나온 index에 값을 저장하는 선형 자료구조
💡 해시 함수
입력받은 값을 특정 범위 내 숫자로 변경하는 함수 (정해진 것이 없으므로 마음대로 구현할 수 있다)
🔷 함수의 결과값이 동일하여 겹쳤을 때 해시 충돌(Hash Collision)이 일어난다.
💡 해시 충돌
해시 함수가 서로 다른 두 개의 입력값에 대해 동일한 출력값을 내는 상황을 의미한다. 해시 함수가 무한한 가짓수의 입력값을 받아 유한한 가짓수의 출력값을 생성하는 경우, 비둘기집 원리에 의해 해시 충돌은 항상 존재한다.
🔷 해시 충돌 해결법
1) 선형 탐사법
2) 제곱 탐사법
3) 이중 해싱
4) 분리 연결법
🔷 왜 해시 테이블을 사용하는가?
🔷 자바스크립트에서 사용하기
1) 배열을 그대로 사용(올바른 이용 방법이 아님)
2) 객체를 사용(정석)
3) Map
4) Set
🔷 정점(Node)과 정점 사이를 연결하는 간선(Edge)으로 이루어진 비선형 자료구조
정점 집합과 간선 집합으로 표현할 수 있다.
예시
1) 지하철 노선
2) 페이지랭크 알고리즘
🔷 그래프의 특징
1) 정점은 여러 개의 간선을 가질 수 있다.
2) 크게 방향 그래프와 무방향 그래프로 나눌 수 있다.
3) 간선은 가중치를 가질 수 있다.
4) 사이클이 발생할 수 있다.
💡 사이클
그래프의 정점과 간선의 부분 집합에서 순환이 되는 부분
🔷 무방향 그래프
🔷 방향 그래프
🌟 연결 상태에 따라 달라지는 그래프 🌟
🔷 연결 그래프
🔷 비연결 그래프
🔷 완전 그래프
🔷 인접 행렬(2차원 배열)로 구현하기
🖥 구현 코드
// 2차원 배열 선언 및 초기화
const graph = Array.from(Array(5), () => Array(5).fill(false));
// 값을 넣어 그래프 구현
graph[0][1] = true; // 0 -> 1
graph[0][3] = true; // 0 -> 3
graph[1][2] = true; // 1 -> 2
graph[2][0] = true; // 2 -> 0
graph[2][4] = true; // 2 -> 4
graph[3][2] = true; // 3 -> 2
graph[4][0] = true; // 4 -> 0
🔷 인접 리스트(연결 리스트)로 구현하기
🖥 구현 코드
// 배열로 연결 리스트 선언
const graph2 = Array.from(Array(5), () => []);
// 값을 연결시켜 그래프 구현
graph2[0].push(1); // 0 -> 1
graph2[0].push(3); // 0 -> 3
graph2[1].push(2); // 1 -> 2
graph2[2].push(0); // 2 -> 0
graph2[2].push(4); // 2 -> 4
graph2[3].push(2); // 3 -> 2
graph2[4].push(0); // 4 -> 0
그림 제공: https://programmers.co.kr/