๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋‚˜์˜ ๋ชจ์–‘

026 | Time Complexity ๋ณธ๋ฌธ

SEB/TIL

026 | Time Complexity

kexon 2022. 7. 28. 21:06

๐Ÿ’™ ์‹œ๊ฐ„ ๋ณต์žก๋„

์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋‹ต์„ ์ฐพ๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€๋„ ์ค‘์š”ํ•˜๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ญ๊ฐ€ ์žˆ์„์ง€, ์ด๊ฒŒ ์ œ์ผ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋งž์„์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ฏผํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

๐Ÿค ๊ฐœ๋…

  • ์ž…๋ ฅ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•  ๋•Œ, ์—ฐ์‚ฐ ํšŸ์ˆ˜์— ๋น„ํ•ด ์–ผ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š”์ง€๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ
  • ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ = ์ž…๋ ฅ๊ฐ’์ด ์ปค์ง์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œ๊ฐ„์˜ ๋น„์œจ์„ ์ตœ์†Œํ™”ํ•œ ๊ฒƒ

๐Ÿค ๋ถ„๋ฅ˜

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ(Worst Case): ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ, ๋น… ์˜ค(Big-O) ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ
  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ(Best Case): ์ตœ์„ ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ, ๋น… ์˜ค๋ฉ”๊ฐ€(Big-Ω) ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ
  • ํ‰๊ท ์ ์ธ ๊ฒฝ์šฐ(Average Case): ํ‰๊ท  ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋น… ์„ธํƒ€(Big-θ) ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ

๐Ÿ’™ Big-O ํ‘œ๊ธฐ๋ฒ•

๐Ÿค ๋ชฉ์ 

  • ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ œ๊ฑฐํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„์„์„ ์‰ฝ๊ฒŒ ํ•จ

๐Ÿค ๋ณตํ•ฉ์„ฑ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„
  • ๊ณต๊ฐ„ ๋ณต์žก๋„
  • ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜๋ก ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ํฌ๋ฉฐ(์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๊น€), ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜๋ก ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋จ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„์—์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€, ์ •ํ•ด์ง„ ํ‘œํ˜„์‹์—์„œ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” n์˜ ๋‹จ์œ„
  • ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ถ„์„ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ž…๋ ฅ๊ฐ’ n์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ง€๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ ⇒ Big-O๋กœ ์ •์˜

๐Ÿ’ซ O(1) - ์ƒ์ˆ˜/์ผ์ •ํ•œ ๋ณต์žก๋„ (Constant Complexity)

์ž…๋ ฅ๊ฐ’์ด ์ฆ๊ฐ€ํ•ด๋„ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š์Œ

๐Ÿ’ซ O(log n) - ๋กœ๊ทธ ๋ณต์žก๋„ (Logarithmic Complexity)

์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋ฐฐ์› ๋˜ BST(Binary Search Tree)์—์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ํƒ์ƒ‰ํ•  ๋•Œ, ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋…ผ๋ฆฌ

  • ์˜ˆ์‹œ
    • n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ณ„์†ํ•ด์„œ ๋ฐ˜์”ฉ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” log2(n)์ด๊ณ  ๋น…์˜คํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด O(log n)
int i = n;
while (i > 0) {
  i /= 2;
}

๐Ÿ’ซ O(n) - ์„ ํ˜•/์ง์„ ์  ์‹œ๊ฐ„ (Linear Complexity)

์ž…๋ ฅ๊ฐ’์˜ ์ฆ๊ฐ€์™€ ์‹œ๊ฐ„์ด ๊ฐ™์€ ๋น„์œจ๋กœ ์ฆ๊ฐ€

  • ์˜ˆ์‹œ_1
    • for๋ฌธ ๋‚ด ์ฝ”๋“œ๊ฐ€ arr ๊ธธ์ด๋งŒํผ ์‹คํ–‰๋จ. arr ๊ธธ์ด๋ฅผ n์ด๋ผ๊ณ  ํ•˜๋ฉด O(n)์ด๋ผ๊ณ  ๋นจ๋ฆฌ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ
public int chooseOne(int[] arr, int index) {
  return arr[index];
}

