Computer Engineering/Data Structure (6)
[자료구조] 그래프(Graph)

<그래프(graph)>

선형 자료구조나 트리 자료구조로 표현하기 어려운 多:多의 관계를 가지는 원소들을 표현하기 위한 자료구조
그래프 G
- 객체를 나타내는 정점(vertex)과 객체를 연결하는 간선(edge)의 집합
G = (V, E)
- V는 그래프에 있는 정점들의 집합
- E는 정점을 연결하는 간선들의 집합
그래프사용 예 : 버스노선도, 지하철노선도, 인맥 지도, 길찾기, 최단거리 구하기

 



<그래프의 종류>

1. 무방향 그래프(undirected graph)
두 정점을 연결하는 간선의 방향이 없는 그래프이며, 정점 Vi와 정점 Vj을 연결하는 간선을 (Vi, Vj)로 표현 - (Vi, Vj)와 (Vj, Vi)는 같은 간선을 의미.
V(G1)={A, B, C, D} E(G1)={(A,B), (A,D), (B,C), (B,D), (C,D)}
V(G2)={A, B, C} E(G2)={(A,B), (A,C), (B,C)}


                                    G1                                  G2

                              G3                                    G4




3. 완전 그래프(complete graph)
각 정점에서 다른 모든 정점을 연결하여 가능한 최대의 간선 수를 가진 그래프이다.
정점이 n개인 무방향 그래프에서 최대의 간선 수 : n(n-1)/2개
정점이 n개인 방향 그래프의 최대 간선 수 : n(n-1)개
완전 그래프의 예
- G5는 정점의 개수가 4개인 무방향 그래프이므로 완전 그래프가 되려면 4(4-1)/2=6개의 간선 연결

- G6은 정점의 개수가 4개인 방향 그래프이므로 완전 그래프가 되려면 4(4-1)=12개의 간선 연결


                                G5                                     G6




