[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ณ‘ํ•ฉ ์ •๋ ฌ (merge sort)

2021. 9. 9. 08:01ใ†์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ค€๋น„/์•Œ๊ณ ๋ฆฌ์ฆ˜

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘ ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋ณ‘ํ•ฉ์ •๋ ฌ์— ๋Œ€ํ•ด ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต์— ๋Œ€ํ‘œ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ๊ฒƒ์ด์—์š”. ๋ถ„ํ•  ์ •๋ณต์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด Dynamic Programming(๋™์  ๊ณ„ํš๋ฒ•)& Divide and Conquer(๋ถ„ํ•  ์ •๋ณต)์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ํ™•์ธ ํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค๊ป˜์„œ๋Š” ์ฃผ๋‹ˆํ•˜๋ž‘์˜ Git hub์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

 

 

 


 

 

 

๐Ÿ“Œ ๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge sort)


 

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์žฌ๊ท€์šฉ๋ฒ•์„ ํ™œ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์นœ๊ตฌ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒƒ์ด์—์š”.

๋จผ์ €, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ž˜๋ผ ๋น„์Šทํ•œ ํฌ๊ธฐ์˜ ๋‘ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆ„๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋Ÿฐ ๋’ค, ๊ฐ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ•ฉ๋ณ‘ ์ •๋ ฌ์„ ์ด์šฉํ•ด ์ •๋ ฌ์„ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‘ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ•˜๋‚˜์˜ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋กœ ํ•ฉ๋ณ‘ํ•˜๋ฉด ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž๋‹ˆ๋‹ค!

 

์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์œผ์‹ ๋‹ค๋ฉด ์ด ๊ณณ์„ ํ•œ๋ฒˆ ๋ด๋ณด์…”์š”!

 

 

์ถœ์ฒ˜ : ์œ„ํ‚คํ”ผ๋””์•„

 

 

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ด


Data๊ฐ€ ๋„ค ๊ฐœ ์ผ๋•Œ, (Data ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋ณต์žก๋„๊ฐ€ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„ค ๊ฐœ๋กœ ๋ฐ”๋กœ Logic์„ ์ดํ•ดํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.)

  1. ์˜ˆ: data_list = [1, 9, 3, 2]
    • ๋จผ์ € [1, 9], [3, 2]๋กœ ์ชผ๊ฐ ๋‹ค.
    • ๋‹ค์‹œ ์•ž ๋ถ€๋ถ„์€ [1], [9]๋กœ ์ชผ๊ฐ ๋‹ค.
    • ๊ทธ๋Ÿฐ ๋’ค ์•ž๊ณผ ๋’ค์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ž‘์€ ๊ฐ’์„ ์•ž์œผ๋กœ ์˜ค๋„๋ก ํ•˜์—ฌ ํ•ฉ์นœ๋‹ค. [1, 9]
    • ๋’ค ๋ถ€๋ถ„ ์—ญ์‹œ [3], [2]๋กœ ์ชผ๊ฐ ๋‹ค.
    • ๊ทธ๋Ÿฐ ๋’ค ์•ž๊ณผ ๋‘์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ž‘์€ ๊ฐ’์„ ์•ž์œผ๋กœ ์˜ค๋„๋ก ํ•˜์—ฌ ํ•ฉ์นœ๋‹ค. [2, 3]
    • ์ด์ œ ์•ž, ๋’ค ๋ฐฐ์—ด ๋ชจ๋‘๋ฅผ ํ•ฉ์นœ๋‹ค.
      • 1 < 2 ์ด๊ธฐ์— [1]
      • 9 > 2 ์ด๊ธฐ์— [1, 2]
      • 9 > 3 ์ด๊ธฐ์— [1, 2, 3]
      • 9 ํ˜ผ์ž ๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์— [1, 2, 3, 9]

 

 

 

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„


 

  1. merge_split ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
    • ๋งŒ์•ฝ ๋ฆฌ์ŠคํŠธ ๊ฐœ์ˆ˜๊ฐ€ ํ•œ๊ฐœ๋ผ๋ฉด ํ•ด๋‹น ๊ฐ’ ๋ฐ˜ํ™˜
    • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, ๋ฆฌ์ŠคํŠธ๋ฅผ ์•ž๊ณผ ๋’ค๋กœ ๋‘ ๊ฐœ ๋‚˜๋ˆˆ๋‹ค.
    • left = merge_split(์•ž)
    • right = merge_split(๋’ค)
    • merge(left, right)
  2. merge ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
    • ๋ฆฌ์ŠคํŠธ ๋ณ€์ˆ˜ ํ•˜๋‚˜ ๋งŒ๋“ค๊ธฐ (sorted)
    • left_index, right_index = 0
    • while left_index < len(left) or right_index < len(right):
      • ๋งŒ์•ฝ left_index๋‚˜, right_index๊ฐ€ ์ด๋ฏธ left ๋˜๋Š” right ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค ์ˆœํšŒํ–ˆ๋‹ค๋ฉด, ๊ทธ ๋ฐ˜๋Œ€์ชฝ Data๋ฅผ ๋„ฃ๊ณ , ํ•ด๋‹น Index 1์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
      • if left[left_index] < right[right_index]:
        • sorted.append(left[left_index])
        • left_index += 1
      • else:
        • sorted.append(right[right_index])
        • right_index += 1

 

 

 

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„์„


 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„์„์€ ์‚ฌ์‹ค ์‰ฝ์ง€ ์•Š์€ ๊ฒƒ์ด์—์š”. 

