알고리즘(문제를 해결하는 과정)의 효율성 차이에 대해 가장 빠르게 이해할 수 있는 수단 중 하나.
말 그대로 data 혹은 숫자를 어떻게 구성하고 위치하는 지에 대해 정의하는 방법론이다.
target data를 정한 후(정하는 방법은 여러가지가 있을 것임), target data를 원하는 위치에 분류하는 방식 혹은 알고리즘을 일컫는다.
예를 들어, array = [1, 2, 3, 4, 5, 6, ... ]가 있고 이를 오름차순으로 정렬한다고 가정해보자.
이때 차례로 array를 순회하면서 가장 작은 수를 찾고, 이를 원하는 위치에 가져다 놓거나 자리를 바꾸는 알고리즘을 선택정렬이라 일컫는다.
- for loop
- swapping (swapping, 두 array data의 자리를 바꿀때 temp를 이용하여 바꾸는 방법)
##selected array
## 1 2 3 4 5 6 7 8 9 10
array = [1, 10, 5, 8, 7, 6, 4, 3, 2, 9]
arrayLength = len(array)
for i in range(arrayLength):
minValue = array[i]
minIndex = i
for j in range(i, arrayLength):
if minValue > array[j]:
minValue = array[j]
minIndex = j
temp = array[i]
array[i] = array[minIndex]
array[minIndex] = temp
print(array)
array data의 개수를 N이라 하자.
이때 선택정렬의 비교연산은 최초 10번부터, index에 따라 9 + 8 + ... 형식으로 누적된다.
등차수열에서 N개의 data가 있을때 연산횟수는 N(N+1)/2회가 되며, 컴퓨터 연산에서 상수를 제거하고 남은 시간복잡도는 O(N^2)이 된다.
따라서 N이 많아진다면 제곱에 비례하여 시간복잡도가 늘어나게 되고, 이에 따라 선택정렬은 구현은 쉽지만 상당히 비효율적인 알고리즘인 것을 알 수 있다.
알고리즘의 시간 효율성을 나타내는 표기법이다.
(*알고리즘 공간, 메모리에 대한 효율성은 공간복잡도로 별도 표기)
빅오 표기법은 현재 수행하는 알고리즘을 f(n)이라 정의하고, 그 위에 상한선(점근선) g(n)을 정의하여 현재 알고리즘의 시간소요의 상한선을 알 수 있는 표기법이다.
빅오 표기법은 알고리즘의 시간복잡도를 상한선을 기준으로 표기하기 때문에, 최대 복잡도를 알 수 있을 뿐만 아니라, data가 커짐에 따라 얼마나 시간이 많이 소요되고 복잡한지를 한눈에 알 수 있다.
빅오 표기법
https://noahlogs.tistory.com/27
실전알고리즘 강좌
https://www.youtube.com/watch?v=8ZiSzteFRYc&list=PLRx0vPvlEmdDHxCvAQS1_6XV4deOwfVrz&index=2