๐Ÿ’ป Dev/๐Ÿ”ฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (algorithm)

01. ์ •๋ ฌ

Gamddalki 2023. 9. 15. 21:08

๐Ÿ“์ •๋ ฌ์ด๋ž€?

๋ ˆ์ฝ”๋“œ(record)๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ.

๋ ˆ์ฝ”๋“œ(record) : ํ•„๋“œ(field)๋ผ๋Š” ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋จ.

- ํ‚ค(key) ํ•„๋“œ๋กœ ๋ ˆ์ฝ”๋“œ ๊ฐ„์— ๊ตฌ๋ณ„์ด ๊ฐ€๋Šฅํ•จ.

 

+) ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์•ˆ์ •์„ฑ(stability)

๋™์ผํ•œ ํ‚ค ๊ฐ’์„ ๊ฐ–๋Š” ๋ ˆ์ฝ”๋“œ๋“ค์˜ ์ƒ๋Œ€์ ์ธ ์œ„์น˜๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ๋ฐ”๋€Œ์ง€ ์•Š์Œ.

์•ˆ์ •ํ•˜์ง€ ์•Š์€ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ

 

๋Œ€ํ‘œ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

O(n²) : ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ๋ฒ„๋ธ” ์ •๋ ฌ → ๋‹จ์ˆœํ•˜์ง€๋งŒ ๋น„ํšจ์œจ์ 

O(nlogn) : ํ•ฉ๋ณ‘ ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ํž™ ์ •๋ ฌ → ๋น„๊ต์  ๋ณต์žกํ•˜์ง€๋งŒ ํšจ์œจ์ 

(์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด๋ผ ๊ฐ€์ •ํ•˜๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค)

 

๐Ÿ“ O(n²)

# ์„ ํƒ ์ •๋ ฌ

: ์ •๋ ฌ๋œ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ(์ดˆ๊ธฐ์—๋Š” ๋น„์–ด์žˆ๋Š” ์ƒํƒœ)์™€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ํ˜„์žฌ ์ธ๋ฑ์Šค์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๊ณผ ๊ตํ™˜.

selection_sort(A, n) :
	for i <- 0 to n-2 do
    		least <- A[i], A[i+1], ..., A[n-1] ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์˜ ์ธ๋ฑ์Šค;
        	A[i]์™€ A[least] ๊ตํ™˜;

- ๋น„๊ต ํšŸ์ˆ˜๋Š” O(n²)์ด์ง€๋งŒ ์ด๋™ ํšŸ์ˆ˜๋Š” 3(n-1)๋กœ ์ ์€ ํŽธ์ด๋ฉฐ, ์•ˆ์ •์„ฑ์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์Œ.

 

# ์‚ฝ์ž… ์ •๋ ฌ

: ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…. (=์ฝ˜์„œํŠธ ์Šคํƒ ๋”ฉ ์ž…์žฅ ์ค„ ์„œ๊ธฐ์™€ ๊ฐ™์€ ๋ฐฉ์‹)

2๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•จ

insertion_sort(A, n) :
	for i <- 1 to n-1 do		//i๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•  ๋•Œ
    		key <- A[i];
        	j <- i-1;		//i๋ฒˆ์งธ ์ˆซ์ž ๋ฐ”๋กœ ์•ž์˜ ์ˆซ์ž๋ถ€ํ„ฐ ๋น„๊ต ์‹œ์ž‘
        	while j>=0 and A[j]>key do
            		A[j+1] <- A[j];		//i๋ฒˆ์งธ ์ˆซ์ž๋ณด๋‹ค ํฐ ๊ฒƒ์€ ํ•œ ์นธ์”ฉ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
                	j <- j+1;
		A[j+1] <- key;

- ๋น„๊ต ํšŸ์ˆ˜์™€ ์ด๋™ ํšŸ์ˆ˜ ๋ชจ๋‘ O(n²)์ด์ง€๋งŒ ์•ˆ์ •๋œ ์ •๋ ฌ ๋ฐฉ๋ฒ•.

- ๋งŽ์€ ์ด๋™์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํด ๊ฒฝ์šฐ ๋ถˆ๋ฆฌํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๋งค์šฐ ํšจ์œจ์ ์ž„.

 

# ๋ฒ„๋ธ” ์ •๋ ฌ

: ์ธ์ ‘ํ•œ 2๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด ์ •๋ ฌ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ๊ตํ™˜.

๋’ค์—์„œ๋ถ€ํ„ฐ ์ •๋ ฌ๋จ

bubble_sort(A, n) :
	for i <- n-i to 1 do
    		for j <- 0 to j <- i-1 do
            		j์™€ j+1๋ฒˆ์งธ์˜ ๊ฐ’์ด ํฌ๊ธฐ ์ˆœ์ด ์•„๋‹ˆ๋ฉด ๊ตํ™˜

- ๋น„๊ต ํšŸ์ˆ˜์™€ ์ด๋™ ํšŸ์ˆ˜ ๋ชจ๋‘ O(n²)์ด๋ฉฐ, ๋ ˆ์ฝ”๋“œ์˜ ์ด๋™์ด ๊ณผ๋‹คํ•จ.

- ์–ด๋””๊นŒ์ง€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํšจ์œจ ์ƒ์Šน.

 

๐Ÿ“ O(nlogn)

# ํ•ฉ๋ณ‘ ์ •๋ ฌ

: ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘ ๊ฐœ์˜ ๊ท ๋“ฑํ•œ ํฌ๊ธฐ๋กœ ๋ฐ˜๋ณต ๋ถ„ํ• ํ•œ ํ›„, ๋ถ„ํ• ๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋“ค์„ ์ •๋ ฌ→ํ•ฉ๋ณ‘ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•จ.

