tony9402

2. 시간복잡도와 공간복잡도 (1) 본문

알고리즘/공부

2. 시간복잡도와 공간복잡도 (1)

ssu_gongdoli 2018. 8. 26. 16:21
반응형

성능 분석과 측정


프로그램의 평가 기준

    - 우리가 원하는 작업을 하는가?

    - 원래 작업의 명세에 부합해서 정확히 작동하는가?

    - 문서화가 되어 있는가?

    - 논리적 작업 단위를 수행하는 기준으로 함수가 생성되었는가?

    - 코드가 읽기 쉬운가?


성능 평가(performance evaluation)

    - 성능 분석(performance analysis) => 사전 예측

    - 성능 측정(performance measurement) => 이후 검사



공간 복잡도


공간복잡도

    - 프로그램을 실행 시켜 완료하는 데 필요한 메모리 양

    - 고정 부분 => 보통 명령어 공간, 단순 변수, 집합체, 상수를 위한 공간

    - 가변 부분 => 특정 문제의 인스턴스에 따라 크기가 달라지는 변수, 순환 스택 공간

    - 프로그램 P의 공간 유고 S(P) = c + Sp (c : 상수, Sp : 인스턴스 특성)



ex 1)


1
2
3
4
5
float Abc(float a, float b, float c)
{
    return a+b+b*c+(a+b-c)/(a+b)+4.0;
}
 

cs


  => Sp = 0


ex 2)


1
2
3
4
5
6
7
8
inline float Sum(float *a, const int n)
{
   float s = 0;
   for(int i = 0 ; i < n ; i++)
      s+= a[i];
   return s;
}
 

cs


  => Sp(n) = 0



ex 3)


1
2
3
4
5
6
inline float Rsum(float *a, const int n)
{
   if(n<=0return 0;
   else return(Rsum(a, n-1+ a[n-1]);
}
 

cs


    - Rsum을 호출할 때마다 적어도 네 개의 워드 필요

      (n과 a값, 반환 값, 반환 주소에 필요한 공간 포함)

    - 순환 깊이가 n+1이므로 순환 스택 공간에 4(n+1)




시간 복잡도


시간 복잡도

    - 프로그램을 완전히 실행시키는데 필요한 시간

    - T(P) = 컴파일 시간 + 실행시간 (tp(인스턴스 특성))

    - tP(n) = caADD(n)+csSUB(n)+cmMUL(n)+cdDIV(n) + …

        => n : 인스턴스 특성

        => Ca, Cs, Cm, Cd : +, -, x, / 연산을 위한 상수 시간

             => ADD, SUB, MUL, DIV : 특성 n인 인스턴스에서 각 연산의 실행 횟수


프로그램 단계 수

    - 주석 : 0

    - 선언문 : 0

        => 변수, 상수 정의(int, long, short, char, ... )

        => 사용자 데이터 타입 정의(class, struct, union, template)

        => 접근 결정(private, public, protected, friend)

        => 함수 타입 결정(void, virtual)

    - 산술식 및 지정문 : 1

    - 스위치 명령문

        => switch(<expr>)의 비용 = <expr>의 비용

        => 각 조건의 비용 = 자기의 비용 + 앞서 나온 모든 조건의 비용

    - if~else 문

        => <expr>, <statement1>, <statement2>에 따라 각각 단계수가 할당

    - 함수 호출

        => 값에 의한 전달 인자 포함하지 않을 경우 : 1

        => 값에 인한 전달 인자 포함할 경우 : 값 인자 크기의 합

        => 순환적인 경우 : 호출되는 함수의 지역 변수도 고려

    - 메모리 관리 명령문 : 1(new, delete)

    - 함수 명령문(function statements) : 0

        => 비용이 이미 호출문에 해당

    - 분기 명령문 : 1(continue, break, goto, return)

    


ex1)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float Sum(float *a, const int n)
{
    float s = 0;
    count++;
    for(int i=0;i<n;i++)
    {
        count++;
        s += a[i];
        count++;
    }
    count++;
    count++;
    return s;
}    
 

cs

1
2
3
4
5
6
7
8
9
void Sum (float *a, const int n)
{
    for(int i=0;i<n;i++)
    {
        count+=2;
    }
    count+=3;
}
 

cs


    => 2n + 3



ex2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float Rsum(float *a, const int n)
{
    count++;
    if(n <= 0)
    {
        count++;
        return 0;
    }
    else
    {
        count++;
        return (Rsum(a,n-1+ a[n-1]);
    }
}
 

cs

  ==
  => 2n + 2

ex3)


1
2
3
4
5
6
7
void Add(int **a, int **b, int **c, int m, int n)
{
    for(int i=0;i&lt;m;i++)
        for(int j=0;j&lt;n;j++)
            c[i][j] = a[i][j] + b[i][j];
}
 

cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Add(int **a, int **b, int **c, int m, int n)
{
    for(int i=0;i<m;i++)
    {
        count++;
        for(int j=0;j<n;j++)
        {
            count++;
            c[i][j] = a[i][j] + b[i][j];
            count++;
        }
        count++;
    }
    count++;
}                                
 

cs


1
2
3
4
5
6
7
8
9
10
11
void Add(int **a, int **b, int **c, int m, int n)
{
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
            count+=2;
        count+=2;
    }
    count++;
}
 

cs


   => 2mn + 2m + 1



단계 수 테이블


명령문의 실행당 단계 수(s/e : step per execution) 결정

    - s/e : 그 명령문의 실행 결과로 count가 변화하는 양


명령문이 실행되는 총 횟수 계산


1
2
3
4
5
6
7
8
float Sum(float * a, const int n)
{
   float s = 0;
   for(int i = 0 ; i < n ; i++)
      s+= a[i];
   return s;
}
 

cs







반응형

'알고리즘 > 공부' 카테고리의 다른 글

2. Search algorithm  (0) 2018.09.16
1. 알고리즘이란  (0) 2018.09.16
1. 자료구조 기본 개념  (0) 2018.08.26
BFS/DFS 공부 메모  (0) 2018.08.09
STL 기초  (0) 2018.08.08
Comments