Algorithm basic 3

2020-05-24
computer-science

칸아카데미의 알고리즘 코스를 들으며 정리해본 알고리즘 기초.
https://ko.khanacademy.org/computing/computer-science/algorithms


그래프 표현


[그래프에 대한 기본 용어]


[트리는 무엇인지?]


graph

이러한 그래프가 있다고 하면, 변수에 저장할 때 3가지 방식으로 할 수 있겠다.


1. 엣지리스트 (Edge List)

엣지리스트는 두 vertex을 연결하는 edge의 개수만큼의 배열로 그래프를 저장하는 방식이다. 매우 간단한 방식이지만 아무런 순서 없이 무작위로 들어가 있다면, 특정 edge를 찾기 위해 선형 검색을 해야 하고 이는 O(N)만큼의 복잡도를 지닌다.

const edgeList = [
  [0, 2],
  [1, 3],
  [2, 3],
  [2, 4],
  [3, 5],
  [4, 5],
];


2. 인접행렬

인접행렬은 모든 vertex에 인접한 각 vertex를 0으로 표시하고 edge가 있는 경우 1로 표시한 배열로 그래프를 저장하는 방식이다. 즉, vertex by vertex로써 저장되므로 edge가 별로 없는 희소 그래프이더라도 공간을 N^2만큼 차지한다. 게다가 특정 i의 인접한 j를 찾기 위해서는 i행의 모든 vertex를 검색해야 한다.

const adjMatrix = [
  [0, 0, 1, 0, 0, 0],
  [0, 0, 0, 1, 0, 0],
  [0, 0, 0, 1, 1, 0],
  [0, 0, 0, 0, 0, 1],
  [0, 0, 0, 0, 0, 1],
  [0, 0, 0, 0, 0, 0],
];


3. 인접리스트

인접리스트는 각 vertex의 edge로 연결된 vertex로 이루어진 배열로 그래프를 저장하는 방식이다. 따라서 edge (i, j)가 그래프에 있는지 찾으려면 graph[i][j]로 검색해야 한다. 이 검색은 최악의 경우에는 정점 i의 edge 개수만큼 걸린다. 즉, O(degree)만큼의 복잡도를 지닌다.

const adjList = [[2], [3], [3, 4], [5], [5], []];



너비우선탐색, 거대한 그래프 횡단해보기


bfs



Q1. 어떤 정점에 이미 갔는지 여부를 어떻게 결정하는가?
방문하기 전에는 정점의 거리가 null일 것이고 가보게 되면 거리에 따라 값이 할당된다. 따라서 어떤 정점의 이웃 정점을 검사할 때 그 거리가 현재 null인 정점만 방문하면 된다.


Q2. 어떤 정점에 이미 갔으나, 거기서 출발했는지 여부를 어떻게 확인하는가?

백준 알고리즘을, 특히 파이썬으로 풀면서 참고할 것들 정리

2024-01-20
computer-science

After reading <code>

2020-11-18
review computer-science

After reading <concepts of programming languages>

2020-06-28
review computer-science
comments powered by Disqus