๐Ÿ“š ํฌ์ŠคํŠธ 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๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด์„œ ๋‹น์‹ ์˜โ€ฆ

๋ฌผ๋ฅ˜๋ฅผ ์œ„ํ•œ ํ…ŒํŠธ๋ฆฌ์Šค: Rust๋กœ 3D Bin Packing Problem ํ•ด๊ฒฐ ๐Ÿฆ€

์†Œ๊ฐœ ๋ญ๊ฐ€ ์งœ์ฆ๋‚˜๋Š”์ง€ ์•„์„ธ์š”? ๊ฑฐ๋Œ€ํ•œ ๋ฐฐ์†ก ์ƒ์ž๋ฅผ ์—ด์—ˆ๋Š”๋ฐ ์•ˆ์— ์ž‘์€ ๋ฌผ๊ฑด์ด ๋”ธ๊น๊ฑฐ๋ฆฌ๋ฉฐ, ๋ฒ„๋ธ”๋žฉ ์‚ฐ์— ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐโ€ฆ

Bf-ํŠธ๋ฆฌ: ํŽ˜์ด์ง€ ์žฅ๋ฒฝ์„ ๊นจ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” Maneshwar์ž…๋‹ˆ๋‹ค. ์ €๋Š” FreeDevTools โ€“ ์˜จ๋ผ์ธ ์˜คํ”ˆโ€‘์†Œ์Šค ํ—ˆ๋ธŒ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ—ˆ๋ธŒ๋Š” dev tools, cheat codes, ๊ทธ๋ฆฌ๊ณ  TLDRs๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„ ์‰ฝ๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.