day41 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 7μ›” 24일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
41/129

μŠ€ν”„λ§ MVC 1편 - λ°±μ—”λ“œ μ›Ή 개발 핡심 기술 μ„Ήμ…˜ 7 λ§ˆμ € μˆ˜κ°• 및 μ™„κ°•

+) 22. 07. 27. day40 πŸŒ• 에 μΆ”κ°€ μ™„λ£Œ πŸ”ͺ


ν† ν”½ - μ‹œκ°„ λ³΅μž‘λ„, 곡간 λ³΅μž‘λ„

+) 22. 07. 29. μΆ”κ°€ μ™„λ£Œ πŸ”₯

ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ λ•Œ μš°λ¦¬λŠ” λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€.
예λ₯Ό λ“€μ–΄, μ •μˆ˜λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“ λ‹€κ³  κ°€μ •ν•˜λ©΄ 버블 μ •λ ¬, μ‚½μž… μ •λ ¬, 퀡 μ •λ ¬ λ“± μ—¬λŸ¬ 가지 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
κ²°κ³ΌλŠ” κ°™μ§€λ§Œ μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ„ μ“°λŠλƒμ— λ”°λΌμ„œ 과정이 달라진닀. 즉, μ•Œκ³ λ¦¬μ¦˜λ§ˆλ‹€ μ„±λŠ₯도 제각각 λ‹€λ₯΄λ‹€.
이 λ•Œ μš°λ¦¬λŠ” κ°€μž₯ 쒋은 μ„±λŠ₯을 λ°œνœ˜ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜κ³  싢을 것이닀. μ•„λ‹ˆ, μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

κ°€μž₯ 쒋은 μ•Œκ³ λ¦¬μ¦˜μ„ κ³ λ₯΄κΈ° μœ„ν•΄μ„  νš¨μœ¨μ„±μ„ λ”°μ Έμ•Ό ν•œλ‹€.

  1. μ‹œκ°„μ  νš¨μœ¨μ„± β†’ 이 μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λΉ λ₯Έμ§€ β†’ μ‹œκ°„ λ³΅μž‘λ„
  2. 곡간적 νš¨μœ¨μ„± β†’ 이 μ•Œκ³ λ¦¬μ¦˜μ΄ λ©”λͺ¨λ¦¬λ₯Ό μ–Όλ§ˆλ‚˜ μ°¨μ§€ν•˜λŠ”μ§€ β†’ 곡간 λ³΅μž‘λ„

같은 데이터λ₯Ό μž…λ ₯해도, μ•Œκ³ λ¦¬μ¦˜λ§ˆλ‹€ μˆ˜ν–‰ν•˜λŠ” μ‹œκ°„μ΄ λ‹€λ₯΄κ³  μ°¨μ§€ν•˜λŠ” 곡간이 λ‹€λ₯΄λ‹€.

보톡은 곡간 λ³΅μž‘λ„λ³΄λ‹€ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 더 μš°μ„ μ‹œν•œλ‹€. (기술λ ₯이 점점 μ’‹μ•„μ Έμ„œ λ©”λͺ¨λ¦¬μ˜ μ„±λŠ₯이 쒋아지고 있기 λ•Œλ¬Έμ— μš°λ¦¬λŠ” μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 더 μš°μ„ μœΌλ‘œ κ³ λ €ν•˜λ©΄ λœλ‹€.)

μ•Œκ³ λ¦¬μ¦˜μ˜ μ†λ„λŠ” μž…λ ₯ 데이터가 n개일 λ•Œ CPU의 μ—°μ‚° 횟수둜 νŒλ‹¨ν•œλ‹€. (μ•Œκ³ λ¦¬μ¦˜μ˜ 속도에 영ν–₯을 λ―ΈμΉ˜λŠ” 것은 μ—¬λŸ¬ μ΄μœ κ°€ μžˆκ² μ§€λ§Œ κ°€μž₯ 큰 원인은 μ—°μ‚° νšŸμˆ˜μ΄λ‹€.)
β†’ μž…λ ₯ λ°μ΄ν„°μ˜ 양이 λ‹€λ₯΄λ‹€λ©΄ λ‹Ήμ—°νžˆ 데이터가 λ§Žμ€ μͺ½μ΄ 더 였래 κ±Έλ¦°λ‹€. κ·ΈλŸ¬λ―€λ‘œ λ°μ΄ν„°λŠ” λ˜‘κ°™μ΄ n이라 κ°€μ •ν•˜κ³  μ—°μ‚° 횟수둜 λΉ„κ΅ν•œλ‹€.


Big O

μ—¬κΈ°μ„œ β€˜λΉ…μ˜€β€™μ— λŒ€ν•œ κ°œλ…μ΄ λ“±μž₯ν•œλ‹€.
O(N)은 μž…λ ₯이 N일 λ•Œ μ—°μ‚° 횟수 ν˜Ήμ€ μ°¨μ§€ν•˜λŠ” λ©”λͺ¨λ¦¬ 양이 μ–Όλ§ˆλ‚˜ λ˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

