개발 일지

시간복잡도에 관하여

Shinya Matsuri 2019. 5. 11. 14:50

2019.05.11 Sat 14:15

이번 일지를 기준으로 가끔가면서 기억에 남는 일이 있으면 차례대로 써서 기록을 남겨보기로 했습니다.

이런식으로 일지를 써보는 건 처음이라 조금 걱정되기도 하네요.

우선 한가지 반성하면서 넘어가 볼 일을 써볼까합니다.

오늘 공주대학교 정보보호영재원 수업은 python과 알고리즘이었습니다.

이곳에서 받은 강의 자료에서 제가 한 가지 잊고서 공부하지 않고 있던 것을 발견할 수 있었습니다.

바로 시간복잡도입니다.

시간복잡도의 개념만 알고 나중에 알아둬야지 하고 넘기다가 지금까지 공부를 안해놓은 자신을 발견할 수 있었습니다.

그래서 오늘의 일지는 오늘 공부한 시간복잡도에 대해서 남겨보려고 합니다.

 

big-O Name
1 Constant
log n Logarithmic
n Linear
n log n Log Linear
n^2 Quadratic
n^3 Cubic
2^n Exponential
  • O(1)
    1. Constant, 즉 1이 의미하는 바는 상수 시간을 의미합니다.
    2. 입력되는 n이 주어질 때, 알고리즘이 문제를 해결하는데 오직 한 단계만 거칩니다.
  • O(log n)
    1. Logarithmic, 즉 고정된 밑이 몇 번 제곱되는지에 대한 시간을 의미합니다.
    2. 밑을 2라고 생각하였을 때, n의 입력값이 16이면 알고리즘 수행 시간은 4가 됩니다.
    3. 따라서 데이터 양이 많아져도, 그에 비한 시간은 조금씩 늘어납니다.
    4. Binary Search, 즉 이진 탐색의 코드에서 주로 나타나는 시간복잡도입니다.
  • O(n)
    1. Linear, 즉 선형이므로 데이터 양에 따라서 시간이 정비례합니다.
    2. linear search, for문을 통한 탐색의 코드에서 주로 나타나는 시간복잡도입니다.
  • O(n log n)
    1. log linear, 즉 데이터 양이 n배 많아지면, 실행 시간은 n배보다 조금 더 많아지는데, 정비례는 하지 않는다.
    2. n이 두배로 늘어나면 실행 시간은 2배보다 약간 더 많이 늘어난다.
    3. Quick sort, Merge sort 방식의 정렬 알고리즘에서 주로 나타나는 시간복잡도입니다.
  • O(n^2)
    1. Quadratic, 즉 데이터 양에 따라 걸리는 시간은 제곱에 비례합니다.
    2. 제곱하는 만큼 n값이 커질수록 걸리는 시간이 비효율적으로 늘어나게됩니다.
    3. 이 유형은 이중루프내에서 입력 자료를 처리하는 경우 나타납니다.
    4. 2중 for 문을 사용하는 bubble sort, insertion sort와 같은 정렬 알고리즘에서 주로 나타나는 시간복잡도입니다.

그 외에도 n!와 같이 팩토리얼 형식의 시간복잡도도 쓰이지만, 여기서는 언급하지 않고 넘어가겠습니다.

각각의 시간복잡도들의 성능만 따져본다면

O(1)>O(log n)>O(n)>O(n log n)>O(n^2)>O(n!)

가 됩니다.

정말 시간복잡도도 제대로 파악할 줄 몰라왔으면서 지금까지 잘도 시간초과가 나지 않도록 코딩해왔다는 생각이 들었습니다.

사실 이론으로 설명해놓은 이 정리보다는 직접 예시 코드를 보고 이해하니 금방 이해할 수 있었습니다.

한 번만 읽어봐도 코딩하면서 머리를 좀더 효율적이게 굴리며 코딩해올 수 있었을 간단한 내용들인데, 그 간단하다고 말하는 내용을 미뤄두면서 안해왔던 저를 반성하는 시간이 된 것 같습니다.

음, 첫 번째로 쓰는 일지..라 해야할까 일기에 더 가까운 것 같군요.

처음 쓰는 방식이라 두서없이 내용이 길어진 것 같습니다.

다음번에는 좀 더 정리해가며 일지를 써야될 것 같네요.