Bibi's DevLog ๐ค๐
[TIL - Codesquad] ๋น ์ค ํ๊ธฐ๋ฒ ๋ณธ๋ฌธ
[20.01.12]
์ค๋์ ๋ฏธ์ ์ ์ถํ๋๋ผ ์ฝ๋ฉ์ ๋ง์ด ํด์ ๊ณต๋ถ๋ ๋ง์ด ํ์ง ๋ชปํ๋ค.
๊ทธ๋ฃน์๋ค์ด ์ถ์ฒํ ๋น ์คํ๊ธฐ๋ฒ์ ๋ํ ์์์ ๋ณด๊ณ ์ ๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ง๋ฌด๋ฆฌํ๊ธฐ๋ก ํ๋ค.
TIL
๋น ์ค ํ๊ธฐ๋ฒ
www.youtube.com/watch?v=6Iq5iMCVsXA&feature=youtu.be
๋ณต์ก๋ Complexity ๋ถ์
- ์ฑ๋ฅ ์ธก์ ์ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋.
- ๊ณต๊ฐ๋ณต์ก๋์ ์๊ฐ๋ณต์ก๋ ๋ถ์์ ๊ฐ์ฅ ๋ง์ด ํ์ฉ.
๋น ์ค ํ๊ธฐ๋ฒ Big-O notation
- ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ํ์ ์ผ๋ก ํํํด ์ฃผ๋ ํ๊ธฐ๋ฒ.
- ๋น
์คํ๊ธฐ๋ฒ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋์ ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ํํํ ์ ์๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ์ค์ running time์ ํ์ํ๋ ๊ฒ์ด๋ผ๊ธฐ๋ณด๋ค,
๋ฐ์ดํฐ / ์ฌ์ฉ์์ ์ฆ๊ฐ์จ์ ๋ฐ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์์ธกํ๋ ๊ฒ์ด ๋ชฉํ์.
( -> Drop Constant : ์์์ ๊ฐ์ ์ซ์๋ค์ ๋ชจ๋ 1์ด ๋จ - ๋งจ ๋์์ ๋ค์ ์ค๋ช
. )
์๋๋ ๊ธฐ๋ณธ์ ์ธ ๋น ์ค ํ๊ธฐ๋ฒ์ ์์๋ค์ด๋ค.
1. O(1) ์๊ณ ๋ฆฌ์ฆ : constant time ์์ ์๊ฐ
: ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ธ์ ๋ ์ผ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ.
O(1)์๊ณ ๋ฆฌ์ฆ ์์ ์ฝ๋
int function(int[] numArr) {
return (numArr[0] == 0) ? true : false;
}
-> ๋งค๊ฐ๋ณ์์ธ numArr์ด ์๋ฌด๋ฆฌ ์ปค๋ ์ผ์ ํ ์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ.
O(1)์๊ณ ๋ฆฌ์ฆ ๊ทธ๋ํ
(x์ถ : ๋ฐ์ดํฐ์ ํฌ๊ธฐ data, y์ถ : ์ฒ๋ฆฌ์๊ฐ time)
: ๋ฐ์ดํฐ๊ฐ ์๋ฌด๋ฆฌ ์ฆ๊ฐํด๋ ์ฒ๋ฆฌ์๊ฐ์ด ์ผ์ ํ๋ค. ์ฆ, ์ฑ๋ฅ์ ๋ณํจ์ด ์๋ค.
2. O(n) ์๊ณ ๋ฆฌ์ฆ : liner time (์ ํ ์๊ฐ)
: ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๋น๋กํ์ฌ ์ฒ๋ฆฌ์๊ฐ์ด ์ฆ๊ฐํ๋ ์๊ณ ๋ฆฌ์ฆ.
O(n) ์๊ณ ๋ฆฌ์ฆ ์์ ์ฝ๋
void function(int[] numArr) {
for (int i = 0; i < numArr.length; i++ {
System.out.println(i);
}
}
-> numArr ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ n์ด๋ผ๋ฉด for๋ฌธ๋ n๋ฒ์ ๋ฐ๋ณตํ๊ฒ ๋๋ค.
n์ด ํ๋ ์ปค์ง ๋๋ง๋ค for๋ฌธ์ ๋ฐ๋ณตํ์๋ n๋ฒ ์ฆ๊ฐํ๋ค.
์ฆ, n์ ์ฆ๊ฐ์จ๋งํผ ์ฒ๋ฆฌ์๊ฐ๋ ์ฆ๊ฐํ๋ค.
O(n) ์๊ณ ๋ฆฌ์ฆ ๊ทธ๋ํ
: ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฒ๋ฆฌ์๊ฐ๋ ๋น๋กํด์ ์ฆ๊ฐํ๋ค.
( ๋ฐ์ดํฐ์ ์ฆ๊ฐ์จ = ์ฒ๋ฆฌ์๊ฐ ์ฆ๊ฐ์จ -> ๊ทธ๋ํ๋ ์ธ์ ๋ ์ง์ ์ผ๋ก ํํ๋๋ค)
3. O(n^2) ์๊ณ ๋ฆฌ์ฆ : (์ค ์ ์คํ์ด)
O(n^2) ์๊ณ ๋ฆฌ์ฆ ์์ ์ฝ๋
void function(int[] n) {
for (int i = 0; i < n.length; i++) {
for (int j = 0; j < n.length; j++) {
System.out.println(i + j);
}
}
}
-> ์์ ๊ฐ์ ์ด์ค๋ฃจํ ์ฝ๋์ผ ๋ O(n^2)์ด ๋๋ค.
n๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ง๋ค ๋ฐ๋ณต๋ฌธ์ ์คํํ๊ณ , ๊ฐ ๋ฐ์ดํฐ ๋ด์์๋ ๋ฐ๋ณต๋ฌธ์ ์คํํ๋ฏ๋ก
์คํํด์ผ ํ๋ ํ์๋ ์์ ๊ทธ๋ฆผ์ฒ๋ผ n^2 ํ๊ฐ ๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ปค์ง์๋ก ์ฒ๋ฆฌ์๊ฐ์ ๋ถ๋ด์ด ์ปค์ง๋ค.
O(n^2) ์๊ณ ๋ฆฌ์ฆ ๊ทธ๋ํ
-> ์ฒ์์๋ ์กฐ๊ธ์ฉ ์์นํ๋ค๊ฐ, ๋ฐ์ดํฐ๊ฐ ์ปค์ง์๋ก ์ฒ๋ฆฌ์๊ฐ์ด ์ ๊ณฑ์ผ๋ก ์ฆ๊ฐํด ๊ทธ๋ํ๊ฐ ์์ง์ ๊ฐ๊น์์ง๋ค. (๊ณก์ ํ)
4. O(nm) ์๊ณ ๋ฆฌ์ฆ (์ค ์ ์ )
O(nm) ์๊ณ ๋ฆฌ์ฆ ์์ ์ฝ๋
void function(int[] n, int[] m) {
for (int i = 0; i < n.length; i++) {
for (int j = 0; j < m.length; j++) {
System.out.println( i + j );
}
}
}
-> ๊ฐ์ ์ด์ค๋ฃจํ๋ฌธ์ด๋ผ O(n^2)์ ๋น์ทํด ๋ณด์ด์ง๋ง,
numArr1์ ๋ ๋ฒ ๋๋ฆฌ๋ ๊ฒ ์๋๋ผ numArr1์ numArr2๋งํผ ๋๋ฆฌ๋ ๊ฒ์ด๋ค. (ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ฃผ์)
-> n์ m๋งํผ ๋ฐ๋ณตํ๊ฒ ๋๋ฏ๋ก ์ ๊ทธ๋ฆผ์ฒ๋ผ n*m์ด ๋๋ค.
n์ ์์ฃผ ํฐ ์, m์ ์์ ์ ์ผ ์๋ ์๋ค.
O(nm)์ ๊ทธ๋ํ
-> O(n^2)์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ์๋ก ๊ทธ๋ํ๊ฐ ์์ง์ ๊ฐ๊น์์ง๋ค (๊ณก์ ํ).
5. O(n^3) ์๊ณ ๋ฆฌ์ฆ : polynomial time / cubic time (๋คํญ ์๊ฐ)
O(n^3) ์์ ์ฝ๋
void function(int[] n) {
for (int i = 0; i < n.length; i++) {
for (int j = 0; j < n.length; j++) {
for (int k = 0; < k.length; k++) {
System.out.println(i + j + k);
}
}
}
}
-> ์ผ์ค๋ฃจํ๋ฌธ. n์ ์ธ ๋ฒ ๋ฐ๋ณตํด์ ๋๋ฆฐ ๊ฒฝ์ฐ n์ ์ธ์ ๊ณฑ์ด ๋๋ค.
-> O(n)์ ์ง์ , O(n^2)๋ ๋ฉด์ , O(n^3)์ ๋ถํผ = ํ๋ธ ๊ฐ ๋๋ค.
O(n^3) ๊ทธ๋ํ
-> O(n^2)์ ๋น์ทํ ๊ณก์ ํ์ด์ง๋ง, ์ธ์ ๊ณฑ์ด๋ฏ๋ก ๊ธฐ์ธ๊ธฐ๊ฐ ๋ ๊ธ๊ฒฉํ๊ฒ ์์ง์ ๊ฐ๊น์์ง๋ค (๊ณก์ ํ).
๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฐ๋ผ ์ฒ๋ฆฌ์๊ฐ์ด ๋์ฑ ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐํ๋ค.
6. O(2^n) ์๊ณ ๋ฆฌ์ฆ : exponential time ์ง์ ์๊ฐ
ํผ๋ณด๋์น ์์ด.
์์ ์ ๋ ๊ฐ๋ฅผ ๋ํด ๋ค์ ์๋ฅผ ๋ง๋ ๋ค.
1, 1, 2, 3, 5, 8..
O(2^n) ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ฝ๋
์ฌ๊ท๋ฅผ ํ์ฉํด ํผ๋ณด๋์น ์์ด์ ๊ตฌํ๋ ์ฝ๋๊ฐ O(2^n)์๊ณ ๋ฆฌ์ฆ์ ํด๋นํ๋ค.
-> ์ด์ ์ซ์์ ์ ์ ์ซ์๋ฅผ ์์์ผ ๋์ ๋ํด ๋ค์ ์ซ์๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์, ๋งค๋ฒ ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ ๋ฒ์ฉ ๋ ํธ์ถํ๊ฒ ๋๋ค.
-> ๋งค๋ฒ ํจ์๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ๋ ๋ฒ์ฉ ๋ ํธ์ถํ๊ฒ ๋๋๋ฐ, ๊ทธ๊ฒ์ ํธ๋ฆฌ์ ๋์ด (k) ๋งํผ ๋ฐ๋ณตํ๋ค.
O(2^n) ๊ทธ๋ํ
-> O(n^2), O(n^3)๋ณด๋ค๋ ๊ธ๊ฒฉํ๊ฒ ๊ทธ๋ํ๊ฐ ์์ง์ ๊ฐ๊น์์ง๋ค(๊ณก์ ํ).
๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฐ๋ผ ์ฒ๋ฆฌ์๊ฐ์ด ๊ฐ์ฅ ๊ธ๊ฒฉํ๊ฒ ๋์ด๋๋ค.
6-1. O(m^n) ์๊ณ ๋ฆฌ์ฆ - ์ง์ ์๊ฐ
์์ O(2^n)์๊ณ ๋ฆฌ์ฆ์ด 2๊ฐ์ฉ n๋ฒ ๋์ด๋๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ,
O(m^n)์ m๊ฐ์ฉ n๋ฒ ๋์ด๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
7. O(log n) ์๊ณ ๋ฆฌ์ฆ
O(log n) ์๊ณ ๋ฆฌ์ฆ ์์ ์ฝ๋
- ์ด์ง๊ฒ์ binary search ์ฝ๋๊ฐ O(log n)์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ธ ์ฝ๋์ด๋ค.
๋งค๋ฒ ์ฐพ๋ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๊ฐ๋ณด๋ค ํฐ์ง/์์์ง ๋น๊ตํ์ฌ ๊ฒ์๋์์ ์ค์ฌ๋๊ฐ.
-> ํ ๋ฒ ์ฒ๋ฆฌ๊ฐ ์งํ๋ ๋ ๋ง๋ค ๊ฒ์ํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ด ์ ๋ฐ์ฉ ์ค์ด๋ฆ - O(log n)์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํจ.
O(log n) ์๊ณ ๋ฆฌ์ฆ ๊ทธ๋ํ
-> ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํด๋ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ฐจ์ด๋์ง ์๋๋ค.
8. O(sqrt(n)) ์๊ณ ๋ฆฌ์ฆ - ์ค ์คํ์ด ๋ฃจํธ n
sqare root = ์คํ์ด ๋ฃจํธ = ์ ๊ณฑ๊ทผ.
Drop Constants ์์ ๋ฒ๋ฆผ (์์ ๋ฌด์)
- ๋น
์ค ํ๊ธฐ๋ฒ์์ ๊ผญ ์์๋์ด์ผ ํ ๊ฐ๋
.
- ๋น
์ค ํ๊ธฐ๋ฒ์์ ์์๋ ๊ณผ๊ฐํ๊ฒ ๋ฒ๋ฆฐ๋ค. ์ฆ, ์ด๋ค ์์๋ 1๋ก ์ทจ๊ธํ๋ค.
์๋ฅผ ๋ค์ด,
void function(int[] n) {
for (int i = 0; i < n.length; i++) {
System.out.println(i);
}
for (int i = 0; i < n.length; i++) {
System.out.println(i);
}
}
void function(int[] n) {
for (int i = 0; i < n.length; i++) {
for (int j = 0; j < n.length; j++) {
System.out.println(i + j);
}
}
for (int i = 0; i < n.length; i++) {
for (int j = 0; j < n.length; j++) {
System.out.println(i + j);
}
}
}
1๋ฒ ์ฝ๋๋ธ๋ญ์ n์ ๋ ๋ฒ ๋๋ฆฌ๋๊น ์ค์ ๋ก๋ O(2n)์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
2๋ฒ ์ฝ๋๋ธ๋ญ์ ์ด์ค๋ฃจํ๋ฅผ ๋ ๋ฒ ๋ฐ๋ณตํ๋ฏ๋ก ์ค์ ๋ก๋ O(n^2+n^2) = O(2n^2)์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
ํ์ง๋ง ๋น
์ค ํ๊ธฐ๋ฒ์ผ๋ก๋ ๋ ๊ฒฝ์ฐ ๋ชจ๋ 2๋ผ๋ ์์๋ฅผ ์์ ๋ฒ๋ฆฌ๊ณ , ๊ฐ๊ฐ O(n), O(n^2)๋ผ๊ณ ๋ง ํ์ํ๋ค.
Why? ๋น
์ค ํ๊ธฐ๋ฒ์ ์ค์ ์๊ณ ๋ฆฌ์ฆ์ running time(์คํ์๊ฐ)์ ์ฌ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ,
์ฅ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ์๊ฐ์ ์ฆ๊ฐ์จ์ ์์ธกํ๊ธฐ ์ํด ๋ง๋ ํ๊ธฐ๋ฒ์ด๊ธฐ ๋๋ฌธ.
์์๋ ๊ณ ์ ๋ ์ซ์์ด๋ฏ๋ก, ์ฆ๊ฐ์จ์ ์ํฅ์ ๋ฏธ์น ๋๋ ๊ณ ์ ๋ ์์๋งํผ๋ง ์ํฅ์ ๋ฏธ์น๋ค.
๋น
์คํ๊ธฐ๋ฒ์ ์ฆ๊ฐํ์ง ์๋ ์ซ์ (๊ณ ์ ๋ ์ซ์=์์)๋ ์ ๊ฒฝ์ฐ์ง ์๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๋ฌด์ํ๋ ๊ฒ.
** ๋ด์ผ ํ ์ผ **
์๊ณ ๋ฆฌ์ฆ ๋ฏธ์ ์ ์ด์ฌํ ํ๊ณ ์ ์ถํ๊ธฐ.
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์ ํ ๋ฆฌ์คํธ, ํํ ๋ฆฌ์คํธ์ ํน์ฑ๊ณผ ํ์ฉํ๋ ๊ฒฝ์ฐ.
Big-O ํ๊ธฐ๋ฒ๊ณผ ๊ฐ์ ๋ณต์ก๋ ๋ถ์ ํ์ตํ๊ณ ์ ๋ฆฌํ๋ค. *
Queue์ Deque์ ๋ํด ํ์ต ๋ฐ ๋งํฌ๋๋ฆฌ์คํธ๋ก ๊ตฌํ๋ฐฉ์ ์ค๊ณ.
+ ํธ๋ ์ค๊ฐ ์ถ์ฒํด ์ค ๋งํฌ๋ค์ด ํด Typora๋ฅผ ํ์ฉํด์ TIL์ ์ ์ด๋ณด์! ๋งํฌ๋ค์ด ์ธ์ด์ ์ต์ํด์ ธ์ผ ํ๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL - Codesquad] ์ง์ , ์ผ๊ฐํ, ์ง์ฌ๊ฐํ (2) | 2021.01.14 |
---|---|
[TIL - Codesquad] ์๊ณ ๋ฆฌ์ฆ ๋๋ฒ๊น (6) | 2021.01.13 |
[TIL - Codesquad] ์๋ฃ๊ตฌ์กฐ, ๋ฐฐ์ด, ๋ฆฌ์คํธ, ArrayList, LinkedList, Doubly Linked List (2) | 2021.01.11 |
[TIL] ๊ฐ์ธ ๊ณต๋ถ - ์๋ฐ Map, HashMap (0) | 2021.01.10 |
[TIL - Codesquad] ๋ฆฌ๋ ์ค ๊ธฐ๋ณธ ๋ช ๋ น์ด์ ์ ์คํฌ๋ฆฝํธ (0) | 2021.01.08 |