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