02. 알고리즘을 배우기 위한 준비

2021. 4. 30. 18:44·Algorithm/알기 쉬운 알고리즘

  • 알기쉬운 알고리즘(양성봉 저, 생능 출판) 책을 바탕으로 작성한 내용이다.

02. 알고리즘을 배우기 위한 준비

2.1 알고리즘이란

  • 유래 : 페르시아 수학자인 알콰리즈미(al-Khwarizmi)(서기 780~850년)

  • 알고리즘은 문제를 해결하는 단계적 절차 또는 방법이다.

    • 이는 컴퓨터로 해결할 수 있어야 하며 입력과 출력이 존재한다.
  • 알고리즘의 일반적인 특성

    • 정확성

      • 주어진 입력에 대해 올바른 해를 준다.
    • 수행성

      • 컴퓨터에서 수행이 가능해야 한다. (애매모호한 표현이 없어야 한다.)
    • 유한성

      • 현실적인 시간 내로 종료되어야 한다.
    • 효율성

      • 시간적, 공간적인 효율성을 최대한 고려해야 한다.

2.2 최초의 알고리즘

  • 기원전 300년경에 만들어진 유클리드(Euclid)의 최대공약수를 찾는 알고리즘이 최초이다.

  • 유클리드의 최대공약수 알고리즘

    a >= b >= 0 일 때,

    pseudo code

    int Euclid(int a, int b)
    {
      if (b == 0) return a;
      return Euclid(b, a mod b);
    }

2.3 알고리즘의 표현 방법

  • 알고리즘의 각 단계는 보통 말로 서술할 수 있지만, 일반적으로 의사 코드(pseudo code)로 표현된다.

  • 1장의 "1.1 최대 숫자 찾기"의 의사 코드는 다음과 같다.

    pseudo code

    max = Array[0]
    for i = 1 to 9
      if (Array[i] > max) max = Array[i]
    return max
  • 이외에도 플로우차트(flow chart) 형태로 표현하기도 한다.


2.4 알고리즘의 분류

  • 알고리즘은 문제의 해결 방식에 따라 대략 다음과 같이 분류된다.

    • 분할 정복(Divide-and-Conquer) - 3장

    • 그리디(Greedy) - 4장

    • 동적 계획(Dynamikc Programming) - 5장

    • 근사(Approximation) - 8장

    • 백트래킹(Backtracking) - 9장

    • 분기 한정(Branch-and-Bound) - 9장

    • 랜덤(Random)

    • 병렬(Parallel)

    • 분산(Distributed)

    • 양자(Quantum)

    • 유전자(Genetic)

  • 문제에 기반하여 분류한 알고리즘들

    • 정렬 - 6장

    • 그래프(Graph)

    • 기하(Geometry)


2.5 알고리즘의 효율성 표현

  • 일반적으로 시간 복잡도가 알고리즘의 비교 척도로 사용된다.

  • 시간 복잡도(Time Complexity)

    • 알고리즘의 수행 시간

      • 실제로 수행되는 시간이 아닌, 수행하는 기본적인 연산 횟수를 입력 크기에 대한 함수로 표현하는 것이다.
    • 알고리즘의 복잡도를 분석하는 방법은 다음과 같다.

      • 최악 경우 분석(Worst Case Analysis)

        • 어떤 입력이 주어지더라도 넘지 않는 시간을 분석한다.
      • 평균 경우 분석(Average Case Analysis)

        • 입력이 균등 분포(Uniform Distribution)일 경우를 가정하고 분석한다.
      • 최선 경우 분석(Best Case Analysis)

        • 최적(Optimal) 알고리즘을 고안할 때 참고 자료로 활용된다.
  • 공간 복잡도(Space Complexity)

    • 알고리즘이 수행되는 동안 사용되는 메모리 공간의 크기

2.6 복잡도의 점근적 표기

