๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)
algorithm/theory

๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)

๐Ÿ‘‰ ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ n๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆˆ ํ›„, ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ํ•ด๋ฅผ ๊ตฌํ•˜์—ฌ ์›๋ž˜ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿ‘‰ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์€ ์›๋ž˜์˜ ๋ฌธ์ œ์™€ ๊ฐ™์€ ์œ ํ˜•์ด๋ฉฐ, ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋งŒ ์ž‘๋‹ค.

๐Ÿ‘‰ ๋ณดํ†ต ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•œ๋‹ค.

if(๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์œผ๋ฉด) return ํ•ด๋‹ต
else{
  ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ n๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆˆ๋‹ค
  ๋‚˜๋ˆˆ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์ˆœํ™˜ํ˜ธ์ถœ
  return ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ํ•ด๋‹ต ๊ฒฐํ•ฉ
}

 

1. ์ด์ง„ ํƒ์ƒ‰(์ด๋ถ„ํƒ์ƒ‰)

1.1 ๋ฌธ์ œ : ์ •๋ ฌ๋œ ์ƒํƒœ์˜ ๋ฆฌ์ŠคํŠธ์—์„œ x์˜ ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋ผ

๐Ÿ‘‰ ๋ถ„ํ•  ์ •๋ณต ๊ธฐ๋ฒ• ์ ์šฉ
n=1์ด๋ฉด(์›์†Œ๊ฐ€ 1๊ฐœ ์žˆ์„ ๋•Œ) {
  x=์›์†Œ return ํ•ด
  x!=์›์†Œ return -1
}
n>1์ด๋ฉด {
  ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ์•ž์˜ ์›์†Œ๋“ค ์ง‘ํ•ฉ, ๋’ค์˜ ์›์†Œ๋“ค ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  x๊ฐ€ ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์•ž ์ง‘ํ•ฉ๋งŒ ํ•ด๊ฒฐ(→์ˆœํ™˜ํ˜ธ์ถœ)
  x๊ฐ€ ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ํฌ๋ฉด ๋’ค ์ง‘ํ•ฉ๋งŒ ํ•ด๊ฒฐ(→์ˆœํ™˜ํ˜ธ์ถœ)
  x๊ฐ€ ๊ธฐ์ค€ ์›์†Œ์™€ ๊ฐ™์œผ๋ฉด return
  ์ด ๋•Œ, combineํ•˜๋Š” ๋ถ€๋ถ„์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
}

1.2 ์ˆœํ™˜๊ด€๊ณ„์‹ : O(log n)

1.3 ๋ฐ˜๋ณต์  ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์ด์ง„ ํƒ์ƒ‰

while(๋ฒ”์œ„ ๋‚ด์— 1๊ฐœ ์ด์ƒ์˜ ์›์†Œ๊ฐ€ ์žˆ์„ ๋•Œ) {
  mid  = (์˜ค๋ฅธ์ชฝ ์›์†Œ+์™ผ์ชฝ ์›์†Œ) / 2
  if(x๊ฐ€ mid๋ณด๋‹ค ์ž‘์œผ๋ฉด) ์˜ค๋ฅธ์ชฝ ์›์†Œ = mid-1
  else if(x๊ฐ€ mid๋ณด๋‹ค ํฌ๋ฉด) ์™ผ์ชฝ ์›์†Œ = mid+1
  else return mid
}
๐Ÿ‘‰ ๋ฐ˜๋ณต๋‹น if๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ, ๋ฒ”์œ„๋ฅผ ๊ณ„์† ์ขํ˜€ ๋‚˜๊ฐ
while(๋ฒ”์œ„์— 1๊ฐœ์˜ ์›์†Œ๊ฐ€ ๋‚จ์„ ๋•Œ ๊นŒ์ง€) {
  mid
  if(x๊ฐ€ mid๋ณด๋‹ค ์ž‘์œผ๋ฉด) ์˜ค๋ฅธ์ชฝ ์›์†Œ = mid
  else ์™ผ์ชฝ ์›์†Œ = mid
}
if(x = ์™ผ์ชฝ ์›์†Œ) return ์™ผ์ชฝ ์›์†Œ
else return -1

 

2. ํ•ฉ๋ณ‘ ์ •๋ ฌ(Merge sort)

2.1 ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n log n)

2.2 MergeSort1

if(2๊ฐœ ์ด์ƒ์˜ ์›์†Œ๊ฐ€ ์žˆ์„ ๋•Œ) {
  mid ์œ„์น˜ ๊ณ„์‚ฐ
  low~mid ์ˆœํ™˜ํ˜ธ์ถœ
  mid+1~high ์ˆœํ™˜ํ˜ธ์ถœ
  (low, mid, high) Combine
}

