๐ก์ฐ๊ฒฐ ๋ฆฌ์คํธ๋?
์์ ๋ฐ ๋ค์ ๋ ธ๋๋ก์ ๋งํฌ๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ ธ๋๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ.
- ๋งํฌ?
๋ ธ๋๊ฐ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์์์ ์ด๋ค ์ฃผ์๋ก ์ ์ฅ๋์ด์๋๊ฐ๋ฅผ ๋ด๊ณ ์๋ ์ ๋ณด.(ํฌ์ธํฐ = ๋ฉ๋ชจ๋ฆฌ์์ ์ฃผ์)- ํน์ง
1. get(i), set(i,x)๋ฅผ ์์ ์๊ฐ์ ํ ์ ์์.
- ๋ฐฐ์ด๋ณด๋ค ๋์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ธ๋์ ๋ ํผ๋ฐ์ค๋ง ์ฃผ์ด์ง๋ค๋ฉด, ๋ ธ๋์ ์ถ๊ฐ์ ์ญ์ ๋ฅผ ์์ ์๊ฐ์ ํ ์ ์์.
๐ก๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋?
๋ ธ๋๋ค์ ์ฐ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ฐ ๋ ธ๋ u๋ ๋ฐ์ดํฐ u.x์ ๋ค์ ๋ ธ๋๋ก์ ๋งํฌ์ธ u.next ๊ฐ์ ๊ฐ์ง. (๋ง์ง๋ง ๋ ธ๋ w์ w.next = nil)
- queue์ฐ์ฐ (add, remove) ๊ณผ stack์ฐ์ฐ (push, pop) ์ ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์.
- queue์์๋ tail์์ add๊ฐ ์ผ์ด๋๊ณ head์์ remove๊ฐ ์ผ์ด๋๋ ๋ฐ๋ฉด, stack์ pop, push๋ชจ๋ head ์์ ์ผ์ด๋จ.
initialize() n <- 0 # node ์ head <- nil # head ์์ tail <- nil # tail ์์
push(x) # head์ชฝ์ x์ถ๊ฐ u <- new_node(x) # x๋ฅผ ๋ด๋ ์ node ์์ฑ u.next <- head # ์ node์ ๋งํฌ๊ฐ ๊ธฐ์กด head๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ head <- u # ์ node๊ฐ ์๋ก์ด head๊ฐ ๋จ # ๊ธฐ์กด์ ๋น ๋ฆฌ์คํธ์๋ค๋ฉด node๊ฐ ํ๋๋ฐ์ ์์ผ๋ฏ๋ก tail ์ญ์ ์๋ก์ด node๋ก ์ง์ if n = 0 then tail <- u n <- n + 1 # node ์ ์ฆ๊ฐ return x
pop() # head๋ฅผ ๋ฆฌํด ํ ์ ๊ฑฐ # ๋น์ด์๋ ๋ฆฌ์คํธ ์ด๋ฉด nil return if n = 0 then return nil # ๋ฆฌ์คํธ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด head์ ์์ ์ถ์ถ x <- head.x # ๊ธฐ์กด head์ ๋ค์ node๋ฅผ head๋ก ์ ์ฅ head <- head.next n <- n - 1 # node ์ ๊ฐ์ ํ ๋น ๋ฆฌ์คํธ๊ฐ ๋ ๊ฒฝ์ฐ tail์ Nil์ ์ฅ if n = 0 then tail <- nil return x
remove() # stack์ pop๊ณผ ๋๊ฐ์ด head์์ ์์๊ฐ ์ ๊ฑฐ๋๋ฏ๋ก return pop()
add(x) # tail์ชฝ์ x์ถ๊ฐ u <- new_node(x) # x๋ฅผ ๋ด๋ ์ node ์์ฑ # ๋น ๋ฆฌ์คํธ๋ผ๋ฉด ์ node๊ฐ head๋จ if n = 0 then head <- u # ๋น ๋ฆฌ์คํธ๊ฐ ์๋๋ผ๋ฉด tail๋ค์ ์ node๋ฅผ ์ถ๊ฐ else tail.next <- u tail <- u # ์ node๊ฐ tail์ด ๋จ n <- n + 1 return true
๐ฃ๏ธ ์์ฝ :
- ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก stack๊ณผ (FIFO)queue๋ฅผ ๊ตฌํ ํ ์ ์๋ค.
- push, pop, add, remove ์ฐ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ ์ฌ๋ฌ ๊ฐ์ ์์ ์กฐ๊ฐ ์์ด head๋ tail ๋ถ๋ถ์์ ํ๋์ ์์๋ง์ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ O(1)
- ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ tail์ ์ ๊ฑฐํ๋ ์ฐ์ฐ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(n).
- tail ๋ฐ๋ก ์ ๋ ธ๋๋ฅผ ์ป๊ธฐ ์ํด์๋ head ๋ถํฐ ์์ํด์ ๋งํฌ๋ฅผ ๋ฐ๋ก ๋ฐ๋ผ๊ฐ๋ ์ ๋ฐ์ ์์.
๐ก์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋?
- ๋ ธ๋๊ฐ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํฌ์ธ u.next์ ์ด์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ u.prev ๊ฐ์ ๊ฐ์ง.
- ๊ด๋ จ ์ฐ์ฐ ๊ตฌํ ์ ์์ธ ์ฒ๋ฆฌ์ ์ด๋ ค์์ ์์ ๊ธฐ ์ํด dummy node๊ฐ ์กด์ฌ.
- queue์ฐ์ฐ (add, remove) ๊ณผ stack์ฐ์ฐ (push, pop) ์ ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์.
initialize() n <- 0 # ๋น DLList node๋ฅผ ๋ง๋ค์ด dummy์ ์ ์ฅ dummy <- DLList.Node(nil) dummy.prev <- dummy dummy.next <- dummy
get_node(i) # i ๋ฒ์งธ node๋ฅผ ๋ฆฌํด # i, n - i ์ค ์์ ๊ฐ๋งํผ ํ์์ด ์ผ์ด๋๋ฏ๋ก O(min{i, n - i}) # i๊ฐ ์ค์๋ณด๋ค ์ผ์ชฝ ๊ฐ์ด๋ฉด dummy ๋ถํฐ ์๋ฐฉํฅ ํ์ if i < n/2 then p <- dummy.next repeat i times p <- p.next # i๊ฐ ์ค์๋ณด๋ค ์ค๋ฅธ์ชฝ ๊ฐ์ด๋ฉด dummy๋ถํฐ ์ญ๋ฐฉํฅ ํ์ else p <- dummy repeat n - i times p <- p.prev return p
get(i) # i๋ฒ์งธ node๊ฐ ๋ด๊ณ ์๋ ์์๋ฅผ ๋ฆฌํด # get_node ํธ์ถ์ด ์ผ์ด๋๋ฏ๋ก O(min{i, n - i}) return get_node(i).x
set(i,x) # i๋ฒ์งธ node์ x ์ ์ฅ # get_node ํธ์ถ ์ธ์๋ ์์ ์๊ฐ์ด๋ฏ๋ก O(min{i, n - i}) u <- get_node(i) # i๋ฒ์งธ node๋ฅผ ์ป์ ๋ค y <- u.x u.x <- x # node์ x wjwkd return y
add_before(w,x) # node w์์ x์ถ๊ฐ u <- DLList.Node(x) # x๋ฅผ ๋ด์ node u ์์ฑ u.prev <- w.prev u.next <- w u.next.prev <- u u.prev.next <- u n <- n + 1 return u
add(i,x) # i๋ฒ์งธ์ x๊ฐ ์ค๋๋ก ์ถ๊ฐ # get_node ํธ์ถ ์ธ์๋ ์์ ์๊ฐ์ด๋ฏ๋ก O(min{i, n - i}) add_before(get_node(i), x) # i ๋ฒ์งธ node๋ฅผ ์ฐพ์์ ๊ทธ ์์ x ์ถ๊ฐ
remove_node(w) # node w๋ฅผ ์ญ์ w.prev.next <- w.next w.next.prev <- w.prev n <- n - 1
remove(i) # i๋ฒ์งธ node ์ญ์ # get_node ํธ์ถ ์ธ์๋ ์์ ์๊ฐ์ด๋ฏ๋ก O(min{i, n - i}) remove_node(get_node(i))
๐ฃ๏ธ ์์ฝ :
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ List์ธํฐํ์ด์ค(get, set, add, remove)๋ฅผ ๊ตฌํ ํ๋ค.
- get(i), set(i,x), add(i,x), remove(i)๋ O(min{i, n-i})์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- get_node(i) ๋ถ๋ถ์ใน ์ ์ธํ๋ฉด ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ํ ๋ค๋ฅธ ์ฐ์ฐ์ ๋ชจ๋ ์์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ์ด๋ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ ๊ทผ์ ์์ ์๊ฐ์ด ๋ค์ง๋ง ์ถ๊ฐ๋ ์ญ์ ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฐฐ์ด ๊ธฐ๋ฐ ๋ฆฌ์คํธ์๋ ๋ฐ๋๋๋ค.
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ธ๋ฑ์ค๋ณด๋ค๋ ๋ ธ๋์ ๋ํ ๋ ํผ๋ฐ์ค๊ฐ ์ฃผ์ด์ง๋ ์ํฉ์์ ๋ ์ ๋ฆฌํ๋ค.