๐Ÿ“š ํฌ์ŠคํŠธ 3: ๊ฒ€์ƒ‰์˜ ์„ฑ๋ฐฐ: O(log N)

๋ฐœํ–‰: (2025๋…„ 11์›” 30์ผ ์˜ค์ „ 08:47 GMT+9)
4 min read
์›๋ฌธ: Dev.to

Source: Dev.to

O(logโ€ฏN)์ด ์„ ํ˜• ํƒ์ƒ‰๋ณด๋‹ค ๋น ๋ฅธ ์ด์œ 

์ด์ „ ๊ธ€์—์„œ๋Š” O(Nยฒ) ์—์„œ O(N) ๋กœ ์–ด๋–ป๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋” ๋น ๋ฅด๊ฒŒ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. O(logโ€ฏN) (๋กœ๊ทธ) ๋ณต์žก๋„๋Š” ์ž…๋ ฅ ํฌ๊ธฐ์— ๊ฑฐ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ์„ฑ์žฅ๋ฅ  ๋•Œ๋ฌธ์— ๋ชจ๋“  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธˆ๋ณธ์œ„ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

์ž…๋ ฅ ํฌ๊ธฐ (N)O(N) ๋‹จ๊ณ„O(logโ€ฏN) ๋‹จ๊ณ„
1โ€ฏ0001โ€ฏ00010
1โ€ฏ000โ€ฏ0001โ€ฏ000โ€ฏ00020
1โ€ฏ000โ€ฏ000โ€ฏ0001โ€ฏ000โ€ฏ000โ€ฏ000~30

์ด ์†๋„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ง„ ํƒ์ƒ‰์ž…๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋‚จ์€ ํƒ์ƒ‰ ๊ณต๊ฐ„์˜ ์ ˆ๋ฐ˜์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ๊ฐœ์š”

์ด์ง„ ํƒ์ƒ‰์€ ์ •๋ ฌ๋œ ์ž๋ฃŒ ๊ตฌ์กฐ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ค‘๊ฐ„ ์š”์†Œ(mid)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ค‘๊ฐ„ ๊ฐ’์ด ๋ชฉํ‘œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ ์ ˆ๋ฐ˜์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  3. ์ค‘๊ฐ„ ๊ฐ’์ด ๋ชฉํ‘œ๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ์ ˆ๋ฐ˜์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  4. ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ๋ฌธ์ œ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋ฉฐ(logโ‚‚) ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

Elixir์—์„œ์˜ ํ•จ์ •

Elixir์˜ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋จธ๋ฆฌ๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค N/2์— ์žˆ๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋Ÿฐํƒ€์ž„์ด N/2๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(N) ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ด์ง„ ํƒ์ƒ‰ ๋‹จ๊ณ„๊ฐ€ ์ค‘๊ฐ„์„ ์ฐพ๋Š” ๋ฐ O(N) ๋น„์šฉ์ด ๋“ ๋‹ค๋ฉด ์ „์ฒด ๋ณต์žก๋„๋Š” O(Nโ€ฏlogโ€ฏN) ๊ฐ€ ๋˜์–ด ์ด์ ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Erlang/Elixir ์ƒํƒœ๊ณ„์—์„œ ์ง„์ •ํ•œ O(logโ€ฏN) ๋ฅผ ์–ป์œผ๋ ค๋ฉด O(1) ์ธ๋ฑ์Šค ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ์ด ๋ฐ”๋กœ ๊ทธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Elixir ๊ตฌํ˜„

defmodule BinarySearch do
  @doc """Starts a binary search with O(log N) complexity."""
  def search(list, target) do
    # Convert the list to a tuple for O(1) index access
    array = List.to_tuple(list)
    # Kick off the recursion: low = 0, high = size - 1
    binary_search_recursive(array, target, 0, tuple_size(array) - 1)
  end

  # Failure condition โ€“ low has crossed high, target not found
  defp binary_search_recursive(_array, _target, low, high) when low > high do
    :not_found
  end

  # Main recursive step
  defp binary_search_recursive(array, target, low, high) do
    # 1. Compute the middle index
    mid = div(low + high, 2)

    # 2. Retrieve the middle value (O(1) in a tuple)
    # Tuples in Erlang are 1โ€‘based, so add 1
    current_value = :erlang.element(mid + 1, array)

    # 3. Success condition
    if current_value == target do
      mid
    # 4. Target is greater โ€“ discard left half
    else
      if current_value < target do
        binary_search_recursive(array, target, mid + 1, high)
      # 5. Target is smaller โ€“ discard right half
      else
        binary_search_recursive(array, target, low, mid - 1)
      end
    end
  end
end

์ด ํ•จ์ˆ˜๋Š” ๊ฐ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํƒ์ƒ‰ ๊ณต๊ฐ„์„ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋ฉด์„œ ์ค‘๊ฐ„ ์š”์†Œ์— ์ƒ์ˆ˜ ์‹œ๊ฐ„์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง„์ •ํ•œ O(logโ€ฏN) ๋™์ž‘์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฃผ์ œ๋Š”?

O(logโ€ฏN) ๊ฐ€ ํƒ์ƒ‰์— ์ตœ์ ์˜ ๋ณต์žก๋„๋ผ๋ฉด, ์ •๋ ฌ์— ๋Œ€ํ•œ ์ตœ์ ์˜ ๋ณต์žก๋„๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ๋‹ค์Œ ๊ธ€์—์„œ๋Š” O(Nโ€ฏlogโ€ฏN) (์„ ํ˜• ๋กœ๊ทธ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ด๋ฉฐ, ๋ณ‘ํ•ฉ ์ •๋ ฌ์— ์ดˆ์ ์„ ๋งž์ถฐ ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• โ€‘์ •๋ณต ์ „๋žต๊ณผ ์„ ํ˜• ๋ณ‘ํ•ฉ ์ž‘์—…์„ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Big O๋ž€? ๊ทธ๋ฆฌ๊ณ  ์•…๋‹น O(N^2)

Elixir์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„: O(N^2) ์ดํ•ดํ•˜๊ธฐ์™€ ์™œ ๋‹น์‹ ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋А๋ฆฐ๊ฐ€? Elixir๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด์„œ ๋‹น์‹ ์˜โ€ฆ

Day 1276 : ์ปค๋ฆฌ์–ด ํด๋ผ์ด๋ฐ

ํ† ์š”์ผ ์—ญ์œผ๋กœ ๊ฐ€๊ธฐ ์ „์—, ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋”ฉ์„ ํ–ˆ์–ด์š”. ๊ฝค ์ข‹์€ ์ง„์ „์„ ์ด๋ฃจ์—ˆ๊ณ , ์ด์ œ ๋‚˜๊ฐˆ ์‹œ๊ฐ„์ด์—ˆ์–ด์š”. Made i...

๊ทธ๋ฃน ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฉ๊ธˆ ๋๋ƒˆ์–ด์š”...๋‚ด ์ƒ๊ฐ

์†Œ๊ฐœ ํšŒ์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ๋Œ€ํ™”ํ•˜์„ธ์š”. ์ด๋“ค์€ ๋‹จ์ˆœํžˆ ์—…๋ฌด๋ฅผ ์œ„์ž„ํ•ด์•ผ ํ•  ๊ฐœ์ธ์ด ์•„๋‹ˆ๋ผโ€”๊ทธ๋“ค์ด ๋ˆ„๊ตฌ์ธ์ง€, ์–ด๋–ป๊ฒŒ ์ผํ•˜๋Š”์ง€, ๊ทธ๋“ค์˜ p...