1์ด = 1์ต ๋ฒ
์ ์ฐ์ฐ์ ์๋ฏธํ๋ค.์๊ณ ๋ฆฌ์ฆ ์๊ฐ๋ณต์ก๋ x ๋ฐ์ดํฐ์ ํฌ๊ธฐ
์ผ๋ก ๊ณ์ฐํ๋ค.์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋์ Big-O ์ฝ๊ฒ ์ดํดํ๊ธฐ
๐ ์ ๊ทผ์ ํ๊ธฐ๋ฒ์ ๋ค์ ์ธ๊ฐ์ง๊ฐ ์๋๋ฐ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉ๋๋ค.
- ์ต์์ ๊ฒฝ์ฐ : ์ค๋ฉ๊ฐ ํ๊ธฐ๋ฒ (Big-ฮฉ Notation)
- ํ๊ท ์ ๊ฒฝ์ฐ : ์ธํ ํ๊ธฐ๋ฒ (Big-ฮธ Notation)
- ์ต์ ์ ๊ฒฝ์ฐ :
๋น ์ค ํ๊ธฐ๋ฒ (Big-O Notation)
๐
๐ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ตฌํ๋ ์๋ น
- ํ๋์ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ์์ ์งํฉ์ ๋ฐ๋ณต ํ๋ ๊ฒฝ์ฐ :
O (n)
- ์ปฌ๋ ์ ์ ์ ๋ฐ ์ด์ ์ ๋ฐ๋ณต ํ๋ ๊ฒฝ์ฐ :
O(n/2)
->O(n)
- ๋ ๊ฐ์ ๋ค๋ฅธ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๊ฐ๋ณ ์ฝ๋ ์ ์ ๋ฐ๋ณต ํ ๊ฒฝ์ฐ :
O(n+m)
->O(n)
- ๋ ๊ฐ์ ์ค์ฒฉ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ :
O(nยฒ)
- ๋ ๊ฐ์ ์ค์ฒฉ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๋ค๋ฅธ ์ฝ๋ ์ ์ ๋ฐ๋ณต ํ ๊ฒฝ์ฐ :
O(n*m)
->O(nยฒ)
- ์ปฌ๋ ์ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ :
O(n*log(n))
java ํ์ฉํด์ '์๊ฐ ๋ณต์ก๋' ์ ๋ฆฌํ๊ธฐ!!(๊ฐ๋ +์ฝ๋)
์๊ฐ๋ณต์ก๋ Big-O(๋น ์ค)๋?
โ ์์ฝ ์ ๋ฆฌ
์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์๋ก ๊ณ์ฐ ์๊ฐ์ ์ค๋ ๊ฑธ๋ฆฐ๋ค!
O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!) < O(n^n)
๐จ O(1) - ์์ ์๊ฐ
์ ๋ ฅ๊ฐ n์ด ์ฃผ์ด์ก์ ๋, ์ฐ์ฐ์ด 1๋ฒ๋ง ์ํ
public class timeComplexity { public static void main(String[] args) { int constant = 1; // ์๊ฐ ๋ณต์ก๋: O(1) } }
๐จ O(n) - ์ง์ ์ ์๊ฐ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋จ๊ณ์ ์์ ์ ๋ ฅ๊ฐ n์ด 1:1์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค. (n์ด ์ปค์ง๋ ๋งํผ ์ ์งํ๊ฒ 1๋1๋ก ์ ๋น๋กํ๋ ๋ฏ)
public class timeComplexity { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int inputNum = sc.nextInt(); int sum = 0; // ์ด ํฉ๊ณ int increment = 1; // ๋ํด์ค ์ for(int i=0; i<inputNum; i++){ // inputNum์ด ์ปค์ง์๋ก ๊ทธ์ ๋น๋กํด์ ํฉ๊ณ๊ฐ ์ปค์ง sum += increment; } } }
๐จ O(n^2) - 2์ฐจ ์๊ฐ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋จ๊ณ์ ์๋ ์ ๋ ฅ๊ฐ์ ์ ๊ณฑ์ด๋ค.
public class timeComplexity { public static void main(String[] args) { int n=9; int gugudan=0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { gugudan = i*j; System.out.println(i+ "*" + j + "=" + gugudan); } } } }
๐จ O(C^n) - ์ง์ ์๊ฐ: ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋จ๊ณ์ ์๋ ์ฃผ์ด์ง ์์ C์ n์ ๊ณฑ์ด๋ค.
๐จ O(log n) - ๋ก๊ทธ ์๊ฐ : ์ ๋ ฅ๊ฐ n์ด ์ฃผ์ด์ก์ ๋, ํน์ ํ ์๊ฑด์ ๋ฐ๋ผ ํ์ํ ๋จ๊ณ๊ฐ ์ฐ์ฐ์ด ์ค์ด ๋ ๋ค. (๋ํ์ ์ผ๋ก ์ด์งํธ๋ฆฌ ๊ฒ์)
public int binarySearch(int key, int[] arr, int start, int end) { if (start > end) { return -1; } int mid = (start + end) / 2; if (arr[mid] == key) { return mid; } else if (arr[mid] > key) { return binarySearch(key, arr, start, mid-1); } else { return binarySearch(key, arr, mid-1, end); } }
์ ์ฌ์ง์์ ์ ๋ ฌ๋ ์ซ์ 1~9์์ key๊ฐ์ด 6์ธ ์ซ์๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ฒ์ ์ค๊ฐ์ธ 5๋ถํฐ ํ์ธํ์ฌ ๋น๊ตํ๋ค. key๊ฐ์ด ๋ ํฌ๋ฏ๋ก ์ผ์ชฝ์ ๋น๊ตํ ํ์๊ฐ ์๊ณ , ์ค๋ฅธ์ชฝ๋ง ๋น๊ตํ๋ค.
์ค๋ฅธ์ชฝ์์ ์ค๊ฐ์ธ 7์ ๋น๊ตํ๋ค. key๊ฐ์ด ๋ ์์ผ๋ฏ๋ก ์ค๋ฅธ์ชฝ์ ๋น๊ตํ ํ์๊ฐ ์๊ณ , ์ผ์ชฝ๋ง ๋น๊ตํ๋ค.
๋จ์ ๊ณต๊ฐ์์ ์ค๊ฐ์ธ 6์ ๋น๊ตํ๋ค. key๊ฐ๊ณผ ๋์ผํ๋ฏ๋ก ์ข ๋ฃํ๋ค.
์ด๋ฐ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ์ฐพ์ ๋๋ง๋ค ๋ฐํ์ฉ ์์ด์ง๋ ์๊ณ ๋ฆฌ์ฆ์ O(log n) ์ด๋ผ๊ณ ํ๋ค.
์ด๋ฐ ๋ฐฉ์์ ์์ฐจ ๊ฒ์ O(n)๋ณด๋ค๋ ํจ์ฌ ๋น ๋ฅด๋ค.
๐จ O(2^n) - Exponential Time
ํผ๋ณด๋์น(Fibonacci) ์์ด๋ก ๋น์ ํ ์ ์๋ค
- ๋งค๋ฒ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค 2๋ฒ์ฉ ํธ์ถํ๊ฒ ๋๋ค.
- ์ด ํธ์ถํ๋ ํ์๋ ํธ๋ฆฌ์ ๋์ด๋งํผ ๋ฐ๋ณต๋๋ค. ๋ฐ๋ผ์ O(2^n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
- ์ฆ, ๋ชจ๋ ํจ์์ ํธ์ถ์ ์ผ์ผ์ด ๊ณ์ฐํด์ผ ํ๋ค.
- (์ด ์ค๋ช ์ ํผ๋ณด๋์น ์์ด์ ์๋ฐ ํจ์๋ก ๋ง๋ 2๋ฒ์งธ ๋ฒ์ ๊ณผ ๋์ผํ๋ค.)
public int fibonacci(int n, int[] r) { if(n <= 0) return 0; else if (n == 1) return r[n] = 1; return r[n] = fibonacci(n-1, r) + fibonacci(n-2, r); }
public int fibonacci(int n) { if(n <= 1) return n; else return fibonacci(n-1) + fibonacci(n-2); }
๋ค์์ ์๋ฐ์ ๊ธฐ๋ณธ ์ ๋ ฌ ์ฝ๋์ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ๋ ์ฝ๋๋ค. ์๋ฐ์ ๊ธฐ๋ณธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ โ๋์ผ ํผ๋ฒ ํต ์๊ณ ๋ฆฌ์ฆโ์ ์ฌ์ฉํ๋ฉฐ, ํ๊ท ์๊ฐ ๋ณต์ก๋ O(NlogN), ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(N2)์ด๋ค.
01. ์ํ ์๊ฐ ์ธก์
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int []arr = new int [100_000_000];
for(int i=0; i<100_000_000; i++) {
arr[i] = (int) Math.random();
}
long before = System.currentTimeMillis(); //์ฝ๋ ์คํ ์ ์๊ฐ
//์คํํ ์์ค์ฝ๋
Arrays.sort(arr);
long after = System.currentTimeMillis(); // ์ฝ๋ ์คํ ํ ์๊ฐ
long diff = (after - before); //๋ ์๊ฐ์ ์ฐจ์ด
System.out.println("์๊ฐ์ฐจ์ด(๋ฐ๋ฆฌ์ธ์ปจ์ฆ) : "+diff);
}
}
02. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int []arr = new int [100_000_000];
for(int i=0; i<100_000_000; i++) {
arr[i] = (int) Math.random();
}
// Garbage Collection์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ
System.gc();
// ์คํ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์กฐํ
long before = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("Used Memory : " + before);
// ํ๋ก๊ทธ๋จ ์์ค์ฝ๋
Arrays.sort(arr);
// Garbage Collection์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ
System.gc();
// ์คํ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์กฐํ
long after = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
// ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก์
long usedMemory = (before - after)/1024;
System.out.println("Used Memory(MB): " + usedMemory);
}
}