์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๋ฐ ์‹ค์Šต

Chap1 1.2 The Importance of Developing Efficient Algorithms

๋ฐ๋ถ€์žฅ 2025. 4. 4. 22:50

์™œ ํšจ์œจ์„ฑ์ด ์ค‘์š”ํ•œ๊ฐ€?

โ“ "์ปดํ“จํ„ฐ ์„ฑ๋Šฅ์ด ๊ณ„์† ์ข‹์•„์ง€๋Š”๋ฐ ๊ตณ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจ์„ฑ์„ ๋”ฐ์ ธ์•ผ ํ•ด?"
 Yes. ๋ฌด์กฐ๊ฑด ์ค‘์š”ํ•จ.

  • ์ปดํ“จํ„ฐ๊ฐ€ ๋นจ๋ผ์ ธ๋„, ๋ฌธ์ œ ํฌ๊ธฐ(input size) ๋Š” ๋” ๋น ๋ฅด๊ฒŒ ์ปค์ง
  • ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ˆ˜์‹ญ ๋ฐฐ, ์ˆ˜๋ฐฑ ๋ฐฐ ๋น ๋ฅธ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋งŒ๋“ฆ

๐Ÿ” ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต ์‚ฌ๋ก€


๐Ÿ”น 1.2.1 Sequential Search vs Binary Search

๐Ÿงช ๋ฌธ์ œ: ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ x๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹ ๋น„๊ต ํšŸ์ˆ˜(์ตœ์•…์˜ ๊ฒฝ์šฐ)
Sequential Search ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ต nํšŒ
Binary Search ์ค‘๊ฐ„๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์ ˆ๋ฐ˜์”ฉ ์ค„์—ฌ๊ฐ logโ‚‚n + 1ํšŒ

๐Ÿ“Œ ํ•ต์‹ฌ ๋น„๊ต

  • n = 4,294,967,296์ผ ๊ฒฝ์šฐ:
    • Sequential: ์•ฝ 43์–ต ๋ฒˆ ๋น„๊ต
    • Binary: ๋‹จ 33๋ฒˆ๋งŒ ๋น„๊ต

์•„๋ฌด๋ฆฌ ์ปดํ“จํ„ฐ๊ฐ€ ๋นจ๋ผ๋„ Sequential์€ ์ˆ˜ ์ดˆ, Binary๋Š” ๊ฑฐ์˜ ์ฆ‰์‹œ ๊ฒฐ๊ณผ!

๋ฌธ์ œ ์ƒํ™ฉ

๋ชฉํ‘œ: ์ •๋ ฌ๋œ ๋ฐฐ์—ด S[1..n] ์•ˆ์—์„œ ์›์†Œ x๋ฅผ ์ฐพ๊ธฐ
 x์˜ ์œ„์น˜(index)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ์—†์œผ๋ฉด 0

๐Ÿ”ด Sequential Search (์„ ํ˜• ํƒ์ƒ‰)

procedure SequentialSearch(S[1..n], x)
  for i = 1 to n
    if S[i] == x then return i
  return 0

ํŠน์ง•:

  • ์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ต
  • ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์•„๋„ ๊ฐ€๋Šฅ
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ: ๋๊นŒ์ง€ ๋น„๊ต → n๋ฒˆ

์‹œ๊ฐ„๋ณต์žก๋„:

  • ์ตœ์„ : O(1)
  • ํ‰๊ท : O(n/2)
  • ์ตœ์•…: O(n)

โœ… Binary Search (์ด์ง„ ํƒ์ƒ‰)

๐Ÿ” ๊ธฐ๋ณธ ๊ฐœ๋…

  1. ์ค‘๊ฐ„ ๊ฐ’(mid)์„ ์„ ํƒํ•ด์„œ x์™€ ๋น„๊ต
  2. ๊ฐ™์œผ๋ฉด ์ฐพ์€ ๊ฒƒ → ๋ฐ˜ํ™˜
  3. x๊ฐ€ ๋” ์ž‘์œผ๋ฉด → ์™ผ์ชฝ ์ ˆ๋ฐ˜๋งŒ ํƒ์ƒ‰
  4. x๊ฐ€ ๋” ํฌ๋ฉด → ์˜ค๋ฅธ์ชฝ ์ ˆ๋ฐ˜๋งŒ ํƒ์ƒ‰
  5. ๋ฐ˜๋ณต

๐Ÿ“ฆ ์‚ฌ์šฉ ๋ณ€์ˆ˜

 

