LinkedList, VecDeque ๋ฑ
์ปฌ๋ ์ ์ค์์ ํน์ ํ ์ํฉ์์ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ์ธ ์ ์๋ ์๋ฃ๊ตฌ์กฐ๋ก LinkedList์ VecDeque๊ฐ ์๋ค. ๋ ๋ค ํน์ ์ฐ์ฐ์ ์ ๋ฆฌํ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋, ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก๋ Vec์ด๋ ๋ค๋ฅธ ๊ณ ์์ค ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ๋๊ฐ ๋ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ ๋๋ ๋ด๋ถ ๋์ ์๋ฆฌ์ ์๊ฐ ๋ณต์ก๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด ๋ฑ์ ์ถฉ๋ถํ ๊ณ ๋ คํด์ผ ํ๋ค.
LinkedList๋ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(doubly linked list) ํํ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๊ฐ ๋ ธ๋๋ ์์ ์ ์ ๋ ธ๋์ ๋ค ๋ ธ๋์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์, ํน์ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ค๋ก ์ํ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฝ์ ๊ณผ ์ญ์ ๋ ๋ฆฌ์คํธ์ ์์ ์์น์์ ๊ธฐ์กด ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ์๋ง ์๊ณ ์๋ค๋ฉด O(1)์ ์ํ ๊ฐ๋ฅํ๋ค๋ ์ ์ด ํน์ง์ด๋ค. ๊ทธ๋ฌ๋ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ๋ Vec๊ณผ ๋ฌ๋ฆฌ ๋ ธ๋๊ฐ ํฉ์ด์ ธ ์๊ณ , ๊ฐ ๋ ธ๋๊ฐ ์ถ๊ฐ์ ์ธ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฏ๋ก ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ฆ์์ง ์ ์๋ค. ๋ํ ์์์ ์์น์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ๋ ธ๋๋ฅผ ๋ฐ๋ผ๊ฐ์ผ ํ๋ฏ๋ก O(n)์ด ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์ํ์ ๋๋ค ์ก์ธ์ค๊ฐ ์ฆ์ ๊ฒฝ์ฐ์๋ LinkedList๊ฐ ์คํ๋ ค ์ฑ๋ฅ์ ์ผ๋ก ๋ถ๋ฆฌํ ์ ์๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ ํน์ ์ง์ ์ด ํ์ ๋์ด ์๊ฑฐ๋, ๋งค์ฐ ํน์ํ ์ํฉ์์๋ง LinkedList๊ฐ ์ ํฉํ๋ค.
LinkedList๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
use std::collections::LinkedList;
fn main() {
let mut list = LinkedList::new();
list.push_back(10);
list.push_back(20);
list.push_front(0);
println!("{:?}", list);
list.pop_front();
list.push_back(30);
println!("{:?}", list);
// ๋
ธ๋ ์ํ๋ฅผ ์์๋ก ํ์ธ
for val in list.iter() {
println!("๊ฐ: {}", val);
}
}์ ์ฝ๋์์ list๋ [0, 10, 20]์ ํํ๋ก ์ด๊ธฐ ๊ตฌ์ฑ๋ ๋ค, pop_front()๋ฅผ ํตํด 0์ด ๋น ์ ธ๋๊ฐ๊ณ 30์ ๋ค์ ์ถ๊ฐํ์ฌ [10, 20, 30]์ผ๋ก ๋ณ๊ฒฝ๋๋ค. LinkedList๋ iter() ๋ฉ์๋๋ก ์ํํ ์ ์๊ณ , iter_mut(), into_iter() ๋ฑ์ ํ์ฉํ์ฌ ๊ฐ๋ณ ์ํ๋ ๊ฐ ์ด๋๋ ๊ฐ๋ฅํ๋ค. ์ด๋ฌํ ๋ฉ์๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ์ปฌ๋ ์ ๊ณผ ์ ์ฌํ ๋์์ธ ํจํด์ ๋ฐ๋ฅธ๋ค.
LinkedList๋ ๋ ธ๋ ๋จ์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์ฐ๋์ด ์๊ธฐ ๋๋ฌธ์ CPU ์บ์ ์ง์ญ์ฑ์ด ๋ฎ์์ง ์ ์๋ค. ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ, Vec์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ธ๋ค. LinkedList๋ ์ด๋๊ฐ์์ ์ด๋ฏธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ํฌ์ธํฐ๊ฐ ์ฃผ์ด์ ธ ์์ ๋ ๊ทธ ์๋ฆฌ์ ์์ฝ๊ฒ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ ํ์๊ฐ ์์ ๋๋ง ์ง์ ํ ์ฅ์ ์ ๋ฐํํ๋ค. ์ผ๋ฐ์ ์ผ๋ก Rust ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์์์๋ โํน์ํ ์ํฉ์ด ์๋๋ผ๋ฉด LinkedList๋ฅผ ์ฐ์ง ์๋ ๊ฒ์ด ์ข๋คโ๋ ์ธ๊ธ์ด ์๋ค.
VecDeque๋ ์์ชฝ ๋์์ O(1)์ ๊ฐ๊น์ด ์๊ฐ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ ์ด์ค ๋ฐํฌ(double-ended queue) ์๋ฃ๊ตฌ์กฐ์ด๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ๊ณ ์ ํฌ๊ธฐ ๋ฐฐ์ด์ ๋ ๊ฐ ์ด์ ๋ง ๋ฒํผ(ring buffer) ํํ๋ก ์ฐ๊ฒฐํด ๊ด๋ฆฌํ๋ฉฐ, ํ์ ์๋ค๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ๊ณต๊ฐ์ ์ฌํ ๋นํ๊ฑฐ๋ ์ฌ๋ฐฐ์นํ๋ค. ๋จ๋ฐฉํฅ ํ(Queue)๊ฐ ํ์ํ๋ฐ ์์ชฝ ๋์์ ์ฝ์ ํน์ ์ญ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด๋ผ๋ฉด VecDeque๊ฐ ์ ๋ฆฌํ๋ค.
VecDeque์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ push_front, pop_front, push_back, pop_back ์ฐ์ฐ์ ๋ชจ๋ ํ๊ท ์ ์ผ๋ก O(1)์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Vec์ push/pop ์ฐ์ฐ์ ๋์ชฝ์ ๋ํด์๋ง O(1)์ ๋ณด์ฅํ๊ณ ์์ชฝ์ ๋ํด์๋ O(n)์ด ๋ ์ ์์ผ๋ฏ๋ก, ์๋ฃ์ ์์ชฝ ๋์์ ์ฝ์ ์ด๋ ์ ๊ฑฐ๊ฐ ๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ VecDeque๊ฐ ์ ์ ํ๋ค.
VecDeque๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด ์ฝ๋๋ [-1, 0, 1, 2]๋ฅผ ์ถ๋ ฅํ ๋ค ์ํํ์ฌ ๊ฐ ๊ฐ์ ํ๋์ฉ ์ถ๋ ฅํ๋ค. deque์ ๊ฐ์ด ๋ ๋ง์ด ์์ฌ ์๋ ์ํฉ์ด๋ผ ํด๋ ์์ชฝ ๋์์์ ์ฝ์ ์ญ์ ๋ ๋น ๋ฅด๋ค. ๋ค๋ง VecDeque ์ญ์ ์ค๊ฐ ์์น์ ์์๋ก ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ๋ฅผ ์ํํ๋ฉด ๋ด๋ถ ์์๋ค์ ์ฌ๋ฐฐ์นํด์ผ ํ๋ฏ๋ก O(n)์ด ๋ฐ์ํ๋ค. ์ด ์ ์์ LinkedList์๋ ๋ค๋ฅธ ์ ๋ต์ ์ฐ์ง๋ง, ์ญ์๋ ์ค๊ฐ ์ฐ์ฐ์๋ ๋น์ฉ์ด ํฌ๋ค.
LinkedList์ VecDeque ๋ชจ๋ ํน์ ์ผ์ด์ค์์๋ง ๋์ ํจ์จ์ฑ์ ์ ๊ณตํ๋ฏ๋ก, ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ผ๋ฉด ๋ค๋ฅธ ์ปฌ๋ ์ (Vec, HashMap, BTreeMap ๋ฑ)์ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ์ ์งํ๋ฉด์ ํน์ ์ง์ ๋ ธ๋์ ๋ํ ์ฝ์ ยท์ญ์ ๊ฐ ๋งค์ฐ ๋น๋ฒํ๊ฑฐ๋, ์์ชฝ ๋์์ ๊ฐ์ ์ถ๊ฐยท์ ๊ฑฐ๊ฐ ์ง์์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ํ ์๋๋ฆฌ์ค์ฒ๋ผ ๋ช ํํ ์๊ตฌ ์ฌํญ์ด ์๋ค๋ฉด LinkedList๋ VecDeque๊ฐ ์ต์ ์ผ ์ ์๋ค. Rust๋ ์ด ๋ ์๋ฃ๊ตฌ์กฐ์ ๋ํ์ฌ ์์ ์ฑ์ ์ต๋ํ ๋ณด์ฅํจ๊ณผ ๋์์, ๊ฐ๋ฐ์๊ฐ ๋ด๋ถ ๊ตฌํ์ด๋ ํน์ฑ(์๊ฐ ๋ณต์ก๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ, CPU ์บ์ ์ ์ค๋ฅ ๋ฑ)์ ์ถฉ๋ถํ ๊ณ ๋ คํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ ๋ฆฌ๋ API๋ฅผ ์ ๊ณตํ๋ค.
์ปฌ๋ ์ ์ ์ ํํ ๋๋ ๊ฐ ์๋ฃ๊ตฌ์กฐ์ ์ฅ๋จ์ ์ ๋ฐ๋์ ๋ถ์ํด์ผ ํ๋ฉฐ, Rust์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ํ ์ํฉ์ ๋ง์ถฐ์ ์ฌ์ฉํ ์ ์๋๋ก ์ฌ๋ฌ ๊ฐ์ง ๋์์ ์ ์ํ๊ณ ์๋ค. LinkedList์ VecDeque๋ ๊ทธ์ค ํ๋์ด๋ฉฐ, ์ง๋์น๊ฒ ๋ํดํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ง์ ๊ตฌํํ์ง ์๊ณ ๋ ํ์ํ ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ์ ์ฉํ ์ ์๋ค๋ ์ ์์ ์ค์ํ ๋๊ตฌ๊ฐ ๋๋ค. ์ฌ์ฉ ์ ์ ์ค์ ๋ก ์๊ตฌ๋๋ ์์ , ๋ฐ์ดํฐ์ ํฌ๊ธฐ, ์ ๊ทผ ๋ฐ ์ฝ์ ํจํด์ ๋ฉด๋ฐํ ์ดํผ๋ ๊ฒ์ด ์ฑ๋ฅ ๋ฐ ์ฝ๋ ์ ์ง๋ณด์์ ํฐ ๋์์ด ๋ ๊ฒ์ด๋ค.
Last updated