사이드바 열기

'알고리즘'에 해당되는 글 3건

알고리즘 수업시간에 전북대학교 알고리즘 분할정복  이라는 목표로 조별 프로젝트를 진행하고 있습니다.

처음에는 여기에 들어갈 알고리즘에 대한 이해를 돕기 위한 프로그램을 네이티브 언어로 작성할려고 하였으나,

시간도 없고 해서 C#으로 뚝딱뚝딱 만들려고 했지요.

그런데 저번 조별시간에 웹으로 다른조가 그래프랑 그려오니까 교수님께서 아주 좋아하시더라구요.

이런..

웹으로 구현해야겠네요.

뭐 요즘은 왠만한건 다 구현된다고 하니 열심히 공부해서 내 홈페이지 운영할 정도는 되어야겠습니다.

워낙 나X 나 드XX버 같은 툴들이.. 소스코드가 지저분해서 하드코딩이 진리라는 웹을 말이죠
Posted by LaLuna

Analysis of Algorithm

Empirical analysis(경험적 분석)     : 알고리즘을 프로그래밍 언어로 구현을 한 뒤, 이를 실행시켜 실시간을 비교해 보는 것

Mathematical analysis(수학적 분석) : 알고리즘을 프로그래밍 언어로 구현하지 않고, 단지 알고리즘 자체만으로 수학적 분석을 하는 것

 

Best case and Worst case

Bast case  : 가장 작은 시간과 공간을 필요로 하는 경우

Worst case : 가장 많은 시간과 공간을 필요로 하는 경우

- 어떠한 알고리즘의 일반적인 경우 다른 알고리즘에 비해 매우 성능이 뛰어나나 최악의 경우에 많은 시간과 공간을 필요로 할 수 있는 현상이 있고, 어떤 알고리즘의 일반적인 경우는 다른 알고리즘에 비해 성능은 떨어지나 최악의 경우에도 일반적인 경우와 별 차이가 없는 현상이 있다.

- 최악의 경우는 알고리즘의 성능을 표현하는데 많이 쓰인다. 알고리즘의 속도를 표현할 때, 아무리 많은 시간과 공간이 필요한다 해도 최악의 경우를 넘지 않는다는 것을 보증할 때 쓰인다.

 

평균적 경우라는 개념도 존재하는데, 평균적인 경우를 사용하는 데에는 몇 가지의 문제점이 있다.

1. 평균적인 경우 자체가 수학적으로 매우 어려운 개념이라 확정짓기가 어렵다.

2. 평균적인 경우가 실제의 상황과 같지 않다는 점이다.

 

● 알고리즘의 분석의 단계

1. 알고리즘을 판단할 수 있는 입력자료 결정
2.
알고리즘을 구성하는 동작들을 추상적이고 기본적인 동작들로 분해하여 동작들의 수행시간을 계산
3.
수학적인 알고리즘 분석


 

알고리즘의 유형

 

알고리즘의 분석 결과는 입력되는 자료의 수 N에 대한 수행시간을 함수 관계로 표현

★ 1

입력자료 수에 관계없이 일정한 실행시간을 갖는 알고리즘

★ log N

입력자료 수에 따라 실행시간이 조금씩 늘어남. 주로 커다란 문제를 일정한 크기를 갖는 작은 문문제 쪼갤 때 나타는 유형

★ N

입력 자료수에 따라 선형적으로 실행시간이 걸리는 경우.

★ N log N

커다란 문제를 독립적인 작은 문제로 쪼개어 각각 해결하고 나중에 다시 하나로 합치는 경우.

★ N2

이중 루프 내에서 입력자료를 처리하는 경우.

★ N3

삼중 루프 내에서 입력자료를 처리하는 경우.

★ 2N

 입력자료의 수가 늘어남에 따라 급격한 실행시간의 증가.

 

사용자 삽입 이미지

 

Posted by LaLuna
//
//      EUCLID1.C : Implementation of Euclid's Algorithm
//
//                      Programmed By Clipper
//  Copyright ⓒ 2007 LaLuna All Rights Reserved.
//

#include <stdio.h>
#include "timer.h"

int get_gcd(int u, int v);          //뻴셈만을 이용한 유클리드 : 최대공약수
int gcd_modulus(int u, int v);      //나머지연산을 이용한 유클리드 : 최대공약수
int gcd_recursion(int u, int v);    //재귀호출을 이용한 유클리드 : 최대공약수

#define LOOF 10000000               //함수의 성능 테스트를 위한 반복 횟수

int main(int argc, char *argv[])
{
    int u, v, temp;
    clock_t t1, t2;                 //함수 측정시간을 정하기 위한 변수
    float result1 = 0, result2 = 0, result3 = 0;//함수 측정시간을 저장하기 위한 변수
    int i;
    
    puts("\n EUCLID1 : 두 양수의 최대 공약수 찾기 ");
    puts("\n           0을 입력하면 종료");
    
    while(1)
    {
        puts("\n\n 두 양수를 입력하세요 -> ");
        scanf("%d %d", &u, &v);
        
        if(u < 0 || v < 0)//음수의 입력은 무효로 한다.
        {
            puts("음수를 입력하셨습니다. 양수를 입력하세요\n");
            continue;
        }
        if(u == 0 || v == 0)//0이 입력되면 종료한다.
        {
            puts("0을 입력하셨습니다. 프로그램을 종료하겠습니다.\n");
            break;
        }
        t1 = clock();
        for(i=0;i<LOOF;i++)
        {
            temp = get_gcd(u,v);
        }
        t2 = clock();
        result1 = diff_clock(t1,t2);//빼기, 교환 함수 시간 측정
        t1 = clock();
        for(i=0;i<:LOOF;i++)
        {
            temp = gcd_modulus(u,v);
        }
        t2 = clock();
        result2 = diff_clock(t1,t2);//나머지 함수 시간 측정

        t1 = clock();
        for(i=0;i<LOOF;i++)
        {
            temp = gcd_recursion(u,v);
        }
        t2 = clock();
        result3 = diff_clock(t1,t2);//재귀호출 시간측정
                
        printf("두 양수 %d와 %d의 최대 공약수는 %d입니다.(뺄셈과 교환)\n", u, v, get_gcd(u,v));
        printf("두 양수 %d와 %d의 최대 공약수는 %d입니다.(나머지연산)\n", u, v, gcd_modulus(u,v));
        printf("두 양수 %d와 %d의 최대 공약수는 %d입니다.(재귀호출)\n", u, v, gcd_recursion(u,v));
        printf("빼기연산 : %5.2f 나머지 연산 : %5.2f 재귀호출 연산 : %5.2f", result1, result2, result3);
    }
    system("pause");
    return 0;
}

int get_gcd(int u, int v)
{
    int temp;
    while(u)//u가 0이면 v를 리턴, 아니면 루프를 돈다.
    {
        if(u < v)//u가 v보다 작으면 교환한다.
        {
            temp = u;
            u = v;
            v = temp;
        }
        u = u - v;
    }
    return v;
}

int gcd_modulus(int u, int v)
{
    int t;
    while(v)//v가 0이면 u를 리턴, 아니면 루프를 돈다.
    {
        t = u % v;
        u = v;
        v = t;
    }
    
    return u;
}
   
int gcd_recursion(int u, int v)
{
    if(v == 0)
    {
        return u;
    }
    else
    {
        return gcd_recursion(v, u%v);//재귀호출을 이용하여 나머지 연산
    }
}

Posted by LaLuna
이전페이지 1 다음페이지
위로

사이드바 열기