😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[Coding Interview University] λΉ…μ˜€(Big-O)ν‘œκΈ°λ²• λ³Έλ¬Έ

πŸ‘©‍πŸ’» 컴퓨터 ꡬ쑰/Computer Science

[Coding Interview University] λΉ…μ˜€(Big-O)ν‘œκΈ°λ²•

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 6. 28. 15:01
728x90
λ°˜μ‘ν˜•

<λ³Έ λΈ”λ‘œκ·ΈλŠ” μ½”λ”©μΈν„°λ·°λŒ€ν•™ λ‹˜μ˜ Gitκ³Ό μ„œμ μ„ μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

 

🫧 λΉ„μœ ν•˜κΈ°

파일 크기가 μž‘λ‹€λ©΄ ? 온라인으둜 전솑

파일 크기가 λ¬΄μ§€λ§‰ν•˜κ²Œ 크닀면 ? μš΄μ „ or λΉ„ν–‰κΈ°πŸš€

 

🫧 μ‹œκ°„ λ³΅μž‘λ„

점근적 μ‹€ν–‰ μ‹œκ°„ (asymptotic runtime), big-O μ‹œκ°„ κ°œλ…

  • 온라인 전솑 : O(s), sλŠ” 파일의 크기
    • 파일의 크기가 증가함에 따라 전솑 μ‹œκ°„μ΄ μ„ ν˜•μ μœΌλ‘œ 증가
  • λΉ„ν–‰κΈ° 전솑 : 파일의 크기 상관없이 O(1)
    • μƒμˆ˜μ‹œκ°„λ§ŒνΌ μ†Œμš”

❀️ big-O

: μ‹œκ°„μ˜ μƒν•œ

: λ°°μ—΄μ˜ λͺ¨λ“  값을 좜λ ₯ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

: O(n) 뿐만 μ•„λ‹ˆλΌ, O(n^3) ν˜Ήμ€ O(n) 보닀 큰 μ–΄λ–€ μˆ˜ν–‰ μ‹œκ°„μœΌλ‘œ κ°€λŠ₯

 

❀️ big-٠(omega)

: λ“±κ°€ or ν•˜ν•œ

: Ω(n) 뿐만 μ•„λ‹ˆλΌ, Ω(log N) ν˜Ήμ€ Ω(1) 둜 ν‘œν˜„ κ°€λŠ₯

 

❀️ big-θ (theta)

: O와 Ω λ‘˜ λ‹€ 의미 (λ”± λ§žλŠ” μˆ˜ν–‰ μ‹œκ°„)

: O(n) μ΄λ©΄μ„œ Ω(n) 이라면, μˆ˜ν–‰ μ‹œκ°„μ€ θ(n) 둜 ν‘œν˜„ κ°€λŠ₯

 

 


πŸ”Ž 퀡 μ •λ ¬ 관점
”μΆ•”이 λ˜λŠ” μ›μ†Œ ν•˜λ‚˜λ₯Ό λ¬΄μž‘μœ„λ‘œ 뽑은 λ’€, 이보닀 μž‘μ€ μ›μ†Œλ“€μ€ μ•žμ—, 큰 μ›μ†Œλ“€μ€ 뒀에 놓이도둝 ν•œλ‹€
κ·Έ κ²°κ³Ό, λΆ€λΆ„ μ •λ ¬ μ™„μ„±λ˜κ³  μ™Όμͺ½ 였λ₯Έμͺ½ 뢀뢄을 이와 λΉ„μŠ·ν•˜κ²Œ μž¬κ·€μ μœΌλ‘œ μ •λ ¬ν•œλ‹€

 

🧑 μ΅œμ„ μ˜ 경우

: λͺ¨λ“  μ›μ†Œκ°€ λ™μΌν•˜λ‹€λ©΄ λ‹¨μˆœνžˆ 배열을 ν•œμ°¨λ‘€ μˆœνšŒν•˜κ³  끝

: μˆ˜ν–‰ μ‹œκ°„μ€ O(n)

🧑 μ΅œμ•…μ˜ 경우

: λ°°μ—΄μ—μ„œ κ°€μž₯ 큰 μ›μ†Œκ°€ 좕이 λœλ‹€λ©΄, 절반 크기가 μ•„λ‹Œ κ³ μž‘ ν•˜λ‚˜ 쀄어든 크기의 λΆ€λΆ„ λ°°μ—΄λ‘œ λ‚˜λ‰˜κ²Œ λœλ‹€

: μˆ˜ν–‰ μ‹œκ°„μ€ O(n^2)

🧑 ν‰κ· μ˜ 경우

: μˆ˜ν–‰ μ‹œκ°„μ€ O(nlogn)

 

🫧 곡간 λ³΅μž‘λ„

: λ©”λͺ¨λ¦¬ or 곡간

 

🫧 μƒμˆ˜ν•­μ€ λ¬΄μ‹œν•˜λΌ

: λ‹¨μˆœνžˆ 증가 λΉ„μœ¨μ„ λ‚˜νƒ€λ‚΄λ―€λ‘œ, μƒμˆ˜ν•­ λ¬΄μ‹œν•˜κΈ°

 

🫧 지배적이지 μ•Šμ€ 항은 λ¬΄μ‹œν•˜λΌ

: μ΅œκ³ μ°¨ν•­ 보닀 μž‘μ€ 항듀은 λ¬΄μ‹œν•΄λ„ λœλ‹€

ex) O(n^2 + n) 은 O(n^2)

 

