๐Ÿ“š ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ Big-O ํ‘œ๊ธฐ๋ฒ•

temprmnยท2023๋…„ 8์›” 3์ผ
0
post-thumbnail

์‹œ๊ฐ„ ๋ณต์žก๋„๋ž€?

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œย ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœย 1์ดˆ = 1์–ต ๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋ฌธ์ œ์— ์‹œ๊ฐ„ ์ œํ•œ์ดย 2์ดˆ๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉดย 2์–ต ๋ฒˆ์˜ ์—ฐ์‚ฐ ์•ˆ์— ๋‹ต์ด ๋‚˜์™€์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋”ฐ์งˆ ๋•Œ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์™€ ์ œํ•œ ์‹œ๊ฐ„์„ ๋ณธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์— ์•Œ๋งž์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์—ฐ์‚ฐ ํšŸ์ˆ˜์€ย ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„๋ณต์žก๋„ 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))

Big-0 ํ‘œ๊ธฐ๋ฒ•

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);
        
    }
}

profile
`ISFJ` T 49% F 51% /

0๊ฐœ์˜ ๋Œ“๊ธ€