2.3 Combine ํ•จ์ˆ˜

๐Ÿ‘‰ low~mid, mid+1~hith ๋ณ‘ํ•ฉ ์‹œ ํ•ฉ๋ณ‘ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค
while(๋‘ ๋ฆฌ์ŠคํŠธ์— ์œ ํšจํ•œ ์›์†Œ๊ฐ€ ์žˆ์„ ๋™์•ˆ){
  a์˜ ๋‘ ๋ฆฌ์ŠคํŠธ ์ค‘ ์ž‘์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ b๋กœ ๋ณต์‚ฌ
}
if(๋’ค์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด) ๋’ค์˜ ๋ฆฌ์ŠคํŠธ b๋กœ ๋„ฃ๋Š”๋‹ค
else ์•ž์˜ ๋ฆฌ์ŠคํŠธ b๋กœ ๋„ฃ๋Š”๋‹ค

 

2.4 MergeSort2

๐Ÿ‘‰ ๋งํฌ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์‹œ๊ฐ„, ๊ณต๊ฐ„ ํšจ์œจ์  ์‚ฌ์šฉ
๐Ÿ‘‰ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ์˜ ๋งํฌ์˜ ์‹œ์ž‘์€ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ index
๐Ÿ‘‰ ๊ทธ index๊ฐ€ ๊ฐ€์ง„ ๋งํฌ๊ฐ’์„ ๋”ฐ๋ผ ๊ฐ€๋ฉด์„œ ์ •๋ ฌํ•œ๋‹ค
if(๋ฒ”์œ„์— ํ•œ๊ฐœ ์ด์ƒ์˜ ์›์†Œ ์กด์žฌ์‹œ) {
  mid
  q = low, mid๋กœ ์ˆœํ™˜ํ˜ธ์ถœ(๊ทธ ์ค‘ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ index)
  r = mid+1, high๋กœ ์ˆœํ™˜ํ˜ธ์ถœ(๊ทธ ์ค‘ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ index)
  return (q, r) Combine
}
else return (1๊ฐœ ์žˆ๋Š” ์›์†Œ index)

2.4 Combine2

while(๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‹ค ์›์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ) {
  if(a[i] < a[j]) {
    link[k] = i; k = i; i = link[i];
  }
  else {
    link[k] = j; k = j; j = link[j];
  }
i์™€ j์ค‘ ๋‚จ์•„์žˆ๋Š” ์ชฝ์„ link[k]์— ๋„ฃ์–ด์ค€๋‹ค

 

3. ํ€ต ์ •๋ ฌ(Quick sort)

๐Ÿ‘‰ ๋ถ„ํ• ๋œ ๋‘ ๋ถ€๋ถ„์˜ ๋ฐฐ์—ด์ด ๋‚˜์ค‘์— ํ•ฉ๋ณ‘๋  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿ‘‰ a[1]~a[k-1] / a[k] / a[k+1]~a[n]

๐Ÿ‘‰ ์ด ๋•Œ, a[k]๋Š” ๋ถ„ํ•  ์›์†Œ(๋˜๋Š” ์ค‘์ถ”ํ‚ค)๋ผ ํ•˜๋ฉฐ, ์ •๋ ฌ ํ›„์—๋„ ์œ„์น˜ ๋ณ€๋™์ด ์—†๋‹ค.

๐Ÿ‘‰ i๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ํฐ ๊ฒƒ ์ฐพ๊ณ , j๋Š” ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ์ž‘์€ ๊ฒƒ ์ฐพ๋Š”๋‹ค.

3.1 QuickSort1

if(์›์†Œ๊ฐ€ 2๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด) {
  Partition //a์˜ ์ œ์ผ ์™ผ์ชฝ ์›์†Œ๊ฐ€ k ์œ„์น˜์— ๋“ค์–ด๊ฐ€๊ณ  ๋ถ„ํ• , ๊ธฐ์ค€ํ‚ค=a[k], a์˜ ์•ž๋’ค ๋ฆฌ์ŠคํŠธ
  p~k-1 ์ˆœํ™˜ํ˜ธ์ถœ
  k+1~q ์ˆœํ™˜ํ˜ธ์ถœ
}

3.2 Partition

๋ฐ์ดํ„ฐ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด, ์ œ์ผ ์™ผ์ชฝ ์›์†Œ, ์ œ์ผ ์˜ค๋ฅธ์ชฝ ์›์†Œ+1 ๋ฅผ ๊ฐ€์ง€๊ณ  ์ˆ˜ํ–‰
i๊ฐ€ ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ์ž‘์„ ๋™์•ˆ i++
j๊ฐ€ ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ํด ๋™์•ˆ j--
i๊ฐ€ j๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋‘˜์˜ ๊ฐ’ ์„œ๋กœ ๊ตํ™˜
๋ฐ˜๋ณต๋ฌธ ๊ณ„์† ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€
i๊ฐ€ j๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์ง€๋ฉด ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ

3.3 ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n^2)