int[] arr = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i < arr.length; i += 1){
  int result = chooseOne(arr, i);
  System.out.println(result);
}
  • ์˜ˆ์‹œ_2
    • ์ฒซ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์€ n๋ฒˆ์„ ์‹คํ–‰ํ•˜๊ณ , ๋‘๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์€ n-1๋ฒˆ ๋ฐ˜๋ณต
int a = 0, 
int b = 0;

for(int i = 1; i < n; i+=1) {
    a += 1;
}

for(int j = 2; j < n; j+=1) {
    b += 1;
}

๐Ÿ’ซ O(n^2) - 2์ฐจ ์‹œ๊ฐ„ (Quadratic Complexity)

์ž…๋ ฅ๊ฐ’์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ด n์˜ ์ œ๊ณฑ์ˆ˜์˜ ๋น„์œจ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ๊ฐ’์ด 1์ผ ๋•Œ, 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— 5๋ผ๋Š” ์ž…๋ ฅ๊ฐ’์„ ์ค„ ๋•Œ 25์ดˆ(5^2)๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2)๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

  • ์˜ˆ์‹œ
    • n๊ฐœ์˜ i์— ๋Œ€ํ•ด ๊ฐ๊ฐ n๊ฐœ์˜ j๋ฅผ ๊ฐ€์ง€๊ณ  ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•จ. Big-O notation์—์„œ๋Š” ๊ณ„์ˆ˜์™€ ์ƒ์ˆ˜ํ•ญ์„ ์ œ์™ธํ•˜๊ณ  ํ‘œํ˜„
for(int i = 0; i < n; i++) {
  for(int j = 0; j < n; j++) {
    // do something with i and j
  }
}

๐Ÿ’ซ O(2^n) - ์ง€์ˆ˜/๊ธฐํ•˜๊ธ‰์ˆ˜์  ์‹œ๊ฐ„ (Exponential Complexity)

๊ฐ€์žฅ ๋Š๋ฆฐ ๋ณต์žก๋„๋กœ, ๊ตฌํ˜„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ง€์ˆ˜ ์‹œ๊ฐ„์ด๋ผ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด O(2^n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๐Ÿค ํ€ด์ฆˆ

๋”๋ณด๊ธฐ

โ“๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ A, B์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฐ๊ฐ O(n), O(log n)์ด๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜ B๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ A๋ณด๋‹ค ํ•ญ์ƒ ๋น ๋ฅด๋‹ค?

โ—ํ•ญ์ƒ ๋น ๋ฅธ ๊ฒƒ์€ ์•„๋‹˜

  • n์ด ์ ์  ์ปค์งˆ์ˆ˜๋ก B๊ฐ€ ๋” ๋นจ๋ผ์ง
    • input 1๊ฐœ:  ๋‘˜ ๋‹ค 1
    • input 2๊ฐœ:  1 / 2
    • input 4๊ฐœ: 2 / 4
    • input 8๊ฐœ: 3 / 8

โ“ ๋‹ค์Œ ์Šคํƒ์„ ํ‘œํ˜„ํ•œ ์ฝ”๋“œ์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š”?

class Stack {

  private ArrayList<Integer> listStack = new ArrayList<Integer>();

  public void push(Integer data) {
    listStack.add(data);
  }

  public Integer pop() {
    return listStack.remove(listStack.size() - 1);
  }

  public boolean contains(Integer data) {
    return listStack.contains(data);
  }
}

Stack stack = new Stack();

โ—O(1), O(n)

  • O(1): ์Šคํƒ์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ๋บ„ ๋•Œ ๋ฐœ์ƒ (๋„ฃ์„ ๋•Œ์™€ ๋บ„ ๋•Œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ๋บŒ)
  • O(n)์Šคํƒ์„ ํƒ์ƒ‰ (์Šคํƒ ํ•œ ๋ฒˆ ์ˆœํšŒ)

'SEB > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

027 | Permutation & Combination, Greedy Implementation  (0) 2022.07.29
026 | Greedy, Brute-Force, Binary Search Algorithm  (0) 2022.07.29
024 | Data Structure - Tree, Graph  (0) 2022.07.26
023 | Data Structure - Stack & Queue  (0) 2022.07.25
019 | Java - I/O, Thread, JVM  (0) 2022.07.19
Comments