[perl] 알고리즘 패러다임

알고리즘은 문제를 해결하는 절차를 기술한 것입니다. 알고리즘은 다양한 패러다임을 사용하여 문제를 해결할 수 있습니다. 여기서는 몇 가지 주요한 알고리즘 패러다임에 대해 살펴보겠습니다.

목차

동적 프로그래밍

동적 프로그래밍은 하위 문제의 해답을 저장하고 재활용하여 문제를 해결하는 알고리즘 기법이다. 반복적으로 같은 하위 문제를 풀어야 할 때 효율적이며, 최적 부분 구조를 갖는 문제에 적합하다.

sub fib {
    my ($n) = @_;
    if ($n <= 1) {
        return $n;
    }
    my @dp = (0, 1);
    for my $i (2 .. $n) {
        $dp[$i] = $dp[$i-1] + $dp[$i-2];
    }
    return $dp[$n];
}

자세한 내용은 다음 참조를 확인하세요 동적 프로그래밍.

분할 정복

분할 정복은 문제를 일부분으로 나눠서 각각 해결한 뒤, 그 결과를 합쳐 전체 문제의 답을 얻는 알고리즘 기법이다. 주로 재귀 함수를 사용하여 구현한다.

sub merge_sort {
    my @list = @_;
    return @list if @list <= 1;

    my $middle = int(@list / 2);
    my @left = merge_sort(@list[0 .. $middle - 1]);
    my @right = merge_sort(@list[$middle .. $#list]);
    my @sorted = merge(\@left, \@right);
    return @sorted;
}

자세한 내용은 다음 참조를 확인하세요 분할 정복.

탐욕 알고리즘

탐욕 알고리즘은 각 단계에서 가장 좋은 선택을 하는 알고리즘 기법이다. 각 선택은 지역 최적이지만 최종 해결책이 전반적으로 최적이라는 보장이 없다.

sub knapsack {
    my ($capacity, $weights, $values) = @_;
    my $n = @$weights;
    my $result = 0;
    for my $i (0 .. $n-1) {
        if ($weights->[$i] <= $capacity) {
            $capacity -= $weights->[$i];
            $result += $values->[$i];
        }
    }
    return $result;
}

자세한 내용은 다음 참조를 확인하세요 탐욕 알고리즘.

그리디 알고리즘

그리디 알고리즘은 탐욕 알고리즘의 한 종류로, 각 단계에서 가장 좋은 선택을 하는 것이 전체적으로도 최적해를 구할 수 있는 알고리즘 기법이다. 탐욕 알고리즘과 비슷하지만 전체적으로 최적해를 보장한다.

sub activitySelection {
    my ($start, $finish) = @_;
    my $n = @$start;
    my $i = 0;
    my $result = 1;
    for (my $j = 1; $j < $n; $j++) {
        if ($start->[$j] >= $finish->[$i]) {
            $result++;
            $i = $j;
        }
    }
    return $result;
}

자세한 내용은 다음 참조를 확인하세요 그리디 알고리즘.