λ§Œμ•½ f(n) = 99999n + 9999, g(n) = 0.00001nΒ² 이 μžˆλ‹€λ©΄ 이 λ•Œ f(n)은 O(n), g(n)은 O(nΒ²)으둜 ν‘œκΈ°ν•œλ‹€.

μ†λ„μ˜ λΉ λ₯Έ μˆœμ€ λ‹€μŒκ³Ό κ°™λ‹€. (였λ₯Έμͺ½μœΌλ‘œ 갈수둝 λŠλ¦¬λ‹€.)

O(1) > O(logN) > O(N) > O(NlogN) > O(N^2) > O(2^N) > O(N!)

O(1)은 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ°Έμ‘°ν•  λ•Œ, O(logN)은 이진 탐색, O(N)은 순차 탐색, O(NlogN)은 퀡 μ •λ ¬, O(N^2)은 버블 μ •λ ¬, O(2^N)은 ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄(μž¬κ·€ν•¨μˆ˜)의 속도가 λœλ‹€.


O(1)

μž…λ ₯κ°’μ˜ 크기에 상관없이 μΌμ •ν•œ μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.

void function(int[] arr) {
	System.out.print(arr[3]);
}

arr의 크기가 λ°±λ§Œμ΄μ–΄λ„ arr[3]을 좜λ ₯ν•˜λŠ” μ‹œκ°„μ€ μ •ν•΄μ Έ μžˆλ‹€.


O(logN)

μž…λ ₯κ°’μ˜ 크기의 μ ˆλ°˜μ”© κ²€μƒ‰λŸ‰μ΄ κ°μ†Œν•œλ‹€. (Binary Search)

μœ„ 숫자 μ€‘μ—μ„œ 13을 찾을 경우, λ¨Όμ € 총 숫자 개수인 8개의 μ ˆλ°˜μ„ λ‚˜λˆˆλ‹€.
그럼 λ”± μ ˆλ°˜μ— μžˆλŠ” μˆ˜λŠ” 23이 λœλ‹€. 이 λ•Œ 13은 23보닀 μž‘κΈ° λ•Œλ¬Έμ— 23κ³Ό κ·Έ 였λ₯Έμͺ½ μˆ«μžλ“€μ€ 더 이상 κ³ λ €ν•  ν•„μš”κ°€ μ—†λ‹€. κ·Έλƒ₯ 날렀버리면 λœλ‹€.

μŠˆκ°€μŠˆκ°€λ£¬ 이λͺ¨ν‹°μ½˜

그럼 이제 μ—¬κΈ°μ„œ μ ˆλ°˜κ°’μΈ 16κ³Ό 13을 λΉ„κ΅ν•˜λ©΄ λœλ‹€.
13이 더 μž‘κΈ° λ•Œλ¬Έμ— 16, 19λŠ” 날렀버리고 13, 15만 μ•ˆκ³  κ°€λ©΄ λœλ‹€.

μ—¬κΈ°μ„œ 15와 13을 λΉ„κ΅ν•˜λ©΄ 13이 더 μž‘κΈ° λ•Œλ¬Έμ— μ™Όμͺ½μœΌλ‘œ κ°„λ‹€.
그리고 13을 λ“œλ””μ–΄ 찾게 λ˜μ—ˆλ‹€.

β†’ 총 8개의 숫자λ₯Ό 3번만 λΉ„κ΅ν•˜μ—¬ 값을 μ°Ύμ•˜λ‹€. (log8 = 3 β†’ logN 만큼 μ†Œμš”)


O(NlogN)

μž…λ ₯κ°’μ˜ 크기 만큼 반으둜 λ‚˜λˆ„κ³ , λ‹€μ‹œ κ·Έ 개수만큼 λΉ„κ΅ν•œλ‹€. (Merge Sort, Quick Sort, Heap Sort)

Merge Sort의 경우 μ•„λž˜ μˆ«μžλ“€μ„ 계속 λ°˜μ”© λ‚˜λˆˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ 값이 ν•˜λ‚˜μ”© 남을 λ•ŒκΉŒμ§€ 말이닀.
그리고 ν•˜λ‚˜μ”© 값을 λΉ„κ΅ν•œλ‹€.

  1. 6κ³Ό 5λ₯Ό λΉ„κ΅ν•΄μ„œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

    | 5 | 6 |

  2. 3κ³Ό 1을 λΉ„κ΅ν•΄μ„œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

    | 1 | 3 |

  3. λ°˜λ³΅β€¦

    κ²°κ³ΌλŠ” | 5 | 6 | | 1 | 3 | | 7 | 8 | | 2 | 4 | μ΄λ ‡κ²Œ 될 것이닀.

