객관적인 자료구조 및 알고리즘의 성능을 구하기 위해 추상화 된 개념이다.
하드웨어나 소프트웨어의 성능에 상관없이
객관적으로 자료구조 및 알고리즘의 성능을 구하기 위해
추상화 된 가상의 컴퓨터.
해당 개념은 튜링의 Turing Machine
에서 출발하여,
현대에 들어서는 폰 노이만의 Random Access Machine
(이하 RAM
)이라는 모델로 정착이 되었다.
가상 컴퓨터가 이해할 수 있는 가상 언어
즉, RAM에서 제공하는 기본 연산 및 명령어의 집합
if
if else
else if
else
for
while
정의
호출
return
가상 언어로 작성되는 가상의 코드
예시)
input: n
개의 정수를 갖는 배열 Arr
output: Arr
의 요소 중 최댓값
algorithm MaxArray(Arr, n):
Max = Arr{0]
for i = 1 to n-1 do
if Max < Arr[i]:
Max = Arr[i]
return Max
단위 시간에 수행 되는 연산의 집합
=
+
-
*
/
>
>=
<
<=
==
!=
AND
OR
NOT
bit-AND
bit-OR
bit-NOT
위의 5가지의 연산을 각 1 단위 시간에 수행할 수 있는 컴퓨터를
가상의 컴퓨터를 RAM(Random Access Machine)이라 하자.
해당 RAM의 연산을 바탕으로 몇몇의 알고리즘을 수행하며,
알고리즘의 단위 시간을 측정하고 서로 비교할 것이다.
'A'라는 알고리즘이 있다고 가정해 보자.
만약에 이 알고리즘에 대하여 시간 복잡도를 제대로 알고 싶다면,
가능한 모든 입력을 받아, 각 연산의 연산 횟수를 더한 이후,
이에 대한 평균을 내면 된다.
BUT, 이는 현실적으로 불가능하다. 어떻게 모든 입력을 받을 수 있을까?
가능하다 할지라도 하나의 알고리즘에 대하여 하나의 시간 복잡도를 구하는데,
너무나도 많은 비용을 가져올 것이다.
따라서 최악의 입력(worst-case input)에 대하여
기본 연산의 횟수를 측정하는 것이다.
이를 Worst-case time complexity라고 한다.
- 알고리즘의 수행시간 == 최악의 입력에 대한 기본 연산의 횟수
이것을 구하면, 이를 제외한 해당 알고리즘의 모든 연산 횟수는 worst-case time complexity
보다 크지 않다.
(YouTube) Chan-Su Shin
Wikipedia
모두의 코드