1. Graph
- 여러개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조이다.
- 서로 다른 점들이 직접적인 관계를 가지고 있다면 이어주는 선이 존재하고, 간접적인 관계를 가지고 있다면 여러 점을 거쳐서 이어지는 선이 존재할 수 있다.
- 여기서 이야기 하는 점은 그래프에서 정점( Vertex )라고 표현하고, 선은 간선( Edge )이라고 표현한다.
- 간선을 보면 서로 이어져 있다는 것은 알 수 있지만, 얼마나 떨어져 있는지에 대한 정보는 알 수 없다.
-----------------------------------------------------------------------------------
2. 비가중치 그래프
- 가중치( 연결의 강도가 얼마나 되는지 )가 적혀 있지 않은 현재의 그래프는 비가중치 그래프라고 부른다.
-----------------------------------------------------------------------------------
3. 가중치 그래프
- 가중치 그래프는 더 자세한 정보들을 붙일 수 있다.
-----------------------------------------------------------------------------------
4. 알아둬야 할 그래프 용어들
- 무향 그래프( Undirected Graph ) : 네비게이션 그래프는 무향 그래프이다. 서울에서 부산으로 갈 수 있듯, 반대로 부산에서 서울로 가는것도 가능하다. 하지만 단방향( Directed ) 그래프로 구현 된다면 서울에서 부산을 갈 수 있지만, 부산에서 서울로 가는 것은 불가능하다.
- 진입차수( In - Degree ) / 진출차수( Out - Degree ) : 한 정점에 진입( 들어오는 간선 )하고 진출( 나가는 간선 )하는 간선이 몇 개인지를 나타낸다.
- 인접( Adgacency ) : 두 정점간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점이다.
- 자기 루프( Self Loop ) : 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다 라고 표현한다. 다른 정점을 거치지 않는다는 것이 특징이다.
- 사이클( Cycle ) : 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현한다.
-----------------------------------------------------------------------------------
5. 그래프의 표현 방식 : 인접행렬 & 인접리스트
- 인접 행렬 : 인접 행렬은 정점들간의 인접함을 표시해 주는 행렬으로 2차원 배열의 모습을 가지고 있습니다.
** 언제 사용하면 좋을까? **
- 한 개의 큰 표와 같은 모습을 한 인접 행렬은 두 정점 사이에 관계가 있는지, 없는지 확인하기에 용이하다.
- 예를 들어, A 에서 B 로 진출하는 간선이 있는지 파악하기 위해선 0 번째 줄의 1 번째 열에 어떤 값이 저장되어 있는지 바로 확인할 수 있다.
- 가장 빠른 경로( Shortest Path )를 찾고자 할 때 주로 사용한다.
- 인접 리스트
- 인접 리스트는 각 정점이 어떤 정점과 인접한지 형태로 볼 수 있는 표현 방식이다.
- 각 정점마다 하나의 리스트를 가지고 있으며, 이 리스트에는 자신과 인접한 다른 정점들이 담겨 있다.
** 언제 사용하면 좋을까? **
- 인접 행렬은 연결 가능한 모든 경우의 수를 저장한다.
- 서로 인접하지 않다면 0 을, 인접하다면 1 을 저장하기 때문에 메모리를 많이 차지하게 된다.
- 메모리를 효율적으로 사용하고 싶다면 행렬 대신 리스트를 사용한다.
-----------------------------------------------------------------------------------
6. Tree
- 그래프의 여러 구조 중 무방향 그래프의 한 구조로, 모습이 나무와 닮아 있다고 해서 트리 구조라는 이름이 붙여졌다.
- 하나의 뿌리로부터 가지가 사방으로 뻗은 형태를 띄우고 있다.
- 데이터가 바로 아래에 있는 하나 이상의 데이터에 무방향으로 연결되는 계층적 자료구조라고 할 수 있다.
- 데이터를 순차적으로 나열시킨 형태의 선형 구조가 아닌, 하나의 데이터 뒤에 여러 개의 데이터가 존재할 수 있는 비선형 구조로 되어있고, 계층적으로 표현이 되며 아래로만 뻗기 때문에 사이클이 없다.
-----------------------------------------------------------------------------------
7. 트리의 구조
- 트리 구조는 루트( Root )라는 하나의 꼭짓점 데이터를 시작으로 여러 개의 데이터를 간선으로 연결한다.
- 이 데이터들을 노드( Node )라고 하며, 상위 노드와 하위 노드가 연결이 되면 부모/자식 관계를 가지게 된다.
- 자식이 없는 노드는 나무의 잎과 같다고 하여 리프 노드( Leaf Node )라고 부른다.
- 트리는 높이와 깊이를 잴 수 있다. 루트에서 자신에게 걸리는 거리를 레벨( Level )이라고 부르며, 루트를 Level1 로 설정한다. 노드와 노드의 간격( 거리 )를 레벨이라고 부르기도 한다.
- 루트부터 가장 안쪽에 있는 노드까지의 레벨을 트리의 높이( Height )라고 부르고, 특정 노드부터 시작하여 루트까지의 레벨을 노드의 깊이( Depth )라고 표현한다.
- 같은 레벨이 있는 노드들은 형제 노드( Sibling Node )로 표현한다.
-----------------------------------------------------------------------------------
8. BST ( Binary Search Tree )
- 트리는 편리한 구조를 전시하는 것 외에 효율적인 탐색을 위해 사용하기도 한다.
-----------------------------------------------------------------------------------
9. 이진 트리
- 자식 노드가 최대 두 개인 노드들로 구성된 트리를 이진 트리라고 정의한다.
- 이진 트리는 자료의 삽입, 삭제 방법에 따라 정 이진 트리( Full Binary Tree ), 완전 이진 트리( Complete Binary Tree), 포화 이진 트리( Perfect Binary Tree ) 로 나뉜다.
9 - 1) 완전 이진 트리
- 마지막 레벨을 제외한 모든 노드가 가득 차 있어야 하고, 마지막 레벨의 노드는 전부 차 있지 않아도 되지만 왼쪽이 채워져있어야 한다.
9 - 2) 정 이진 트리
- 각 노드가 0 개 혹은 2 개의 자식 노드를 갖는다.
9 - 3) 포화 이진 트리
- 정 이진 트리이면서 완전 이진 트리인 경우이다. 모든 리프 노드의 레벨이 동일하고, 모든 레벨이 가득 채워져 있는 트리이다.
9 - 4) 이진 탐색 트리
- 모든 왼쪽 자식들은 루트나 부모보다 작은 값이고, 모든 오른쪽 자식들은 루트나 부모보다 큰 값인 특징을 가지고 있는 이진 트리를 이진 탐색 트리라고 정의한다.
- 이진 탐색 트리는 균형 잡힌 트리가 아닐 때, 입력되는 값의 순서에 따라 한쪽으로 노드들이 몰리게 될 가능성이 있다. 이러한 문제를 해결하기 위해 삽입과 삭제마다 트리의 구조를 재조정하는 과정을 거치는 알고리즘을 도입할 수 있다.
-----------------------------------------------------------------------------------
10. 마무리
오늘 자료구조 Stack, Queue, Tree, Graph 에 대해서 했다.
요즘 코플릿을 많이 풀다보니 후반부 시간쯤 오면 뇌에 과부화가 와서 오히려 아무 생각이 안든다.. 머리가 안돌아간다..
휴식도 중요하다 생각이 든다. 못마치고 넘어간 부분은 주말에 달려야겠다.
자료구조를 꼭 완벽히 파악하자.
'Java Script' 카테고리의 다른 글
JS - HTTP (0) | 2021.05.25 |
---|---|
JS - Tree&Graph Search (0) | 2021.05.14 |
JS - Stack&Queue (0) | 2021.05.13 |
JS - 재귀 (0) | 2021.05.12 |
JS - 객체 지향 (0) | 2021.05.10 |