<aside> <img src="/icons/list-indent_lightgray.svg" alt="/icons/list-indent_lightgray.svg" width="40px" />
Table Of Content
</aside>
자료 구조(data structure)는 효율적으로 데이터를 관리하고 수정, 삭제, 탐색, 저장할 수 있는 데이터 집합을 말한다.
<aside> 📢
알고리즘이 소모하는 자원을 분석하는 것 (자원 : 실행 시간, 메모리, 통신, 저장장치 등)
이 중에서도 일반적으로는 실행 속도에 초점을 두어 평가
복잡도는 시간 복잡도와 공간 복잡도로 나뉜다.
$O(1)$ : 입력 크기와 관계없이 일정한 시간 → 상수 시간을 갖는 알고리즘
function example(data) {
return data[0];
}
$O(n)$ : 입력 크기에 비례해 실행 시간 증가 (반복문)
function example(data) {
let total = 0;
for (let i = 0; i < data.length; i++) {
total += data[i];
}
return total;
}
$O(n^2)$ : 입력 크기의 제곱에 비례 (2중 반복문)
function example(data) {
for (let i = 0; i < data.length - 1; i++) {
for (let j = i + 1; j < data.length; j++) {
if (data[i] === data[j]) return false;
}
}
return true;
}
$O(log n)$ : 입력을 반씩 줄이며 탐색 (이진탐색)
시간 복잡도란 입력 크기에 대해 어떠한 알고리즘이 실행되는 데 걸리는 시간이다.
주요 로직의 반복 횟수를 중점으로 측정되며, 보통 빅오 표기법으로 나타낸다.
예를 들어 ‘입력 크기 n’의 모든 입력에 대한 알고리즘에 필요한 시간이 $10n^2$ + n이라고 하면 다음과 같은 코드를 상상할 수 있다.
for (let i = 0; i < 10; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
if (true) console.log(k);
}
}
}
for (let i = 0; i < n; i++) {
if (true) console.log(i);
}
빅오 표기법이란 입력 범위 n을 기준으로 해서 로직이 몇 번 반복되는지 나타내는 것인데, 앞서 말한 코드의 시간 복잡도를 빅오 표기법으로 나타내면 O($n^2$)이 된다.