최악의 시나리오가 아니라, 모든 시나리오를 고려..? 평균적인 시나리오를 고려
삽입정렬(insertion sort)
삽입정렬은 네종류의 단계를 거침: 삭제, 비교, 시프트, 삽입
=> 다양한 차수가 한데 섞여 있을 때 빅 오 표기법은 가장 높은 차수의 N만 고려한다.
(값이 커질수록 작은 차수의 영향력이 미미해지므로)
버블정렬과 삽입정렬은 N^2, 선택정렬은 (N^2)/2.
그럼 2배 빠른 선택정렬이 가장 나은 방법일까?
최악의 시나리오에서는 선택정렬이 더 유리. 그러나, 평균 시나리오 역시 중요하게 고려해야 함.
최선의 시나리오 | 평균 시나리오 | 최악의 시나리오 | |
---|---|---|---|
선택 정렬 | N^2/2 | N^2/2 | N^2/2 |
삽입 정렬 | N | N^2/2 | N^2 |
거의 정렬된 데이터를 다룰 경우 = 삽입 정렬이 유리
대부분 역숙인 데이터를 다룰 경우 = 선택 정렬이 유리
어떤 데이터가 들어올지 모르는 경우 (=기본적으로 평균적인 경우 = 둘다 비슷.
대부분 평균적인 경우가 발생함을 고려하면서, 최선의, 평균, 최악의 시나리오를 구분해서 알고리즘을 최적화해야 한다.
일반적으로 O(N^2)은 느리게 본다.
다양한 코드에 대한 빅 오 표현법을 찾아본다.
모두 다 적는건 비효율적인 것 같아 인상적이었던 예제만 기록한다.
한 배열의 모든 수와 다른 배열의 모든 수를 곱하는 코드.
function twoNumberProducts(array1, array2) {
let products = [];
for(let i = 0; i < array1.length; i++) {
for(let j = 0; j < array2.length; j++) {
products.push(array1[i] * array2[j]);
}
}
return products;
}
한 배열의 크기를 N, 다른 배열의 크기를 M이라 할 때, O(NM)
case1) N=9, M=1인 경우 : O(N)
case2) N=5, M=5인 경우 : O(N^2)
=> O(NM): O(N)~O(N^2)
암호 풀이를 위해 n이 3인 경우, ‘aaa’부터 ‘zzz’까지 모든 문자열을 순회하도록 루프를 설정하는 경우
=> N이 문자열의 길이일 때 26^N
=> N이 1씩 늘어날 때 마다 26단계가 증가한다.