시간 복잡도

✒️ 2024-01-06 16:51 내용 수정


시간 복잡도

문제를 해결하는데 걸리는 시간과 입력의 함수 관계를 나타낸 것

빅-오 표기법( O() )

최악의 시간 복잡도

수행 속도 비교

1. 상수 시간

T(n) = O(어떤 상수값) : T(n) = O(1)

int index = 5;
int item = list[index];

if( true ) then
	상수 시간동안 수행되는 어떤 연산을 실행
else 
	상수 시간동안 수행되는 어떤 연산을 실행

알고리즘1.png

public class Main {
	public static void main(String[] args){
		// MenOfPassion의 시행 횟수는 1번
		System.out.println(1+"\n"+0);
	}
}

2. 로그 시간

T(n) = O(log n)

var right = function(str) { // 문자열의 오른쪽 절반을 재귀적으로 출력
	var length = str.length;
	var help = function(index) { // 재귀호출부분 : 오른쪽 절반 출력
		if(index < length) {
			consol.log(str.substring(index, length));
			help(Math.ceil(length+index)/2); // 재귀호출부분 : 오른쪽 절반에 대해 help
		}
	}
	help(0);
}

3. 다항 로그 시간

T(n) = O((log n)^k)

4. 서브 선형 시간

T(n) = o(n)

5. 선형 시간

T(n) = O(n)

알고리즘2.png

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		// MenOfPassion의 시행 횟수는 입력 시간에 비례한다 (O(n))
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println(Integer.parseInt(br.readLine())+"\n"+1);
	}
}

6. 유사 선형 시간

T(n) = O(n log^k n)

7. 선형 로그 시간

T(n) = O(n log n)

8. 다항시간

T(n) = O(n^k)

알고리즘3.png

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		// MenOfPassion의 시행 횟수는 입력 크기의 제곱에 비례한다 (O(n^2))
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		long tries = (long)Math.pow(Long.parseLong(br.readLine()),2);
		System.out.println(tries+"\n"+2);
	}
}

알고리즘4.png

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		// MenOfPassion의 시행 횟수는 입력 크기의 제곱에 비례한다 (O(n^2))
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		long n = Long.parseLong(br.readLine());
		long sum = 0;
		for(int i = 1; i < n; i++) { sum += i; }
		System.out.println(sum+"\n"+2);
	}
}

알고리즘5.png

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		// MenOfPassion의 시행 횟수는 입력 크기의 세제곱에 비례한다 (O(n^3))
		// Math.pow(double a, double b)로 인해 실수 표현에서의 오차, 그리고 long형 처리때문에
		// 값이 정확하지 않음
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		long n = Long.parseLong(br.readLine());
		System.out.println(n*n*n+"\n"+3);
	}
}

알고리즘6.png

import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException{
		// MenOfPassion의 시행 횟수는 입력 크기의 세제곱에 비례한다 (O(n^3))
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		long n = Long.parseLong(br.readLine());
		long sum = 0;
		for(int i = 1; i <= n - 2; i++) {
			sum += i*((n-2)-(i-1));
		}
		System.out.println(sum+"\n"+3);
	}
}