3.4 ์ค‘๊ฐ„๊ฐ’ ๊ทœ์น™

๐Ÿ‘‰ ์ •๋ ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ ์ค‘ ์ œ์ผ ์•ž ์›์†Œ, ๊ฐ€์šด๋ฐ ์›์†Œ, ๋งˆ์ง€๋ง‰ ์›์†Œ ์ค‘ ์ค‘๊ฐ„ ํฌ๊ธฐ์˜ ๊ฐ’์„ ๊ธฐ์ค€ํ‚ค๋กœ ์‚ฌ์šฉ(๋งจ ์•ž์œผ๋กœ)

๐Ÿ‘‰ ํ€ต ์ •๋ ฌ์—์„œ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

 

4. ์„ ํƒ(Selection)

4.1 ๋ฌธ์ œ : ๋ฆฌ์ŠคํŠธ์™€ k๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ k๋ฒˆ์งธ ์ž‘์€ ์›์†Œ๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ k์œ„์น˜์— ๋‘๊ณ , k์œ„์น˜ ์•ž์—๋Š” k๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์›์†Œ๋“ค์ด ์˜ค๊ณ , k์œ„์น˜ ๋’ค์—๋Š” k๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์›์†Œ๋“ค์ด ์˜ค๋„๋ก ๋ฐฐ์น˜ํ•˜๋ผ.

4.2 ํ€ต ์ •๋ ฌ๊ณผ์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

๐Ÿ‘‰ ํ€ต ์ •๋ ฌ์ฒ˜๋Ÿผ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•œ๋‹ค. (๋ถ„ํ•  ์ •๋ณต ๊ธฐ๋ฒ• ์‚ฌ์šฉ)

๐Ÿ‘‰ ํ•œ๋ฒˆ์˜ ๋ถ„ํ• ๋กœ ์ธํ•ด์„œ ๊ธฐ์ค€ํ‚ค a[k]์™€, a[1]~a[k-1], a[k+1]~a[n]์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๐Ÿ‘‰ a[k]๊ฐ€ k๋ฒˆ์งธ ์ž‘์€ ์›์†Œ๋ผ๋ฉด ๋ฉˆ์ถ˜๋‹ค. ๋” ์ด์ƒ ๋ถ„ํ•  ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ‘‰ k๋ณด๋‹ค ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ์ž‘์œผ๋ฉด ์•ž์ชฝ, ํฌ๋ฉด ๋’ค์ชฝ์—์„œ ๋ถ„ํ•  ๊ณ„์†ํ•œ๋‹ค.

๐Ÿ‘‰ ํ€ต ์ •๋ ฌ์€ ๊ธฐ์ค€ํ‚ค์˜ ์•ž, ๋’ค ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด "๋ชจ๋‘" ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๐Ÿ‘‰ ์„ ํƒ ๋ฌธ์ œ๋Š” ์•ž, ๋’ค ๋ฆฌ์ŠคํŠธ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ฒฐํ•ฉ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4.3 Select

๋ถ„ํ• ํ•  ๋ฒ”์œ„ ์„ ์–ธ
Partition ์ˆ˜ํ–‰, ๊ธฐ์ค€ํ‚ค๋ฅผ k์œ„์น˜์— ๋‘๊ณ  ์žฌ๋ฐฐ์น˜
k๊ฐ€ ๊ธฐ์ค€ํ‚ค์™€ ๊ฐ™์•„์ง€๋ฉด ๋, return
k๊ฐ€ ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ ๋ฒ”์œ„
k๊ฐ€ ๊ธฐ์ค€ํ‚ค๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„

4.4 ์‹œ๊ฐ„๋ณต์žก๋„ : O(n^2)

 

5. Strassen์˜ ํ–‰๋ ฌ ๊ณฑ์…ˆ

5.1 ์‹œ๊ฐ„๋ณต์žก๋„ : O(n^3)

 

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

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„๊ธฐ๋ฒ• ์ •๋ฆฌ  (0) 2021.05.19