알고리즘의 수행 시간(기초 사항)

dev Apr 12, 2018

알고리즘의 수행 시간은 입력의 크기에 대해 시간이 어떤 비율로 소요 되는지로 표현한다.

sample1

sample1(A[], n)
{
    k = ⌊n/2⌋;
    return A[k];
}

n/2를 계산하는 것과 A[⌊n/2⌋]값을 리턴한다. 입력 배열의 크기 n에 상관없이 일정한 시간(상수 시간)이 소요된다.

sample2

sample2(A[], n)
{ 
    sum <- 1 to n
        for i <- 1 to n
            sum <- sum + A[i]
        return sum;
}

for 루프를 제외한 나머지 부분은 상수시간이 소요되므로 for 루프가 시간을 지배한다. for 루프는 n번 반복되고 각 루프에서는 단순한 덧셈만 하므로 상수 시간이 소요되어 for 루프 관련 수행 시간은 n에 비례한다. 따라서 알고리즘 수행 시간은 n에 비례한다.

sample3

sample3(A[], n)
{
    sum <- 0;
    for i <- 1 to n
        for j <- 1 to n
            sum <- sum + A[i] * A[j];
    return sum;
}

배열 A의 모든 원소 쌍을 곱한 합을 구하는 알고리즘이다. for 루프가 n x n = n^2 번 반복되고 각 루프에서는 덧셈 한 번과 곱셈 한 번, 즉 상수 시간 작업이 수행된다. 그러므로 알고리즘의 총 수행 시간은 n^2에 비례한다.

sample4

sample4(A[],n)
{
    sum <- 0;
    for <- 1 to n
        for j <- 1 to n {
           1) k <- A[1...n]에서 임의로 ⌊n/2⌋개를 뽑을 때 이들 중 최댓값; 
            sum <- sum + k;
        }
    return sum;
}

for 루프를 n^2번 반복하면서 매번 배열에서 반을 임의로 뽑아 그 중 최댓값을 계속 더하는 알고리즘이다. 크기가 n인 배열에서 ⌊n/2⌋개를 뽑으면서 이들 중 최댓값을 구하는 것은 n/2에 비례하는 시간이 든다. 이것은 n에 비례하는 시간이다. 즉 1)을 수행하는 데 n에 비례하는 시간이 든다. 전체적으로 for 루프의 반복 횟수와 1)의 수행 시간이 시간을 좌우하므로 총 수행시간은 n^2 x n = n^3에 비례한다.

sample5

sample5(A[],n)
{
    sum <- 0;
    for <- 1 to n-1
        for j <- i+1 to n {
            sum <- sum + A[i] * A[j];
        }
    return sum;
}

배열 A에서 i < j인 모든 원소 쌍을 곱을 합산하는 알고리즘이다. for 루프의 총 반복 횟수는 (n-1)+(n-2)+y+2+1 = n(n-1)/2 이 되어 n^2에 비례한다.

sample6

factorial(n)
{
    if(n=1) return 1;
    return n * factorial(n-1);
}

재귀적으로 계속 호출되는 경우에는 함수 factorial()이 총 몇 번 호출되는지가 시간을 좌우한다. factorial()의 총 호출 횟수는 n이다.

cherrypick

체리픽이라는 단어 본연의 뜻은 안 좋은 의미이지만 저는 트렌디하고 많은 기술을 공부하고 내 거로 만들자는 뜻을 가지고 사용하고 있습니다.