그럼 이제 5와 1을 λΉ„κ΅ν•΄μ„œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
그리고 3κ³Ό 5λ₯Ό 비ꡐ(β†’ 135), 3κ³Ό 6을 비ꡐ(β†’ 1356), 7κ³Ό 2λ₯Ό 비ꡐ ν›„ 7κ³Ό 4 비ꡐ(β†’ 247), 4와 8을 비ꡐ(β†’ 2478)ν•œλ‹€.

μ΄λ ‡κ²Œ λ°˜λ³΅ν•˜λ‹€ 보면 개수만큼 λΉ„κ΅ν•΄μ„œ ν•©μΉ˜κ²Œ λœλ‹€.
(반으둜 λ‚˜λˆŒ λ•Œ logN, 합병할 λ•Œ N만큼 비ꡐ β†’ O(NlogN) μ†Œμš”)


O(N^2)

μž…λ ₯κ°’μ˜ 크기에 따라 μ†Œμš”λ˜λŠ” μ‹œκ°„μ΄ 제곱으둜 μ¦κ°€ν•œλ‹€. (Bubble Sort, Insertion Sort, Selection Sort)

Bubble Sort

void BubbleSort(int[] arr) {
	for(int i = 0; i < arr.length; i++) {
		for(int j = 0; j < arr.length - i - 1; j++) {
			if(arr[j] > arr[j + 1]) {
				swap(arr[j], arr[j + 1]);
			}
		}
	}
}

μ—¬κΈ°μ„œ νŒŒλž€ ν™”μ‚΄ν‘œλ₯Ό i, λ…Έλž€ ν™”μ‚΄ν‘œλ₯Ό j라 ν•˜μž.
μ²˜μŒμ—λŠ” λ‘˜ λ‹€ 0λ²ˆμ§Έλ‹ˆκΉŒ 두 ν™”μ‚΄ν‘œ λͺ¨λ‘ 3에 κ°€μžˆμ„ 것이닀. 이 λ•Œ arr[j] = 3, arr[j+1] = 1μ΄λ―€λ‘œ 두 수λ₯Ό λΉ„κ΅ν•˜λ©΄ 1이 더 μž‘μœΌλ‹ˆ 1κ³Ό 3의 μœ„μΉ˜λ₯Ό μŠ€μ™‘ν•œλ‹€.
그리고 νŒŒλž€ ν™”μ‚΄ν‘œ iλŠ” κ·ΈλŒ€λ‘œ 0번째 μžλ¦¬μ— 있고, λ…Έλž€ ν™”μ‚΄ν‘œ j만 λ‹€μŒ 인덱슀둜 움직인닀.

그리고 3κ³Ό 4λ₯Ό λΉ„κ΅ν•˜λ©΄ 3이 더 μž‘μœΌλ―€λ‘œ κ·ΈλŒ€λ‘œ λ‘”λ‹€. 이런 μ‹μœΌλ‘œ ν˜„μž¬ μœ„μΉ˜μ˜ κ°’κ³Ό 였λ₯Έμͺ½(j+1)의 값을 λΉ„κ΅ν•œλ‹€.
λ…Έλž€ ν™”μ‚΄ν‘œ jκ°€ 인덱슀λ₯Ό λκΉŒμ§€ λ‹€ 돌면 λΉ¨κ°„ ν™”μ‚΄ν‘œ iλ₯Ό ν•˜λ‚˜ 증가 μ‹œν‚¨ λ’€ 사이클을 λ°˜λ³΅ν•œλ‹€.

μ΄λ ‡κ²Œ 데이터가 λ‹€μ„― 개만 μžˆμ–΄λ„ N^2인 25λ²ˆμ„ 비ꡐ해야 ν•œλ‹€β€¦


참고 자료

  1. 컴맹이 해컀가 λ˜κΈ°κΉŒμ§€, β€œO(n), O(nlogn) 이런거 λŒ€μ²΄ 무슨 λœ»μΌκΉŒμš”?”, https://youtu.be/Y7KTRu6-XK0

  2. 이정둝, β€œλΉ…μ˜€ν‘œκΈ°λ²• - μ‹œκ°„λ³΅μž‘λ„ κ°œλ… λΏŒμ‹œκΈ° ! (feat.버블정렬, 합병정렬)”, https://youtu.be/4iqlPfhW17g


ν•¨κ»˜ 보면 쒋은 자료

  1. μ—”μ§€λ‹ˆμ–΄λŒ€ν•œλ―Όκ΅­, β€œ[자료ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜] λΉ…μ˜€(Big-O)ν‘œκΈ°λ²• 완전정볡”, https://youtu.be/6Iq5iMCVsXA

운영체제 7챕터


내일 λ§Œλ‚˜μ„œ ν•  λ°œν‘œ μ€€λΉ„ν•˜κΈ°!! (λ™μ‹œμ„±, 병렬성)

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보