4. 부분 그래프(subgraph) : G'
원래의 그래프에서 일부의 정점이나 간선을 제외하여 만든 그래프이다.
그래프 G와 부분 그래프 G'의 관계
V(G')⊆V(G), E(G')⊆E(G)
그래프 G1에 대한 부분 그래프의 예



                                 G1                                          G`




5. 가중 그래프(weight graph) , 네트워크(network)
정점을 연결하는 간선에 가중치(weight)를 할당한 그래프


                               G7                                        G8                        




<​그래프 관련 용어>


1. 그래프에서 두 정점 Vi과 Vj를 연결하는 간선 (Vi, Vj)가 있을 때, 두 정점 Vi와 Vj를인접(adjacent)되어 있다고 하고,
2. 간선 (Vi, Vj)는 정점 Vi와 Vj에 부속(incident)되어있다고 한다.

ex) 그래프 G1에서 정점 A와 인접한 정점은 B와 D이고, 정점 A에 부속되어 있는 간선은 (A,B)와 (A,D)이다.


                                                    G1



                                                  G3



3. 차수(degree) – 정점에 부속되어있는 간선의 수
ex) 무방향 그래프 G1에서 정점 A의 차수는 2, 정점 B의 차수는 3
방향 그래프의 정점의 차수 = 진입차수 + 진출차수
- 방향 그래프의 진입차수(in-degree) : 정점을 머리로 하는 간선의 수
- 방향 그래프의 진출차수(out-degree) : 정점을 꼬리로 하는 간선의 수
- 방향 그래프 G3에서 정점 B의 진입차수는 1, 진출차수는 2
정점 B의 전체 차수는 (진입차수 + 진출차수) 이므로 3이 된다.

 

4. 경로(path) - 그래프에서 간선을 따라 갈 수 있는 길을 순서대로 나열한 것 즉, 정점 Vi에서 Vj까지 간선으로 연결된 정점을 순서대로 나열한 리스트
ex) 그래프 G1에서 정점 A에서 정점 C까지의 경로 : A-B-C 경로, A-B-D-C 경로, A-D-C 경로, A-D-B-C 경로

 

5. 경로길이(path length) - 경로를 구성하는 간선의 수

 

6. 단순경로(simple path) - 모두 다른 정점으로 구성된 경로
ex) 그래프 G1에서 정점 A에서 정점 C까지의 경로 A-B-C는 단순경로이고, 경로 A-B-D-A-B-C는 단순경로가 아니다.

 

7. 사이클(cycle) - 단순경로 중에서 경로의 시작 정점과 마지막 정점이 같은 경로
ex) 그래프 G1에서 단순경로 A-B-C-D-A는 사이클이 된다.

 

8. DAG(directed acyclic graph) - 방향 그래프이면서 사이클이 없는 그래프 

 

9. 연결 그래프(connected graph) - 서로 다른 모든 쌍의 정점들 사이에 경로가 있는 그래프 즉, 떨어져있는 정점이 없는 그래프
그래프에서 두 정점 Vi에서 Vj까지의 경로가 있으면 정점 Vi와 Vj가 연결(connected)되었다고 한다. 

 

10. 트리는 사이클이 없는 연결 그래프이다.

 


 

출처 : http://itdexter.tistory.com/84

'Computer Engineering > Data Structure' 카테고리의 다른 글

[자료구조] 트리(Tree)  (0) 2016.02.04
[자료구조] 연결리스트(Linked List)  (0) 2016.02.04
[자료구조] 큐(Queue)  (0) 2016.02.04
[자료구조] 스택(Stack)  (0) 2016.02.03
[자료구조] 개념과 종류  (0) 2016.02.03
  Comments,     Trackbacks
[자료구조] 트리(Tree)

트리는 비선형 자료 구조로 직관적으로 자료 사이의 관계를 나타낸다.


트리와 같은 자료 구조는 계층 구조로 트리를 구성하는 노드가 부모-자식 관계이다.


이러한 구조는 회사 조직도, 컴퓨터 폴더 구조 등 주의에서 쉽게 볼 수 있다.


트리 용어는 다음과 같은 것들이 있다.

- 노드 : 트리의 한 요소, 모델링하려는 시스템의 객체

- 간선 : 간선은 노드 간 부모-자식 관계를 정의함

- 루트 노드 : 최상위 노드

- 서브 트리 : 트리에서 루트 노드를 제거했을 때 생기는 종속 트리

- 부모 노드, 자식 노드 : 이 둘은 서로 연결되어 있음

- 차수 : 어떤 특정 노드의 자식 노드 수

- 단말 노드 : 자식 노드가 없는 노드

- 내부 노드 : 자식 노드가 있는 노드

- 조상 노드 : 루트 노드부터 부모 노드까지의 경로상에 있는 노드

- 후손 노드 : 특정 노드의 아래에 있는 모든 노드

- 레벨 : 루트 노드를 레벨 1이라 하고, 내려가면서 레벨이 오른다.

- 형제 노드 : 같은 부모 노드의 자식 노드

- 높이 또는 깊이 : 트리의 특정 노드의 최대 레벨


이진트리


이진 트리는 모든 노드의 차수가 2 이하인 트리이다.


이진 트리 종류는 다음과 같은 것들이 있다.


- 포화 이진 트리 : 모든 레벨의 노드가 꽉 차있는 이진 트리

 

- 완전 이진 트리 : 마지막 레벨에서 왼쪽에서 오른쪽으로 노드가 채워져 있는 이진 트리

 

- 편항 이진 트리 : 오른쪽 또는 왼쪽 서브트리만 가지는 이진 트리

이진 트리 순회


이진 트리 순회 방법은 전위 순회, 중위 순회, 후위 순회로 나누어 진다.


전위 순회 : 현재 노드 방문 -> 왼쪽 서브 트리 -> 오른쪽 서브 트리


중위 순회 : 왼쪽 서브 트리 -> 현재 노드 방문 -> 오른쪽 서브트리


후위 순화 : 왼쪽 서브 트리 -> 오른쪽 서브 트리 -> 현재 노드 방문


예를 들어 이진 트리가 이렇게 있으면

각각의 순회는 이렇다.

 

[출처] [자료구조] 트리|작성자 03tlqfk

'Computer Engineering > Data Structure' 카테고리의 다른 글

[자료구조] 그래프(Graph)  (0) 2016.02.04
[자료구조] 연결리스트(Linked List)  (0) 2016.02.04
[자료구조] 큐(Queue)  (0) 2016.02.04
[자료구조] 스택(Stack)  (0) 2016.02.03
[자료구조] 개념과 종류  (0) 2016.02.03
  Comments,     Trackbacks
[자료구조] 연결리스트(Linked List)

Linked List

링크를 가진 리스트


List의 의미 : 순서가 있는 구성

가장 쉽게 접할 수 있는 기본적인 List는 배열을 들 수 있습니다.


즉 Linked List는 순차적으로 다른 데이터를 참조할 수 있는 구조로 데이터를 관리합니다.

C언어 / C++ 에서의 자료구조는 데이터와 다음 노드를 가리키는 포인터를 가지지요.




C와 C++의 Linked List 구조

node기반의 리스트로, 각 node는 데이터와 다음 노드의 주소정보를 가집니다.

여러가지 방법으로 구현을 할 수 있으나, 가장 기초적인 형태는 다음과 같습니다.

Linked List의 장단점


장점 

노드의 포인터를 통해서 모든 데이터의 참조가 가능하다.

링크 이동을 통한 유연한 변경이 가능하다.


단점

데이터의 위치를 알아도 바로 접근할 수 없다.

정렬속도가 느리다.

[출처] [자료구조] 연결리스트 ( Linked List)|작성자 HJ

 


1. 단일 연결리스트 기본 구조

헤드로부터 시작해 연속적으로 다음 노드를 가리키며

마지막 노드는 NULL을 가리킵니다.




2. 중간에 새로운 노드 삽입

노드삽입시 기존의 연결이 끊어지지 않도록 순서에 주의해야합니다.

따라서 삽입할 노드가 다음위치의 노드를 가리키게 하고, 

이전위치의 노드가 삽입되는 노드를 가리키게 합니다.




3. 특정 노드 삭제

노드의 삭제 또한 기존의 연결이 끊어지지 않도록 주의해야하며,

삭제대상 노드를 잃어 memory leak이 일어나지 않도록 주의해야합니다.


우선 임시변수로 삭제할 노드를 가리켜서 잃지 않도록하고,

이전 노드가 다음 노드를 가리키도록 합니다.


만일 노드가 포함한 데이터가 동적할당되었다면

이 또한 할당해제를 잊지 않고 우선 할당해제 해주어야 memory leak이 일어나지 않으며


최종적으로 삭제할 노드도 할당해제함으로 마무리 합니다.

'Computer Engineering > Data Structure' 카테고리의 다른 글

[자료구조] 그래프(Graph)  (0) 2016.02.04
[자료구조] 트리(Tree)  (0) 2016.02.04
[자료구조] 큐(Queue)  (0) 2016.02.04
[자료구조] 스택(Stack)  (0) 2016.02.03
[자료구조] 개념과 종류  (0) 2016.02.03
  Comments,     Trackbacks
[자료구조] 큐(Queue)

큐란? 선입선출(First-Input, First-Out FIFO)구조를 가진 자료구조

 

 

 

위 그림처럼 가장 처음에 들어온 것이 가장 먼저 나갑니다. 이 그림을 보셨으면 큐가 어떤 구조인지 이해가 되실 것입니다.

 

그럼 이제 큐의 용어에 대해 좀 더 자세히 알아봅시다!

 

큐의 용어에는

- Front ( Head )

- Rear ( Tail )

- Put ( Insert )

- Get ( Delete )

 

- Queue Underflow

- Queue Overflow

 

- Linear Queue

- Circular Queue

가 있습니다.

 

우선 Front 와 Rear 에 대해서 알아봅시다.

 

Stack에서 Top과 Bottom 과 비슷한 의미입니다. 

 

하지만 Queue에서는 먼저 들어온 데이터를 Front 제일 나중에 들어온 데이터를 Rear 라고 합니다.

 

Queue는 스택과 달리 모양을 다양하게 만들 수 있기 때문에 이 점 잘 알아두시기 바랍니다.

 

 

위 그림은 1 2 3 ... 이런 식으로 숫자 순서대로 입력 된다고 할때의 모습입니다.

 

Front는 데이터들 중 가장 먼저 들어온 데이터를 의미합니다.

Rear는 데이터들 중 가장 마지막에 들어온 데이터를 의미합니다.

 

큐의 경우는 스택과는 다르게 Front와 Rear 모두 값이 변할 수 있습니다. Put이 되면 Rear가 변하구요. Get이 되면 Front가 변하겠죠.

 

그렇다면!! PutGet에 대해서 알아볼까요?

 

Put은 큐의 맨뒤에 데이터를 넣는 것입니다.

 

 

Get은 큐의 맨앞에 데이터를 빼는 것입니다.

 

 

위에서 보신 것처럼 PutGet은 데이터를 추가하거나 제거할 때 사용됩니다. 그로 인해서 FrontRear이 움직이게 되구요. 이 FrontRear이 움직임으로 인해서 큐는 빈 공간을 좀 더 활용적으로 사용할 수 있습니다. 이 것에 대해서는 Queue UnderflowQueue Overflow를 배운 후 알아보도록 하겠습니다.

 

그렇다면 Queue UnderflowQueue Overflow란 무엇이냐!!!

 

큐 언더플로우큐가 비어있을 때 Get을 하는 경우에 발생합니다. 아무 데이터도 없는데 데이터를 달라고 하면 당연히 오류가 나겠죠?

 

큐 오버플로우큐가 꽉차있을 때 Put을 하는 경우에 발생합니다. 큐에 더이상 데이터를 저장할 공간이 없는데 데이터를 넣으려 한다면 데이터 손실이 일어나겠죠?

 

 

 

그럼 이제 아까 설명하려 했던 큐의 공간 활용성에 대해서 설명하도록 하겠습니다. 제가 지금까지 그림으로 설명한 큐는 모두 배열로 만들었을 경우를 가정하고 있습니다. 그렇다면 큐의 크기는 한정되어 있겠죠? 이 상황에서 GetPut을 여러번 해서 다음과 같은 상황이 됬다고 가정해봅시다.

 

 

 

이 상황에서 Put을 하려고 하면 큐는 꽉찬 상황이기 때문에 Queue Overflow가 발생하게 됩니다. 아래에 두 칸의 공간을 확보하고 있는데도 말이죠. 이런 특성을 가진 큐를 Linear Queue라고 합니다. 이런 특성의 큐를 가지고 있다면 Get을 통해 큐를 비우지 않는다면 더 이상 데이터를 Put할 수 없겠죠.

 

 

 

이러한 특성의 단점을 해결하기 위해서 나온 것이 Circular Queue입니다. 

 

 

 

큐를 마치 원처럼 생각하는 것입니다. 어차피 먼저 들어온 데이터는 Front로부터 찾으면 되기 때문에 비어있는 아래 공간에 데이터가 들어오더라도 문제가 없는 것이죠.

 

 

 

물론 큐가 비어있거나 꽉차있다면 Queue UnderflowQueue Overflow는 발생합니다. 하지만 공간의 낭비를 줄이기 때문에 Linear Queue 보다는 Circular Queue가 더 좋은 것입니다.

 

그렇다면 Circular Queue만 설명하면 됬지 왜 Linear Queue까지 설명했을까요? 네 그것은 바로 배열에서 큐를 구현할 때에 한정된 이야기입니다. 링크드 리스트를 이용해서 구현한다면 Circular Queue를 구현하지 않더라도 Linear Queue를 이용해서 공간의 낭비를 줄일 수 있습니다.

 

 

 

큐를 작성할 때 배열을 이용하느냐 링크드 리스트를 이용하느냐 Linear Queue를 이용하느냐 Circular Queue를 이용하느냐는 여러분의 몫입니다^^. 그럼 이 것으로 큐에 대한 강의를 마칩니다.

  Comments,     Trackbacks
[자료구조] 스택(Stack)

스택이란? 후입선출(Last-Input, First-Out LIFO)구조를 가진 자료구조

 



 

 

위 그림처럼 가장 마지막에 들어온 것이 가장 먼저 나갑니다. 이 그림을 보셨으면 스택이 어떤 구조인지는 이해가 되실 것입니다.

 

그럼 이제 스택의 용어에 대해 좀 더 자세히 알아봅시다!

 

스택의 용어에는

- Top

- Bottom

- Push

- Pop

- Peek


- Stack Underflow

- Stack Overflow

 

가 있습니다.

 

우선 TopBottom을 이해해봅시다!

 

영어단어를 해석해보면 다들 금방 이해하실 수 있으실 겁니다.

 

 

 

Top은 말그대로 스택의 맨 위를 의미합니다.

Bottom스택의 바닥을 의미하구요.

 

스택의 Top은 연산에 의해서 바뀔 수 있습니다. 하지만 바닥을 가르키고 있는 Bottom은 바뀌지 않습니다. 아래 그림처럼 말이죠.

 

 

 

이제 Push Pop Peek에 대해서 알아봅시다.

 

Push스택에 데이터를 넣는 것을 의미합니다.

 

 

 

보시다 시피 Push를 하면 Top이 하나 증가하고 데이터가 하나 추가됩니다.

 

이제 Pop에 대해 알아봅시다!

 

Pop스택에서 데이터를 하나 빼는 것을 의미합니다.

 

 

 

Pop은 보시다시피 Top이 하나 감소하고 데이터가 하나 감소합니다.

 

Peek는 스택에서 Top의 위치에 있는 데이터를 확인하는 것을 의미합니다.

Pop과 다르게 Top이나 데이터의 개수가 감소하지 않습니다!

 

이제 스택 언더플로우와 오버플로우에 대해 알아봅시다!

 

스택 언더플로우스택이 비어있을 때 Pop을 하는 경우에 발생합니다. 그 이유는 더이상 감소시킬 데이터가 없는데 감소시키려 하기 때문입니다.

 

이와 반대로 스택 오버플로우스택이 꽉차있을 때 Push를 하는 경우에 발생합니다. 그 이유는 더 이상 데이터가 추가될 공간이 없는데 추가를 하려했기 때문이죠.

 

 

 

 

이 것으로 스택에 대한 강의를 마칩니다.

 

'Computer Engineering > Data Structure' 카테고리의 다른 글

[자료구조] 그래프(Graph)  (0) 2016.02.04
[자료구조] 트리(Tree)  (0) 2016.02.04
[자료구조] 연결리스트(Linked List)  (0) 2016.02.04
[자료구조] 큐(Queue)  (0) 2016.02.04
[자료구조] 개념과 종류  (0) 2016.02.03
  Comments,     Trackbacks
[자료구조] 개념과 종류

자료구조 정의

데이터를 효율적으로 다루기 위해 데이터를 저장하는 방법

 


 

자료구조의 알고리즘 선택

일반적으로 자료구조가 선택되면 어떤 알고리즘을 적용할지 상대적으로 명확해짐

반대로 특정 연산에는 특정 알고리즘이 필요하고 큰 시너지 성능을 발휘할 때 자료구조를 역선택하게 됨

 


 

자료구조의 단위와 종류

자료구조의 기초 단위

행렬, 레코드, 유니온, 참조

 

자료구조의 분류

자료형에 따른 분류

- 단순 구조 : 정수, 실수, 문자, 문자열

- 선형 구조 : 1:1의 자료간 관계

- 비선형 구조 : 1:N 또는 N:M의 자료간 관계

- 파일 구조 : 순차 파일, 색인 파일, 직접 파일

 

구현에 따른 분류

- 배열(Array) : 가장 일반적이며 메모리 상 같은 타입의 자료가 연속적으로 저장 관리

- 튜플(Tuple) : 둘 이상의 자료형을 묶음으로 저장 관리

- 연결 리스트(Linked List) : 노드를 단위로 다음 노드를 가리키는 포인터로 구성

- 원형 연결 리스트(Circular Linked List) : 연결 리스트에서 마지막 노드가 처음 노드를 포인터

- 이중 연결 리스트(Double Linked List) : 각 노드는 이전, 다음 노드를 포인터

- 원형 이중 연결 리스트(Circular Double Linked List) : 이중 연결 리스트에서 처음 노드는 마지막 노드를 포인터, 마지막 노드는 처음 노드를 포인터

 

형태에 따른 분류

선형 자료구조

- 스택(Stack) : LIFO 구조 / PUSH, POP, TOP

- 큐(Queue) : FIFO 구조 / PUT, GET, FRONT, REAR

- 덱(Dequeue) : 큐에서 입구가 양쪽으로 존재

- 리스트(List) : 포인터가 서로 연결되어있음

 

비선형 자료구조 

- 트리(Tree) : 뿌리 노드인 부모를 바탕으로 자식들을 가지는 부모-자식 관계를 가짐

- 그래프(Graph) : 정점과 정점을 잇는 간선으로 데이터를 가짐

- 이진 트리(Binary Tree) : 자식 노드가 최대 두개인 트리

- 힙(Heap) : 이진 트리에 어떤 특성을 부여해 데이터를 저장 관리

 

정렬 동작에 따른 분류

- 안전한 정렬(Stable Sorting) : 정렬시 같은 값이 존재할 때 같은 순서로만 정렬

- 안전하지 않은 정렬(Unstable Sorting) : 정렬시 같은 값이 존재할 때 섞일 수 있게 정렬

 


 

출처 : http://blog.naver.com/vsky712/220558365502

'Computer Engineering > Data Structure' 카테고리의 다른 글

[자료구조] 그래프(Graph)  (0) 2016.02.04
[자료구조] 트리(Tree)  (0) 2016.02.04
[자료구조] 연결리스트(Linked List)  (0) 2016.02.04
[자료구조] 큐(Queue)  (0) 2016.02.04
[자료구조] 스택(Stack)  (0) 2016.02.03
  Comments,     Trackbacks