๋ถ„ํ•  ์ •๋ณต (๋ฌธ์ œ๋ฅผ 2๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋“ค๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ ํ•ด๊ฒฐํ•ด, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„ ์›๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”) ๊ธฐ๋ฒ•์„ ์ด์šฉ

merge_sort(list, left, right) :
	if left<right
    		mid=(left+right)/2;		//์ค‘๊ฐ„ ์œ„์น˜๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ
            	merge_sort(list, left, mid);		//์•ž์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์ •๋ ฌ์„ ์œ„ํ•œ ์ˆœํ™˜ ํ˜ธ์ถœ
            	merge_sort(list, mid+1, right);		//๋’ค์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์ •๋ ฌ์„ ์œ„ํ•œ ์ˆœํ™˜ ํ˜ธ์ถœ
            	merge(list, left, mid, right);		//์ •๋ ฌ๋œ ๋‘ ๋ฐฐ์—ด์„ ํ†ตํ•ฉ

- ๋น„๊ต ํšŸ์ˆ˜๋Š” O(logn), ์ด๋™ ํšŸ์ˆ˜๋Š” O(nlogn)์ด๋ฏ€๋กœ ๋ ˆ์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ ์‹œ๊ฐ„์  ๋‚ญ๋น„ ๋˜ํ•œ ์ปค์ง€์ง€๋งŒ, ์•ˆ์ •๋œ ์ •๋ ฌ ๋ฐฉ๋ฒ•.

- ๋ฐ์ดํ„ฐ์˜ ์ดˆ๊ธฐ ๋ถ„์‚ฐ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋œ ๋ฐ›์Œ.

- ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑํ•ด ํ•ฉ๋ณ‘ ์ •๋ ฌํ•  ๊ฒฝ์šฐ, ๋งค์šฐ ํšจ์œจ์ !

 

# ํ€ต ์ •๋ ฌ

: ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘ ๊ฐœ์˜ ๋น„๊ท ๋“ฑ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„ํ• ํ•ด ๊ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ€ต ์ •๋ ฌํ•จ.

(๋ถ„ํ•  ์ •๋ณต ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ์ •๋ณต ๊ณผ์ • ์—†์ด ์ •๋ ฌ๋จ!)

quick_sort(list, left, right) :
	if left<right		//์ •๋ ฌํ•  ๋ฒ”์œ„๊ฐ€ 2๊ฐœ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์ด๋ฉด
        	q <- partition(list, left, right);		//ํ”ผ๋ฒ— ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถ„ํ• 
                quick_sort(list, left, q-1);		//ํ”ผ๋ฒ— ๋ฐ”๋กœ ์•ž๊นŒ์ง€ ํ€ต ์ •๋ ฌ ์ˆœํ™˜ ํ˜ธ์ถœ
                quick_sort(list, q+1, right);		//ํ”ผ๋ฒ— ๋ฐ”๋กœ ๋’ค๋ถ€ํ„ฐ ํ€ต ์ •๋ ฌ ์ˆœํ™˜ ํ˜ธ์ถœ
partition(list, left, right) :
	low <- left; high <- right+1; pivot <- list[left];
    	while(low<high)		//low์™€ high๊ฐ€ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€
    		while(low<=right && list[low]<pivot) do
    			low++;		//์•ž์—์„œ๋ถ€ํ„ฐ ์ด๋™ํ•˜๋‹ค list[low]>pivot์ด๋ฉด ๋ฉˆ์ถ”๊ณ 
    		while(high>=left && list[high]>pivot) do
    			high--;		//๋’ค์—์„œ๋ถ€ํ„ฐ ์ด๋™ํ•˜๋‹ค list[high]<pivot์ด๋ฉด ๋ฉˆ์ถฐ์„œ
    		if low<high
    			swap(list[low], list[high]);		//๋‘˜์ด ๊ตํ™˜
    	swap(list[left], list[high]);		//์ดํ›„ ํ”ผ๋ฒ—์„ ์ œ ์œ„์น˜๋กœ ์ด๋™
    	return high;

- ๋น„๊ต ํšŸ์ˆ˜๋Š” O(nlogn)์ด๊ณ  ์ด๋™ ํšŸ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ, ํ‰๊ท ์ ์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ์ •๋ ฌ ๋ฐฉ๋ฒ•.

- ๋‹ค๋งŒ ๊ทน๋„๋กœ ๋ถˆ๊ท ๋“ฑํ•œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„ํ• ๋˜๋Š” ๊ฒฝ์šฐ, ๋น„๊ต ํšŸ์ˆ˜๊ฐ€ O(n²)์ด ๋จ.

- ์ค‘๊ฐ„๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒํ•ด ๋ถˆ๊ท ๋“ฑ ๋ถ„ํ• ์„ ์™„ํ™”ํ•˜๋Š” ๋ฐฉ์‹ ์ด์šฉ.

 

# ํž™ ์ •๋ ฌ

: ์ •๋ ฌํ•  ์š”์†Œ๋“ค์„ ์ตœ์†Œ ํž™(min heap)์— ์‚ฝ์ž… ํ›„ ์‚ญ์ œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํž™์œผ๋กœ๋ถ€ํ„ฐ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ €์žฅํ•จ.

+) ํž™์—์„œ์˜ ์‚ญ์ œ ์—ฐ์‚ฐ

   (1) ๋ฃจํŠธ ๋…ธ๋“œ ์‚ญ์ œ.

   (2) ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์ด๋™.

   (3) ๋ฃจํŠธ์—์„œ๋ถ€ํ„ฐ ๋‹จ๋ง ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๊ตํ™˜ํ•ด, ํž™์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑ์‹œํ‚ด.

 

- n๋ฒˆ์˜ ์‚ญ์ œ ์—ฐ์‚ฐ์ด๋ฏ€๋กœ O(nlogn).