Open kmh5038 opened 7 months ago
정렬 알고리즘이란 주어진 데이터를 특정한 기준에 따라 순서대로 나열하는 알고리즘
입니다. 정렬 알고리즘은 여러가지 종류의 알고리즘이 있는데 각각 시간복잡도와 공간복잡도가 다르다.
위에서 언급한 시간 복잡도와 공간복잡도
는 정렬 알고리즘에서 반드시 알아야하는 개념입니다.
우선 시간 복잡도
는 특정 알고리즘이 문제상황을 해결하는데 걸리는 시간
을 의미합니다. 같은 결과를 가져오는
코드라면 시간 복잡도가 작을수록 더 효율적인 알고리즘입니다.
공간 복잡도
는 작성한 프로그램이 얼마나 많은 메모리를 차지하는지 분석하는 방법
입니다. 최근 컴퓨터 성능의
비약적인 발전으로 중요성이 예전보다 많이 떨어졌지만, 빅데이터 분야는 아직도 중요하게 사용됩니다.
시간복잡도는 크게 3가지 표기법이 있는데 최선의 경우인 오메가(Big-Ω)
표기법, 평균의 경우인
세타
표기법(Big-θ), 최악의 경우인 빅오(Big-O)
표기법이 있습니다.
이 중 빅오(Big-O)
표기법이 가장 많이 사용되는데 그 이유는 “최소 특정 시간 이상이 걸린다” 보다 “이 정도
시간까지 걸릴 수 있다
”를 고려해야 그에 맞는 대응이 가능하기 때문이다.
빠른 시간 복잡도 별로 정리를 해보겠습니다.
O(1) - 상수 시간(Contant time) : 입력 크기(n)에 상관없이 일정한 연산을 수행하는
시간복잡도 이다.
O(log n) - 로그 시간(Logarithmic time) : 입력 크기(n)이 커지면 연산 횟수가 log₂ n 에 비례해서 증가하는
시간복잡도 이다.
O(n) - 선형 시간(Linear time) : 입력크기(n)이 커지면 연산 횟수가 n에 비례해서 증가
하는 시간복잡도이다.
O(n²) - 2차 시간(Quadratic time) : 입력크기(n)이 커지면 연산 횟수가 n²에 비례해서 증가
하는 시간복잡도이다.
O(2ⁿ) - 지수 시간(Expotential time) : 입력 크기(n)가 커지면 연산 횟수가 2ⁿ에 비례해서 증가
하는 시간복잡도이다.
이진 탐색이란 정렬되어 있는 데이터에서 특정한 값을 찾아내는 알고리즘입니다. 탐색 범위를 반으로 나누어 찾는 값을 포함하는 범위를 좁혀가는 방식
으로 동작합니다.
이해가 쉬운 예시로 일상에서 우리가 나이를 맞추는 게임을 할때 Up,Down 게임을 하는데 비슷한 방식입니다.
장점
검색 대상의 크기와 상관없이 빠른 검색 속도를 제공
한다는 것으로, 검색 대상이 매우 큰 경우에도 탐색 시간이 빠르기 때문에, 대량의 데이터를 다루는 알고리즘에서 많이 사용된다
.이론적으로 최악의 경우에도 O(log n)의 검색 속도를 보장한다.
즉, 검색 대상의 크기가 커져도 검색 시간이 늘어나는 속도가 상대적으로 느리기 때문에 가능하다.단점
배열이나 이진탐색 트리와 같이 정렬된 구조에서만
사용할 수 있다는 것입니다.이진 탐색의 시간 복잡도는 O(log n)
으로, 배열의 크기에 비례하여 실행 시간이 결정됩니다. 대용량 데이터에서 특정 값의 위치를 찾는데 용이
하게 사용됩니다.
다이나믹 프로그래밍 또한 알고리즘의 한 종류입니다.
복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방식을 말합니다.
더 자세히 설명드리면 상향 접근법
이라는 방법으로 가장 작은 부분의 해답을 구한 후, 이를 저장하여, 저장한 값을 이용해 상위 문제를 풀어가는 방식
입니다.
다이나믹 프로그래밍을 적용하기 위해서는 두가지 속성을 만족시켜야합니다.
부분 반복 문제(Overlapping Subproblem)
다이나믹 프로그래밍의 등장은 피보나치 수열
이라고한다. 그래서 대표적인 예시로 피보나치 수열이 나온다.피보나치 수열은 하나의 값을 도출하기위해 함수내부에서 또 함수가 호출되는 대표적인 재귀함수입니다.
그래서 이러한 반복적인 연산을 부분 반복 문제
라고 합니다.
최적 부분 구조(Optimal Substructure)
최적 부분 구조는 어찌 생각해보면 당연한 구조입니다. 큰 문제의 최적의 답을 구하려면 작은 문제의 최적의 답을 합쳐서 만들어야합니다.
작은 문제의 답이 효율적이지 않으면 효율적이지 않은것들이 모여 효율적이지 않은 큰 문제의 답이 될것입니다. 효율의 가장 간단한 방법은 중복연산을 줄이는것인데, 이 방법으로 나온것이
메모이제이션(Memoization)
개념입니다.
메모이제이션이란 컴퓨터 프로그램이 동일한 계산을 반복해야할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술
입니다.
다이나믹 프로그래밍으로 문제를 해결하려 할 때, 두가지 접근 방법이 존재합니다.
Bottom - Up
말 그대로 아래에서 위로 접근하는 방식
으로 부분 문제에서부터 문제를 해결하여 점차 큰 문제를 풀어가는
방식입니다.
Top - Down
말 그대로 위에서 아래로 접근하는 방식
으로 큰 문제에서 부분 문제로 쪼개가면서 재귀 호출을 통해 문제를
푸는 방식입니다.