🫧 μ—¬λŸ¬ λΆ€λΆ„μœΌλ‘œ 이루어진 μ•Œκ³ λ¦¬μ¦˜: λ§μ…ˆ vs κ³±μ…ˆ

: μ•Œκ³ λ¦¬μ¦˜μ΄ “A λλ‚œ ν›„ B μˆ˜ν–‰ν•˜λΌ” → A + B

: μ•Œκ³ λ¦¬μ¦˜μ΄ “A ν•  λ•Œ B μˆ˜ν–‰ν•˜λΌ” → A * B

 

🫧 μƒν™˜ μ‹œκ°„

: ArrayList λŠ” λ°°μ—΄μ˜ μ—­ν•  + 크기가 자유둜운 자료ꡬ쑰

: x개의 μ›μ†Œλ₯Ό μ‚½μž…ν–ˆμ„ λ•Œ ν•„μš” μ‹œκ°„μ€ O(2x), λΆ„ν•  μƒν™˜ν•΄μ„œ μ‚½μž… ν•œλ²ˆμ— ν•„μš”ν•œ μ‹œκ°„μ€ O(1)

 

🫧 log N μˆ˜ν–‰ μ‹œκ°„

: 이진 탐색(binary search) λŠ” n개의 μ •λ ¬λœ μ›μ†Œκ°€ λ“€μ–΄ μžˆλŠ” λ°°μ—΄μ—μ„œ μ›μ†Œ xλ₯Ό 찾을 λ•Œ μ‚¬μš©

  • λ¨Όμ € μ›μ†Œ x와 λ°°μ—΄μ˜ 쀑값을 비ꡐ
    • x === 쀑간값 λ§Œμ‘±ν•˜λ©΄ λ°˜ν™˜
    • x < 쀑간값 λ§Œμ‘±ν•˜λ©΄ λ°°μ—΄μ˜ μ™Όμͺ½ μž¬νƒμƒ‰
    • x > 쀑간값 λ§Œμ‘±ν•˜λ©΄ λ°°μ—΄μ˜ 였λ₯Έμͺ½ μž¬νƒμƒ‰
  • μ›μ†Œ n개의 λ°°μ—΄μ—μ„œ μ‹œμž‘
    • ν•œ 단계 지날 수둝 n/2개, n/4개둜 쀄어든닀

: 2^k = n μ—μ„œ kλŠ” log(n)

: μ›μ†Œμ˜ 개수라 μ ˆλ°˜μ”© 쀄어든닀면 κ·Έ 문제의 μ‹€ν–‰ μ‹œκ°„μ€ O(log n)

: κ· ν˜• 이진 탐색 트리 (balanced binary search tree) μ—μ„œλ„ O(log n)

: 맀 λ‹¨κ³„λ§ˆλ‹€ μ›μ†Œμ˜ λŒ€μ†Œλ₯Ό λΉ„κ΅ν•œ λ’€ μ™Όμͺ½ ν˜Ήμ€ 였λ₯Έμͺ½μœΌλ‘œ 내렀감

: 각 λ‹¨κ³„μ—μ„œ 검색해야 ν•  λ…Έλ“œμ˜ κ°œμˆ˜κ°€ μ ˆλ°˜μ”© μ€„μ–΄λ“œλ―€λ‘œ, 문제 곡간 λ˜ν•œ μ ˆλ°˜μ”© 쀄어듦

 

🫧 μž¬κ·€μ μœΌλ‘œ μˆ˜ν–‰ μ‹œκ°„ κ΅¬ν•˜κΈ°

: λ‹€μˆ˜μ˜ 호좜둜 이루어진 μž¬κ·€ ν•¨μˆ˜μ—μ„œ μˆ˜ν–‰ μ‹œκ°„μ€ O(λΆ„κΈ°^깊이)둜 ν‘œν˜„

: λΆ„κΈ°(branch)λž€ μž¬κ·€ ν•¨μˆ˜κ°€ μžμ‹ μ„ μž¬ν˜ΈμΆœν•˜λŠ” 횟수

 

🫧 예제 및 μ—°μŠ΅ 문제

πŸ’› 예제 1

➑️ O(n)

void foo(int[] array) {
	int sum = 0;
	int product = 1;
	
	for (int i = 0; i < array.length; i++) {
		sum+= array[i];
	}

	for (int i = 0; i < array.length; i++) {
		product *= array[i];
	}

	System.out.println(sum + ", " + product);
}

πŸ’› 예제 2

➑️ O(n^2)

void printPairs(int[] array) {
	for (int i = 0; i < array.length; i++) {
		for (int j = 0; j < array.length; j++) {
			System.out.println(array[i] + ", " + array[j]);
		}
	}
}

πŸ’› 예제 3

➑️ O(n^2)

void printUnorderedPairs(int[] array) {
	for (int i = 0; i < array.length; i++) {
		for (int j = i + 1; j < array.length; j++) {
			System.out.println(array[i] + ", " + array[j]);
		}
	}
}

πŸ’› 예제 4

➑️ O(ab)

void printUnorderedPairs(int[] arrayA, int[] arrayB) {
	for (int i = 0; i < arrayA.length; i++) {
		for (int j = 0; j < arrayB.length; j++) {
			if (arrayA[i] < arrayB[i]) {
				System.out.println(arrayA[i] + ", " + arrayB[j]);
			}
		}
	}
}

 

728x90
λ°˜μ‘ν˜•
Comments