Chunked Array (Deque)
Deque์ ์ผ๋ถ ๊ตฌํ์์ ์ฌ์ฉ๋๋ ๊ตฌํ ๋ฐฉ์์ธ๋ฐ, ์ด์ํ๋ฆฌ๋ง์น ์๋ฃ๊ฐ ๋ง์ง ์๋๋ผ.
Chunked Array์ ๋ํ์ ์ธ ๊ตฌํ์ฒด๋ C++์ std::deque์ด๋ค.
๊ทธ ์ธ์๋ ์ฌ์ฉ์ฌ๋ก๋ฅผ ๋ง์ด ๋ณด์ง ๋ชปํ ๊ฒ ๊ฐ๋ค.
๋ํ์ ์ธ ๊ฒฝ์์๋ก๋ ring buffer๊ฐ ์๋ค.
https://blog.naver.com/sssang97/223797898434
์ฌ๊ธฐ์๋ C++์ ๊ตฌํ์ ์ค์ ์ผ๋ก ์ ๋ฆฌํด๋ณธ๋ค.
๊ธฐ๋ณธ ์๋ฆฌ
์ด๊ฑด FIFO queue ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ๋ค.
linked list์ ์ ์ฐ์ฑ๊ณผ ๋ฐฐ์ด์ ์ฑ๋ฅ ํจ์จ์ฑ์ ์ ์ ํ ์์ ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์๋ค.
๊ฐ๊ฐ์ ๊ณ ์ ๊ธธ์ด ๋ฐฐ์ด(chunk)๋ฅผ ๋ง๋ค๊ณ , chunk๋ค์ ์ฎ์ด์ ํ๋์ ๋ฆฌ์คํธ๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
์ค์ ์์๋ค์ ๊ฐ๊ฐ์ chunk์ ์๋ค๋ก ์ ์ฌ๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ chunk๊ฐ ๊ฝ์ฐจ๋ฉด chunk๋ฅผ ์๋ก ํ ๋นํด์ ๋ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋๊ฐ ์ด๋ ๋ค.
์ฌ์ค ์ฝ๊ฒ ๋งํด์ ๊ทธ๋ฅ 2์ฐจ์ ๋ฐฐ์ด์ด๋ค.
์ต์์ root ๋ฐฐ์ด์ ๊ฐ ์ฒญํฌ๋ค์ ํฌ์ธํฐ๋ฅผ ๋ค๊ณ ์๊ณ , ๊ฐ๊ฐ์ ์ฒญํฌ๊ฐ ์ค์ ์์๋ค์ ๋ค๊ณ ์๋ค.
๋ค์ ๊ฐ์ ๋ฃ๊ฑฐ๋ ๋บ ๋๋ ์ฒญํฌ๊ฐ ๊ฐ๋์ฐฐ ๊ฒฝ์ฐ ๊ทธ๋ฅ ์ฒญํฌ๋ฅผ ์ถ๊ฐํด์ ๋ฃ๊ฑฐ๋ ๋บ๋ค.
๊ทผ๋ฐ ์์ ๊ฐ์ ์ถ๊ฐํ ๋๋ 0๋ฒ์งธ์ ์ฒญํฌ๋ฅผ ์ถ๊ฐํ๋ฉด์ ์ค๋ฅธ์ชฝ์ผ๋ก shift๋ฅผ ๋๋ ค์ ๋ฉ๋ชจ๋ฆฌ ๋์ด๋์ ํ ์๋ ์๋ค.
๊ทธ๋์ ํต์์ ์ผ๋ก ์๋ณด๋ค๋ ๋ค์ ๋ฃ๋๊ฒ ๋ ๋น ๋ฅด๊ธด ํ๋ฐ, ์์์ ์์ ๋น๋กํ๋ฉด ์์ ๋จ์๋ผ์ push_front๋ amortize O(1)์ผ๋ก ์ทจ๊ธํ๋ค.
(C++ deque์ ๊ฒฝ์ฐ). chunk์ ํฌ๊ธฐ๋ ํ์ค์์ ๋ช ์ํ ๋ฐ๊ฐ ์์ผ๋ฉฐ, ๋ถํฌ๋ช ํ๋ค. chunk์ ํฌ๊ธฐ๋ฅผ ํต์ ํ๋ ์๋จ๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ๊ณ ์ ๊ธธ์ด ๋ฐฐ์ด์ ๋ฆฌ์คํธ์ด๊ธฐ ๋๋ฌธ์, ๋ฆฌ์คํธ ๊ตฌ์กฐ์์๋ ํน์ดํ๊ฒ ๊ฑฐ์ ์์์๊ฐ์ ์ธ๋ฑ์ฑ์ ํ ์ ์๋ค๋ ํน์ง์ด ์๋ค. ๋ฌผ๋ก ์ง์ง ๋ฐฐ์ด๋ณด๋จ ๋นํจ์จ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ์ฒญํฌ ํฌ๊ธฐ๊ฐ 5๊ณ , [9] ์ธ๋ฑ์ค ์ ๊ทผ์ ํ๋ค๋ฉด, ๋๋ฒ์งธ ์ฒญํฌ์ ๋ค์ด๊ฐ์ ๋ง์ง๋ง ์์๋ฅผ ์ฐ๋ฅธ๋ค๊ฑฐ๋ ํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์ฅ๋จ์
๊ธฐ๊ดดํ๊ธด ํด๋ ๋ฐฐ์ด ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ผ์ linked list ๊ฐ์ non-๋ฐฐ์ด ๊ตฌ์กฐ์ ๋นํด์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ํจ์จ์ ์ด๊ณ ๋น ๋ฅด๋ค๋๊ฒ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ ๋น์ ์ฒญํฌ ๋จ์๋ก ๋ชฐ์์ ํ๊ธฐ ๋๋ฌธ์ ํ ๋น ํจ์จ์ฑ๋ ๋ฐ์ด๋๋ค.
๊ฒ๋ค๊ฐ ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ฑ์ด ๋๋ค๋ ๊ฒ๋ ์ ์ฐํ ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ ๋ถ๋ถ์ด๋ค.
ํ์ง๋ง, ๋ฐฐ์ด์ ๊ทผ์ฌํ๋๊ฑฐ์ง ์ง์ง ๋ฐฐ์ด์ฒ๋ผ ๋น ๋ฅด์ง๋ ์๋ค.
๋จ์ ๋ ๊ฝค ๋ง๋ค.
- ์ฒญํฌ ๋ด์ ์์๋ค์ ์ ๋ฐฐ์ด๋์ด์์ง๋ง ์ฒญํฌ๋ค๋ผ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ถ์ฐ๋์ด์๊ธฐ ๋๋ฌธ์ ์บ์๋ฅผ ํญ์ ์ ํ๋ค๊ณ ํ ์๊ฐ ์๋ค. linked list๋ณด๋ค๋ ๋ซ์ง๋ง flatํ ๋ฐฐ์ด๋ณด๋ค๋ ๋ชปํ๋ค.
- ์ธ๋ฑ์ฑ๋ ์์ฃผ ๋น ๋ฅด๋ค๊ณ ๋ ํ ์ ์๋ค. ์ฐธ์กฐ๋ฅผ ์ต์ ๋๋ฒ ํ๋๊ฑฐ๋ผ์ ์ผ๋ฐ ๋ฐฐ์ด์ ๋นํด์ ๋์ถฉ 30% ์ ๋๋ ๋๋ฆฌ๋ค.
- ์ฒญํฌ ๋ด๋ถ์์๋ ๋ถํ์ํ ๋ณต์ฌ๋ ์ด๋์ด ๋ฐ์ํ์ง ์์ง๋ง, ์ต์์ map์ด ๋ฐฐ์ด์ด๋ผ์ ์ฒญํฌ์ ๋ํ ํฌ์ธํฐ๋ค์ ์ฌ๋ฐฐ์น๋ฅผ ํด์ผํ ๋๊ฐ ์๋ค. ๊ฑฐ์ ์์ ์๊ฐ์ ๊ทผ์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ์๊ฐ์ด๋ผ๊ณ ํํํ๊ธด ํ์ง๋ง, ์ฌ๋ฐฐ์น ๋น์ฉ์ ๋ถ๋ช ํ ์กด์ฌํ๋ค. ์ฝ์ ๋น์ฉ์ linked list๋งํผ ์์ ์ ์ด์ง ์๋ค.
vs Ring Buffer
๊ตณ์ด ๋น๊ตํ๋ค๋ฉด Ring Buffer๊ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋๊ฐ ๋ ๊ฒ์ด๋ค.
๋๋จ ์กฐํ, ์ฝ์ , ์ญ์ ์ฑ๋ฅ์ ์์ด์๋ flatํ ๋ฐฐ์ด ๊ตฌ์กฐ์ธ Ring buffer๊ฐ ํจ์ฌ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์๋ค.
ํ์ง๋ง Ring Buffer๋ compactํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ด๋ ค์ด ์ง์ ์ด ์๊ณ , (dynamic ring buffer์ผ ๊ฒฝ์ฐ) ํ์ฅ ์์ ์์๋ค์ ์ฎ๊ฒจ์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ํฌ์ธํฐ๋ฅผ ๋ฌดํจํํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
C++์ iterator ํจํด์์๋ ์ด๊ฒ ๊ฝค ์น๋ช
์ ์ธ ๊ฒฐํจ์ด ๋๋ค. ํ์ฅ์ด ์ผ์ด๋๋ฉด ๊ธฐ์กด iterator๊ฐ ๋ฌดํจํ๋ ์ ์๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทผ๋ฐ ๋ด๊ฐ ๋ณด๊ธฐ์ ๋์ฒด๋ก๋ ring buffer๊ฐ ๋ฐ์ด๋ ์ง์ ์ด ๋ง์ ๊ฒ ๊ฐ๋ค.
์ฐธ์กฐ
https://en.cppreference.com/w/cpp/container/deque
https://stackoverflow.com/questions/6292332/what-really-is-a-deque-in-stl
https://stackoverflow.com/questions/5728359/stl-internals-deque-implementation
https://stackoverflow.com/questions/8627373/what-data-structure-exactly-are-deques-in-c
https://stackoverflow.com/questions/40275112/c-stddeque-implementation-why-not-use-circular-buffer
https://stackoverflow.com/questions/76856176/why-is-the-circular-buffer-not-standardized-in-c