๋ณ€์ˆ˜ ์˜๋ฏธ
low ํ˜„์žฌ ํƒ์ƒ‰ ๋ฒ”์œ„์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค
high ํ˜„์žฌ ํƒ์ƒ‰ ๋ฒ”์œ„์˜ ๋ ์ธ๋ฑ์Šค
mid ์ค‘๊ฐ„ ์œ„์น˜ ์ธ๋ฑ์Šค ((low + high) // 2)
procedure BinarySearch(S[1..n], x)
  low ← 1
  high ← n
  while low ≤ high
    mid ← ⌊(low + high)/2⌋
    if S[mid] == x then return mid
    else if x < S[mid] then high ← mid - 1
    else low ← mid + 1
  return 0

ํŠน์ง•:

  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ž„
  • ๋งค์šฐ ๋น ๋ฆ„! (๋กœ๊ทธ ์‹œ๊ฐ„)

์‹œ๊ฐ„๋ณต์žก๋„:

  • ํ•ญ์ƒ O(logโ‚‚n) (์•ฝ๊ฐ„์˜ ์ƒ์ˆ˜ ์ฐจ์ด๋กœ +1 ํฌํ•จ)

โ— ์‹œํ—˜ ๋Œ€๋น„ ์ฒดํฌ ํฌ์ธํŠธ

์งˆ๋ฌธ ๋‹ต๋ณ€ ์š”์•ฝ
Binary Search์˜ ์ „์ œ ์กฐ๊ฑด์€? ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ
์™œ logโ‚‚n๋งŒํผ ๋น ๋ฅธ๊ฐ€? ๋งค๋ฒˆ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ
Binary Search ์‹œ๊ฐ„๋ณต์žก๋„๋Š”? O(log n)
Sequential Search์™€์˜ ์ฐจ์ด๋Š”? Binary๋Š” ํ›จ์”ฌ ๋” ์ ์€ ๋น„๊ต ํšŸ์ˆ˜๋กœ ํƒ์ƒ‰ ๊ฐ€๋Šฅ

๐Ÿ”น 1.2.2 ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต

๐Ÿ“ ๋ฌธ์ œ: n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ


๐Ÿšจ ๋น„ํšจ์œจ์ : Algorithm 1.6 (์žฌ๊ท€ recursive)

function fib(n)
  if n == 0 or n == 1 then
    return n
  return fib(n-1) + fib(n-2)
  • ๊ฐ™์€ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต ๊ณ„์‚ฐ
  • ๊ณ„์‚ฐ๋Ÿ‰์ด 2^(n/2) ์ด์ƒ → ์ง€์ˆ˜์  ์ฆ๊ฐ€
  • ์˜ˆ: n=120์ด๋ฉด ์ˆ˜์‹ญ ๋…„ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ์Œ (!)


ํšจ์œจ์ : Algorithm 1.7 (๋ฐ˜๋ณต Iterative)

function fib2(n)
  f[0] ← 0
  f[1] ← 1
  for i = 2 to n
    f[i] ← f[i-1] + f[i-2]
  return f[n]
  • ๋ชจ๋“  ํ•ญ์„ ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐ  O(n) ์‹œ๊ฐ„
  • n=120๋„ ์ˆœ์‹๊ฐ„์— ๊ณ„์‚ฐ


๐Ÿ’ก ๊ฒฐ๋ก : ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ์ด ์ƒ๋ช…์ด๋‹ค!

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„๋ณต์žก๋„ ์‹คํ–‰ ์‹œ๊ฐ„
์žฌ๊ท€ ํ”ผ๋ณด๋‚˜์น˜ O(2^n) ์ˆ˜์‹ญ ๋…„
๋ฐ˜๋ณต ํ”ผ๋ณด๋‚˜์น˜ O(n) 0.0000001์ดˆ ์ˆ˜์ค€

๐ŸŽฏ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ์š”์•ฝ

  • ํšจ์œจ์„ฑ์€ ๋ฌธ์ œ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํ•„์ˆ˜
  • ๋น„ํšจ์œจ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋ฌด๋ฆฌ ์ข‹์€ ์ปดํ“จํ„ฐ๋„ ์†Œ์šฉ ์—†์Œ
  • ์ด๋ก ์  ๋ถ„์„์€ ์‹ค์ œ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ์คŒ
  • ์ข‹์€ ์„ค๊ณ„ = ์ˆ˜์ฒœ ๋ฐฐ ์ด์ƒ์˜ ์‹คํ–‰ ์‹œ๊ฐ„ ์ ˆ์•ฝ

๐Ÿ“Œ ์‹œํ—˜ ๋Œ€๋น„ ์ฒดํฌ ํฌ์ธํŠธ

์งˆ๋ฌธ ๋‹ต๋ณ€ ์š”์•ฝ
์™œ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ค‘์š”ํ•œ๊ฐ€? ๋ฌธ์ œ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด, ๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ˜„์‹ค์ ์œผ๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
Binary Search๊ฐ€ ๋น ๋ฅธ ์ด์œ ๋Š”? ๋งค๋ฒˆ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ
์žฌ๊ท€ ํ”ผ๋ณด๋‚˜์น˜๊ฐ€ ๋А๋ฆฐ ์ด์œ ๋Š”? ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๊ณ„์‚ฐ๋Ÿ‰์ด ์ง€์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€
ํšจ์œจ์ ์ธ ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ๋ฒ•์€? ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ณ„์‚ฐ + ์ด์ „ ๋‘ ํ•ญ๋งŒ ๊ธฐ์–ต → O(n)

[์ฐธ๊ณ ์‚ฌํ•ญ]

๐Ÿงฎ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด (Fibonacci Sequence)


์ •์˜

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ํ™”์‹(์žฌ๊ท€์‹)์œผ๋กœ ์ •์˜๋œ๋‹ค:

F(0)=0,F(1)=1F(n)=F(n−1)+F(n−2),n≥2

์ฆ‰, ์ด์ „ ๋‘ ํ•ญ์„ ๋”ํ•ด์„œ ๋‹ค์Œ ํ•ญ์„ ๋งŒ๋“œ๋Š” ์ˆ˜์—ด์ด๋‹ค.

โ–ถ๏ธ ์ฒ˜์Œ ๋ช‡ ๊ฐœ ํ•ญ์€?

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,...