시간 복잡도란?
입력값과 연산 수행 시간의 상관관계를 나타내는 척도
시간 복잡도 표현 방법
최상의 경우: 오메가 표기
평균의 경우: 세타 표기
최악의 경우: 빅오 표기 // 시간복잡도의 기준
시간 복잡도 단계
O(1) < O(log n) < O(n) < O(n log n) < O(n^2)
O(1) 상수 시간 : 문제를 해결하는데 오직 한단계만 처리
public static void callFirstStudent(String[] students) {
if (students.length > 0) {
System.out.println("첫 번째 학생: " + students[0]);
}
}
출석부에서 첫번째 학생의 이름을 부르는것과 같다 (즉시 출력값을 얻을수 있는것)
O(log n) 로그 시간 : 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 줄어듬
public static boolean findStudentByHeight(int[] heights, int targetHeight) {
int left = 0;
int right = heights.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (heights[mid] == targetHeight) {
return true;
} else if (heights[mid] < targetHeight) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
키순서로 줄 세운 학생들 중에서 특정 키의 학생을 찾는 로직 (어떤 기준을 갖고 탐색하는것)
O(n) 직선적 시간 : 문제를 해결하기 위한 단계의 수와 입력값 n 이 1:1 관계를 가짐
public static int countStudentsWithGlasses(boolean[] hasGlasses) {
int count = 0;
for (boolean wearGlasses : hasGlasses) {
if (wearGlasses) {
count++;
}
}
return count;
}
교실에서 안경 쓴 학생 수를 세는 로직, 모든 학생을 한번씩 봐야함 ( 1:1로 n번 실행)
O(n log n) 선형로그형 : 문제를 해결하기 위한 단계의 수가 N*(log2N) 번 만큼의 수행시간을 가짐
// 실제 구현은 더 복잡하지만, 개념을 단순화
public static void organizeTeams(String[] students) {
// 학생들을 무작위로 섞기
shuffleStudents(students);
// 팀 나누기
for (int i = 0; i < students.length; i++) {
assignToTeam(students[i]);
}
}
체육 수업에서 학생들을 섞은뒤 다음 팀으로 나누는 것과 비슷( 정렬 알고리즘 )
O(n^2) 2차 시간 : 문제를 해결하기 위한 단계의 수는 입력값 n의 제곱
public static void pairStudentsForProject(String[] students) {
for (int i = 0; i < students.length; i++) {
for (int j = i + 1; j < students.length; j++) {
System.out.println(students[i] + "와 " + students[j] + "가 팀");
}
}
}
모든 학생들을 둘씩 짝지어 프로젝트 팀을 만드는 것과 같음. 각 학생마다 다른 모든 학생과 짝을 지어봐야 해서 시간이 오래 걸림 (이중 for문을 사용하여 문제를 풀경우)
시간 복잡도를 구하는 요령
O(n) - 하나의 루프를 사용하여 단일 요소 집합을 반복하는 경우
O(n/2) -> O(n) - 컬렉션의 절반 이상을 반복하는 경우
O(n+m) -> O(n) - 두 개의 다른 루프를 사용하여 두 개의 개별 콜렉션을 반복 할 경우
O(n^2) - 두 개의 중접 루프를 사용하여 단일 컬렉션을 반복하는 경우
O(n*m) -> O(n^2) - 두 개의 중첩 루프를 사용하여 두개의 다른 콜렉션을 반복할경우
O(n*log n) - 컬렉션 정렬을 사용하는경우
참조블로그
[알고리즘] Time Complexity (시간 복잡도) - 하나몬
⚡️ Time Complexity (시간 복잡도) Time Complexity (시간 복잡도)를 고려한 효율적인 알고리즘 구현 방법에 대한 고민과 Big-O 표기법을 이용해 시간 복잡도를 나타내는 방법에 대해 알아봅시다. ❗️효
hanamon.kr
https://blog.chulgil.me/algorithm/
알고리즘의 시간 복잡도와 Big-O 쉽게 이해하기
삼성역에서 택시를 타고 강남역으로 향했는데 30분 걸렸다. 구글에서 알려주는 최단경로로 갔더라면 15분내에 도착할 것이다. 레스토랑을 예약해서 가는 경우라던지 친구와 약속시간을 잡은경
blog.chulgil.me
'개발일기 > CS(면접)' 카테고리의 다른 글
공간 복잡도란? (0) | 2024.09.10 |
---|---|
쿠버네티스란? (0) | 2024.09.09 |
OSI 7계층 이란? (0) | 2024.08.21 |
Transaction 전파 전략 (0) | 2024.08.14 |
API 요청에 대한 Spring 내부 동작 (0) | 2024.08.13 |