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-๋ฐฐ์—ด ๊ตฌ์กฐ์— ๋น„ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ํšจ์œจ์ ์ด๊ณ  ๋น ๋ฅด๋‹ค๋Š”๊ฒŒ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ• ๋‹น์„ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋ชฐ์•„์„œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ• ๋‹น ํšจ์œจ์„ฑ๋„ ๋›ฐ์–ด๋‚˜๋‹ค.
๊ฒŒ๋‹ค๊ฐ€ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์‹ฑ์ด ๋œ๋‹ค๋Š” ๊ฒƒ๋„ ์œ ์—ฐํ•œ ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

ํ•˜์ง€๋งŒ, ๋ฐฐ์—ด์— ๊ทผ์‚ฌํ•˜๋Š”๊ฑฐ์ง€ ์ง„์งœ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋น ๋ฅด์ง€๋Š” ์•Š๋‹ค.
๋‹จ์ ๋„ ๊ฝค ๋งŽ๋‹ค.

  1. ์ฒญํฌ ๋‚ด์˜ ์š”์†Œ๋“ค์€ ์ž˜ ๋ฐฐ์—ด๋˜์–ด์žˆ์ง€๋งŒ ์ฒญํฌ๋“ค๋ผ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋ถ„์‚ฐ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ๋ฅผ ํ•ญ์ƒ ์ž˜ ํƒ„๋‹ค๊ณ  ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. linked list๋ณด๋‹ค๋Š” ๋‚ซ์ง€๋งŒ flatํ•œ ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ชปํ•˜๋‹ค.
  2. ์ธ๋ฑ์‹ฑ๋„ ์•„์ฃผ ๋น ๋ฅด๋‹ค๊ณ ๋Š” ํ•  ์ˆ˜ ์—†๋‹ค. ์ฐธ์กฐ๋ฅผ ์ตœ์†Œ ๋‘๋ฒˆ ํƒ€๋Š”๊ฑฐ๋ผ์„œ ์ผ๋ฐ˜ ๋ฐฐ์—ด์— ๋น„ํ•ด์„œ ๋Œ€์ถฉ 30% ์ •๋„๋Š” ๋А๋ฆฌ๋‹ค.
  3. ์ฒญํฌ ๋‚ด๋ถ€์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋‚˜ ์ด๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ์ตœ์ƒ์œ„ 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