점근적 표기(Asymptotic Notation)

  • 복잡한 식을 간단히 표현하기 위해 사용되는 표기법

  • 일반적으로 빅오 표기법이 사용된다.

  • O(Big-Oh) 표기

    • 복잡도의 점근적 상한을 나타낸다.

      • 점근적 상한

        • 단순화된 함수에 임의의 양수를 곱하여 나온 함수가, n이 증가함에 따라 f(n)의 상한이 되는 경우
    • 다항식의 최고 차항만 계수 없이 취하면 된다.

  • Ω(Big-Omega) 표기

    • 복잡도의 점근적 하한을 나타낸다.

      • 점근적 하한

        • 단순화된 함수에 임의의 양수를 곱하여 나온 함수가, n이 증가함에 따라 f(n)의 하한이 되는 경우
    • 다항식의 최고 차항만 계수 없이 취하면 된다.

  • θ(Theta) 표기

    • 복잡도의 상한과 하한이 동시에 적용되는 경우를 나타낸다.

      • n이 증가함에 따라 복잡도와 동일한 증가율을 가진다는 것을 의미한다.
    • 즉 빅오 표기법과 빅오메가 표기법의 복잡도가 같은 경우 사용한다.


예제

  • 복잡도가 f(n) = 2n2-8n+3 일 때

    • O(n2)

      • 임의의 양수 c를 곱한 cn2은 n이 증가함에 따라 f(n)의 상한이 된다. (예를 들면 c = 5인 경우)
    • Ω(n2)

      • 임의의 양수 c를 곱한 cn2은 n이 증가함에 따라 f(n)의 하한이 된다. (예를 들면 c = 1인 경우)
    • θ(n2)

      • f(n)은 n이 증가함에 따라 n2과 동일한 증가율을 가진다.

자주 사용되는 O 표기

O 표기 의미
O(1) 상수 시간(Constant Time)
O(logn) 로그(대수) 시간(Logarithmic Time)
O(n) 선형 시간(Linear Time)
O(nlogn) 로그 선형 시간(Log-linear TIme)
O(n2) 제곱 시간(Quadratic Time)
O(n3) 세제곱 시간(Cubic Time)
O(nk) 다항식 시간(Polynomial Time)
O(2n) 지수 시간(Exponential Time)

2.7 왜 효율적인 알고리즘이 필요한가?

  • 입력 크기가 커질 수록 수행 시간의 차이가 엄청나며, 하드웨어 기술 개발보다는 효율적인 알고리즘 개발이 훨씬 경제적이다.
저작자표시 (새창열림)

'Algorithm > 알기 쉬운 알고리즘' 카테고리의 다른 글

최단 경로 찾기(Shortest Path)  (0) 2021.05.03
최소 신장 트리(Minimum Spanning Tree)  (0) 2021.05.03
03. 분할 정복 알고리즘  (0) 2021.04.30
선택 문제 (Selection Problem)  (0) 2021.04.30
01. 알고리즘의 첫걸음  (0) 2021.04.30
'Algorithm/알기 쉬운 알고리즘' 카테고리의 다른 글
  • 최소 신장 트리(Minimum Spanning Tree)
  • 03. 분할 정복 알고리즘
  • 선택 문제 (Selection Problem)
  • 01. 알고리즘의 첫걸음
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 분류 전체보기 (317)
      • Algorithm (13)
        • 알기 쉬운 알고리즘 (10)
        • Search (1)
        • Sort (2)
      • Arduino (0)
      • C++ (185)
        • Class (46)
        • Exception (6)
        • Library (51)
        • Overloading (10)
        • SmartPointer (5)
        • Syntax (33)
        • TBC++ (23)
        • Templates (9)
        • VisualStudio (2)
      • Embedded (1)
      • Git (4)
      • Java (5)
      • Linux (16)
        • Error (1)
        • Linux Structure (11)
      • MacOS (7)
      • OS (1)
        • Concurrency (1)
      • Python (21)
        • Class (1)
        • Function (2)
        • Syntax (17)
      • Raspberrypi (9)
      • Review (1)
      • Utility (12)
        • VSCode (5)
        • VirtualBox (3)
      • Web (8)
        • Nginx (1)
        • React (3)
        • Django (1)
      • Windows (20)
        • Registry (3)
        • WSL (1)
        • DeviceDriver (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    vscode
    SunOS 5.1
    windows
    unix
    Solaris 10
    Workspace
    로지텍 마우스 제스처
    시스템 복구
    백기선
    맥북 카카오톡 알림 안뜸
    알림
    dism
    citrix workspace
    윈도우 명령어
    java
    스프링
    spring
    EXCLUDE
    스프링 프레임워크 핵심 기술
    MacOS
    윈도우
    SFC
    Windows 11
    제외
    그림판
    logi options
    KakaoTalk
    mspaint
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
02. 알고리즘을 배우기 위한 준비
상단으로

티스토리툴바