본문 바로가기
Computer Science/Data Structure

[자료구조] 2장 자료구조 소개

by na1-4an 2023. 10. 15.

2-1 자료구조

1. 자료구조

: 컴퓨터에서 자료를 정리하고 조직화하는 다양한 구조

2. 추상화?

: 어떤 시스템의 간략화 된 기술 또는 명세. 시스템의 핵심적인 구조나 동작에만 집중.

3. 자료형?

: 데이터의 집합연산의 집합.

4. 추상 자료형(ADT: abstract data type)

: 데이터 타입을 추상적으로 정의한 것.

  - 데이터나 연산이 무엇(what)인가를 정의.

  - 데이터나 연산을 어떻게(how) 구현할 것인지는 정의하지 않음

예. 자연수 추상 자료형

  ▶ 추상 자료형을 프로그래밍 언어로 구현한 것이 자료구조!!

       - 추상 자료형의 데이터: 구조체 사용

       - 추상 자료형의 연산: 함수 사용

2-2 알고리즘

1. 알고리즘

: 컴퓨터로 문제를 풀기위한 단계적인 절차.

  ▶ 알고리즘 + 자료구조 = 프로그램

2. 알고리즘의 조건(5)

  • 입력: 0개 이상의 입력이 존재해야 함.
  • 출력: 1개 이상의출력이 존재해야 함.
  • 명백성: 각 명령어의 의미는명확해야 햠.
  • 유한성: 한정된 수의 단계 후에는 반드시 종료되어야 함.
  • 유효성: 각 명령어들은 실행 가능한 연산이어야함.

3. 알고리즘 표현 방법(4)

  - 자연어: 가독성 굳. 단어들이 정확히 정의되어 있지 않으면 전달이 모호해짐.

  - 흐름도(flow chart): 직관적임. 복잡한 알고리즘의경우 복잡해짐.

  - 유사 코드(pseudo-code): 알고리즘의 고수준 기술 방법. 자연어와 프로그래밍 언어 사이의 표현.

                                       가장 많이 사용. 알고리즘의 핵심적인 내용에만 집중하기좋음.

  - 특정한 프로그래밍 언어(c언어, java): 가장  정확한 알고리즘.

                                                   많은구체적인 사항들이 알고리즘 핵심 내용을 방해할 수도 있음.

2-3 성능 평가

1. 실행 시간 측정 방법

  • 두 개의 알고리즘 실제 실행 시간을 측정하는 것
  • 실제 구현 필요
  • 동일한 하드웨어 사용

  - clock 함수 사용: 호출되을 때의 시각 반환. CLOCK_PER_SEC 단위.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(void)
{
    clock_t start, finish
    double duration
    // 실행 시간을 측정하고자하는 코드
    // '''
    finish = clock();
    duration = (double)(finish - start)
    printf("%f 초입니다.\n", duration)
}

2. 알고리즘 복잡도 분석 방법

  • 직접 구현하지 않고 수행 시간을 분석하는 것
  • 알고리즘이 수행하는 연산 회수 비교
  • 일반적으로 연사의 횟수는 n 함수.

  - 종류(2): 시간 복잡도 분석(수행 시간 분석)/공간 복잡도 분석(수행 시 필요로 하는 메모리 공간 분석)

3. 시간 복잡도

: 입력 개수 n에 대한 함수. T(n).

 - 고려하는 연산: 산술, 대입, 비교, 이동, 반환

ArrayMax(A, n)
	tmp <- A[0];				// 1번의 대입 연산
    for i<-1 to n-1 do			// 루프 제어 연산은 제외
    	if tmp < A[i] then		// n-1번의 비교 연산
        	tmp <- A[i];		// n-1번의 대입 연산(최대)
    return rmp;					// 1번의 반환 연산
    
    // 1 + n-1 + n-1 + 1 = 2n
    // 최대 총 연산 수는 2n번 이다.

● 빅오 표기법

  : 차수가 가장 큰 항이 가장 영향을 크게 미치고, 다른 항들은 상대적으로 무시됨.

이러한 경우 O(n^2)로 나타냄.

   - 빅오 표기법의 정의:

두 개의 함수 f(n)과 g(n)이 주어졌을 떄, 모든 n >= n0에 대하여 |f(n)| <= c|g(n)|을 만족하는 2개의 상수 c와 n0가 존재하면 f(n) = O(g(n))이다.

  - 빅오 표기법 예시

    - f(n) = 5 → O(1)

    - f(n) = 2n + 1  → O(n)

    - f(n) = 3n^2 +100    O(n^2)

    - f(n) = 2^n   O(2^n)

4. 최선, 평균, 최악의 경우

: 실행 시간은 입력에 따라 다를 수 있음.

  - 최선의 경우: 수행 시간이 가장 빠름. 의미 없는 경우가 많음.

  - 평균의 경우: 수행 시간이 평균적임. 계산하기 상당히 어려움

  - 최악의 경우: 수행 시간이 가장 늦음. 가장 널리 사용됨. 계산도 쉽고, 응용에 따라 중요한 의미를 가짐.

int sequentialSearch(int list[], int n, int key){
	for(int i=0; i<n ; i++)
    	// 탐색에 성공하면 키 값의 인덱스 반환
        if(list[i]==key) return i;
    retrun-1;	// 탐색에 실패하면 -1반환
}

  + 최선의 경우: O(1)

  + 평균의 경우: (1+2+...+n)/n = (n+1)/2 = O(n)

  + 최악의 경우: O(n)

 

 

💡이번 장에서 기억할 점
  1. 자료구조는 추상화 자료형(ADT)를 구현한 것이다.
  2. 연산의 횟수를 셀 때 가장 중요시해야하는 것은 입력의 개수이다. 이는 함수의 형태로, 최고차항이 빅오 표현법으로 표현된다.

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

[자료구조] 8장 BST  (0) 2023.12.16
[자료구조] 4장 스택  (0) 2023.10.16
[자료구조] 3장 Linked List  (0) 2023.10.15
[자료구조] 1장 C언어 리뷰 (2)  (0) 2023.09.10
[자료구조] 1장 C언어 리뷰 (1)  (0) 2023.09.10