자료구조&알고리즘

자료구조와 알고리즘

CalebHong 2022. 2. 11. 12:07

* 자료구조와 알고리즘의 관계는 의존적

 

메모리 할당

1. 메모리 할당의 개념

 - 기본적 예제

  • 연속적(Contiguous) : 배열
  • 연결적(Linked) : 연결 리스트

2. 연속적 할당

 - 하나의 배열로서 단일 연속적인 메모리 공간에 n객체가 저장됨

 - 더 많은 메모리가 필요할 때에는 새로 메모리 공간을 요구하고 할당 받고, 이전 메모리의 모든 정보를 새 메모리에 복사해야 함.

 - 일반적으로 OS에게 추가로 연속된 n객체의 공간할당을 받을 수 없음

ex) ABCD

 

3. 연결적 할당

 - 두 데이터를 연결적으로 저장할 수 있도록 할당

 - 객체 자기 자신 그리고 자신과 연결되어 있는 다음 아이템에 대한 참조로 구성

 - C++ 객체에서의 노드란 다음 노드의 주소(Pointer)를 지칭함

ex) A→B→C→D

 

 - 구현(Sescribing)

template <typename Type>
class Node
{
    private:
        Type element;
        Node *next_node;
    public:
    // ...
};

 - 필수적 연산 방법

  [새로운 노드의 생성]

  [노드의 값을 읽음]

  [다음 포인터를 가져옴]

 - 필수 항목

 1) 연결 리스트는 반드시 첫 번째 객체를 가리키는 객체가 필요함

 2) 실제로 연결 리스트 클래스는 머리(head)와 꼬리(tail), 두 포인터를 반드시 가지고 있어야 함

 3) 선택적으로 노드의 개수(int count)를 가질 수 있다.

 4) Next_node의 마지막 노드는 nullptr(널 포인트)로 저장

 - 클래스의 구현

template <typename Type>
class List
{
	private:
        Node<Type> *head;
        Node<Type> *tail;
        int count;
    public:
    	// constructor(s)...
        // accessor(s)...
        // mutator(s)...
};

 

4. 색인적 할당

 - NULL을 포함하여 포인터의 배열이 할당된 메모리 공간을 가리킴

 - C++ STL에서 사용

 - 행렬로 표현할 수 있음

 - 특징: 대부분 행렬은 단일로 연속된 메모리 공간을 가리키는 색인을 사용하여 구현할 수있음

 

다른 할당 형식

1. 다른 할당 형식의 예

 - 그 외 다른 할당 형식 혹은 혼합된 형식

2. 트리(Tree)

 - 연결 리스트는 선형적으로 정렬된 데이터에 이용할 수 있음

 - 트리의 뿌리는 연결 리스트와 유사하지만 여러 개의 다음 포인트를 가짐

 - 특징

  1) 각 노드는 임의의 개수의 다음 노드를 가리킨다.

  2) 계층적 데이터의 저장에 유용하다.

  3) 정렬된 데이터의 저장에 유용하다.

  4) 보통의 경우 다음 노드의 개수를 두 개 이하로 제한한다.

 

3. 그래프(Graph)

 - 노드와 엣지로 구성이 된다.

 

4. 배열(Array)

 - 한 컨테이너에서 두 객체 간의 임의의 관계를 허용한다고 가정했을 때,
   - 이를 2차 배열을 이용하여 표현할 수 있다.

   - 이 때 이 행렬은 대칭행렬이다.

5. 연결 리스트의 배열(Array of Linked Lists)

 - 한 컨테이너에서 두 객체 간의 임의의 관계를 허용한다고 가정했을 때,

   - 다른 방법으로 배열과 연결 리스트의 혼합 형식을 사용할 수 있다.

6. 연결 배열(Linked Array)

 - 다른 혼합 형식의 배열의 연결 리스트가 있음

 - 이는 C++ STL의 Dequeue 컨테이너로 사용됨

 - 연결 배열의 예

  * 영문자를 다음 중 하나로 저장

   1) 26개 문자의 배열 혹은

   2) 8개 문자의 배열의 연결 리스트

7 혼합 구조(Hybrid Structure)

 - Unix의 Inode는 대용량의 파일 정보를 저장하는데 사용되었다.

 - 다음 개체는 다음 1024 블록을 저장할 수 있는 배열을 참조한다.

 - 32-bit 컴퓨터에서 최대 4MB 용량의 파일을 저장한다.

  - 마지막 개체는 3단계의 최대 4TB 용량의 파일을 위한 간접참조로 쓰인다.

알고리즘의 효율성

1. 개요

 - 실행 시간 효율

 * 객체와 객체를 저장할 수 있는 자료구조가 정해지면 알고리즘으로서 다음과 같은 연산들이 필요함

   [클래스로서의 추상 데이터 형]

   [자료구조는 멤버 변수들로 정의]

   [멤버 함수로 알고리즘을 구현]

 

Q) 알고리즘의 효율성을 어떻게 정의하는가?

- 연산 효율표

 * 다음과 같은 행렬로 구조 내 공간의 연산을 묘사

 * 정렬된 배열에 대한 효율표

# 탐색은 괜찮지만 삽입과 삭제는 비효율적

 

 * 정렬이 되지 않은 배열에 대한 효율표

# 탐색이 비효율적으로 변함

 

 * K번째 객체에 포인터를 갖고 있다면 임의의 위치에서 삽입과 삭제는 매우 효율적

 * 이중 연결 리스트에서는 한 연산만이 보다 효율적

# 탐색의 이중적 방향

# 따라서 값이 비싸진다.

'자료구조&알고리즘' 카테고리의 다른 글

선형 리스트(Lenear List) 개요  (0) 2022.02.14
알고리즘 분석  (0) 2022.02.11
추상 데이터형  (0) 2022.02.10
수학적 귀납법  (0) 2022.02.10
자료구조를 위한 수학  (0) 2022.02.09