๋จผ์ € ๋ช‡ ๋‹จ๊ณ„ ๊นŠ์ด๊นŒ์ง€ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€๋ฅผ depth๋ผ๊ณ  ํ•˜๊ณ , i๋กœ ๋†“์„ ๊ฒƒ์ด์—์š”. ๊ทธ๋Ÿฐ ๋’ค ๋งจ ์œ—๋‹จ๊ณ„๋Š” 0์œผ๋กœ ๋†“์„๊ฒŒ์š”.

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ n/$2^2$๋ฅผ 2๋‹จ๊ณ„ ๊นŠ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ๊ฐ ๋‹จ๊ณ„์— ์žˆ๋Š” ํ•˜๋‚˜์˜ Node์•ˆ์— ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๋Š” n/$2^2$๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

๊ฐ ๋‹จ๊ณ„์—๋Š” $2^i$ ๊ฐœ์˜ Node๊ฐ€ ์žˆ๋Š” ์…ˆ์ด์—์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ n์ด 0๋‹จ๊ณ„ n/2๊ฐ€ 1๋‹จ๊ณ„ n/$2^2$๊ฐ€ 2๋‹จ๊ณ„ ์ผ ๋•Œ, 2๋‹จ๊ณ„์—์„œ๋Š” $2^2$ ๊ฐœ ์ฆ‰ 4๊ฐœ์˜ Node๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , 1๋‹จ๊ณ„์—์„œ๋Š” $2^1$๊ฐœ ์ฆ‰ 2๊ฐœ์˜ Node๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๋”ฐ๋ผ์„œ ๊ฐ ๋‹จ๊ณ„๋Š” ํ•ญ์ƒ $2^i * \frac { n }{ 2^i } = O(n)$์ธ ๊ฒƒ์ด๊ณ , ๋‹จ๊ณ„๋Š” ํ•ญ์ƒ $log_2 n$๊ฐœ ๋งŒํผ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด์—์š”.

๊ฒฐ๊ตญ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O($log n$)์ด๊ณ , 2๋Š” ์—ญ์‹œ ์ƒ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

๋”ฐ๋ผ์„œ ๋‹จ๊ณ„๋ณ„ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n) * O($log n$) = O($n log n$)์ด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

๋ฐ˜์‘ํ˜•

 

 

 

 


 

์ฃผ๋‹ˆํ•˜๋ž‘์˜ ๊ธ€์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”? ๊ตฌ๋…๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋Œ“๊ธ€ ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ช…๋ก์€ ์ฃผ๋‹ˆํ•˜๋ž‘์—๊ฒŒ ๋งŽ์€ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค

728x90
๋ฐ˜์‘ํ˜•