๐ ๋ณธ ํฌ์คํ ์ CS ์์ ์ ๋ณต ๊ฐ์๋ฅผ ์๊ฐํ๊ณ ์ ๋ ๋ณต์ต ํฌ์คํ ์ ๋๋ค.
์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์์ ์ด๋ฉฐ ์์ฐจ์ ์ผ๋ก ๋ฏธ๋ฆฌ ํ ๋น๋ ํฌ๊ธฐ๋งํผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ
์ฌ๊ธฐ์ ์ค์ํ๊ฑฐ๋!!
- ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์์ ์ผ๋ก
- ๋ฏธ๋ฆฌ ํ ๋น๋ ๋ฐ์ดํฐ๋งํผ
์ด๋ผ๋ ๋๊ฐ์ง ํฌ์ธํธ๊ฐ ์ค์ํ๋ค.
Array๋
์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์์
์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ผ์ ๋ถ๋ถ์ array ์์ ํ๋์ ํฌ๊ธฐ๋ก ํ ๋นํ๊ณ , ๊ทธ ์์ ๋ถํฐ ์ฐ์์ ์ผ๋ก array์ ํฌ๊ธฐ๋งํผ ํ ๋นํ๋ค.
์กฐํ -> O(1)
random Access
ํน์ ์ธ๋ฑ์ค์ ๊ฐ ์กฐํ๋ ๊ณ์ฐ์ผ๋ก ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
ex) array์ ํ ์์์ ๋ฉ๋ชจ๋ฆฌ 4๊ฐ๊ฐ ํ ๋น๋์๊ณ 4๋ฒ์งธ index์ ๊ฐ์ ์๊ณ ์ถ๋ค๋ฉด?
์ฒซ index + 4(๋ฉ๋ชจ๋ฆฌํฌ๊ธฐ) x 3(index)
์ด๋ฐ์์ผ๋ก ๊ณ์ฐํด์ ์ ๊ทผ ํ ์กฐํํ๋ค.
๋ง์ง๋ง ์ธ๋ฑ์ค ๋ฐ์ดํฐ ์ถ๊ฐ/์ญ์ (append()
, delete()
) -> O(1)
๊ทธ๋ฅ ๋ง์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ์
/ ์ญ์ -> O(n)
์ญ์ / ์ฝ์
์ ํ ํ ๋จ์ ๋ฐ์ดํฐ๋ค์ ํ ์นธ์ฉ ์ฎ๊ฒจ์ค์ผํ๊ธฐ ๋๋ฌธ์ n๊ฐ์ ๋ฐฐ์ด์ด๋ผ๋ฉด O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
ํ์ -> O(n)
์ผ์ผ์ด ๋ฐฉ๋ฌธํด์ ํ์ธํ๊ธฐ ๋๋ฌธ์ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๋ฐํ์ผ๋ก ์ฅ์ ๊ณผ ๋จ์ ์ด ์๋ค.
์ฅ์ : ์กฐํ๋ ๋ฐ์ดํฐ ์ถ๊ฐ์ ์๋๊ฐ ๋น ๋ฅด๋ค
๋จ์ : ์ ์ธ์์ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ํด์ผํ๊ณ ์ด์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ์ถ๊ฐ์ overhead์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
Array์ fixed size๋ผ๋ ํ๊ณ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๊ณ ์๋ Array.
์ ์ฅ๊ณต๊ฐ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉด resize๋ฅผ ํ์ฌ ์ ๋์ ์ผ๋ก size๋ฅผ ์กฐ์ ํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ค์ํ๊ฒ ๋ณผ ๊ฒ์ ๋๊ฐ์ง
- resize ๋ฐฉ์
- ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ ์๊ฐ๋ณต์ก๋
resize ๋ฐฉ์
๊ธฐ์กด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ด์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ๋ค๋ฉด?
๊ธฐ์กด์ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ํฌ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋ฐฐ์ด์ ์ ์ธํ ํ ๊ทธ ๋ฐฐ์ด๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธด๋ค.
๋ํ์ ์ผ๋ก๋ ๊ธฐ์กด Array Size์ 2๋ฐฐ๋ฅผ ํ ๋นํ๋ Doubling ๋ฐฉ๋ฒ์ด ์๋ค.
Doubling (๋๋ธ๋ง)
๊ธฐ์กด ๋ฐฐ์ด ์ฌ์ด์ฆ๋ณด๋ค 2๋ฐฐ ํฐ ๋ฐฐ์ด์ ์ ์ธํจ
ํฐ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ๊ธฐ์กด์ ๋ฐฐ์ด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ฒจ์ผ ํ๊ธฐ ๋๋ฌธ์ O(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋์ ์๊ฐ๋ณต์ก๋
Dynamic Array๋ Array์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋๋ O(1)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
ํ์ง๋ง resize์ ์๊ฐ๋ณต์ก๋๋ O(n)
๊ทธ๋ ๋ค๋ฉด ๋ฐ์ดํฐ ์ถ๊ฐ์ ์๊ฐ๋ณต์ก๋๋?
๊ฒฐ๋ก ์ O(1)
์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ resize๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ๋ ์์ฃผ ๊ฐ๋ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ์ฃผ๋ก O(1)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋๊ฒ.
์ด๋ฅผ amortized O(1)
์ด๋ผ๊ณ ํ๋ค.
์์ฃผ ๊ฐ๋ ๋ฐ์ํ๋ O(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ์์ฃผ ๋ฐ์ํ๋ O(1)
์ด ๋๋ ๊ฐ์ง๋ฉด์ O(1)
์ด ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋ฐ๋ท๋ฌผ์ ์์ด๋ฅผ ๋น ๋จ๋ฆฐ๋ค๊ณ ํด์ ๋ฐ๋ท๋ฌผ์ด ์
์ง์ง๋ ์๊ณ ์ฌ์ ํ ์ง ๊ทธ๋ฐ๊ฑฐ์ผ๋ ค๋..? ใ
Dynamic Array๋ฅผ Linked List์ ๋น๊ตํ์ ๋ ์ฅ๋จ์ ์ ๋ฌด์์ผ๊น?
์ฅ์
1. Dynamic Array๊ฐ Linked List์ ๋นํด ๋ฐ์ดํฐ ์ ๊ทผ๊ณผ ํ ๋น์ด O(1)
๋ก ๋น ๋ฅด๋ค. index ์ ๊ทผ๋ฒ์ด ์ฐ์ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ (random access).
2. ๋ฐ์ดํฐ๋ฅผ ๋งจ ๋ค์ ์ถ๊ฐ/์ญ์ ๊ฐ O(1)
๋ก ์๋์ ์ผ๋ก ๋น ๋ฅด๋ค.
๋จ์
1. ๋งจ ๋์ด ์๋ ๊ณณ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
/์ญ์ ํ ๋๋ O(n)
์ผ๋ก ๋๋ฆฌ๋ค. ๋ฐ์ดํฐ๋ค์ shift ํ๊ธฐ ๋๋ฌธ.
2. resize์ ํ์ ํ ๋ฎ์ performance ๋ฐ์. ๋ฐ์ดํฐ๋ฅผ ๋ค ์ฎ๊ฒจ์ผ ํ๊ธฐ ๋๋ฌธ.
3. ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ resize ์์ ๋๋ํ ํ ๋น๋ฐ๋๋ฐ ์ด๋ ๊ฒ ๋๋ฉด ์ฌ์ฉํ์ง ์๊ณ ๋จ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ฐ์ ํ ์ ์๋ค.
node ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ ์๋ ์๋ฃ๊ตฌ์กฐ. node์๋ ๋ฐ์ดํฐ๊ฐ๊ณผ ๋ค์ node์ address๊ฐ ์ ์ฅ๋์ด ์๋ค. ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ์์์๋ ๋น์ฐ์์ ์ผ๋ก ๋ํ๋์ง๋ง ๊ฐ๊ฐ์ node๊ฐ ๋ค์ node์ address๋ฅผ ๊ฐ๋ฆฌํด์ผ๋ก์จ ๋ ผ๋ฆฌ์ ์ฐ์์ฑ์ ๊ฐ์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ค์ํ ํฌ์ธํธ
- node
- ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋น์ฐ์์
- ๋ ผ๋ฆฌ์ ์ฐ์์ฑ
Linked List๋ tree, graph ๋ฑ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ์ด๋ค. ์ค๋ช
ํฌ์ธํธ๋ ๋ฉ๋ชจ๋ฆฌ์์์๋ ๋ถ์ฐ์์ ์ด์ง๋ง node์ address๊ฐ์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ๋
ผ๋ฆฌ์ ์ฐ์์ฑ์ ๋ณด์ฅํ๋ค.
๋ํ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
node์๋ ๋ฐ์ดํฐ ๊ฐ๊ณผ ๋ค์ node์ address๊ฐ ์ ์ฅ๋์ด ์๋๋ฐ ๋ง์ง๋ง node๊ฐ ๊ฐ๋ฆฌํค๋ address๋ 0x00000
๋ก null
๊ฐ์ด๋ค.
๊ฐ node๋ค์ next address ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ผ๋ฆฌ์ ์ฐ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ ์ฐ๊ฒฐ๋์ด ์๋ค. Array๋ ์ด์๋ ๋ค๋ฅด๊ฒ ์ฐ์์ฑ์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋๋ค. Linked List๋ ๋ ผ๋ฆฌ์ ์ฐ์์ฑ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋ ์์ ๋กญ๊ณ ํจ์จ์ ์ด์ง๋ง ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๊ฐ๋ง ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋๋ผ address๋ ์ถ๊ฐ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ํฌ๋ค.
Linked List์์ ๋ฐ์ดํฐ์ ์ฝ์
๊ณผ ์ญ์ ๋ ๋๋ค node์ address ๊ฐ๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
์ฝ์
์ ์ํ๋ ๊ฒฝ์ฐ๋ ์ํ๋ ์์น์ ์์ ๋
ธ๋์ address๋ฅผ ์ฝ์
ํ๋ data์ address๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๊ณ ์ญ์ ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ๋ ์ญ์ ํ๋ ๋
ธ๋์ ์์ ๋
ธ๋์ address๋ฅผ ๋ค์ address๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ O(1)
์ด ๋๋ค.
๋ฐ์ดํฐ ์ ๊ทผ์ ์๊ฐ๋ณต์ก๋๋ O(n)
์ด๋ค. Linked List๋ ๋ฐ์ดํฐ์ ์์ฐจ์ ์ ๊ทผ๋ง์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. n๋ฒ์งธ์ ๋ฐ์ดํฐ๊ฐ ์๊ณ ์ถ๋ค๋ฉด ์ฒ์๋ถํฐ n๊น์ง์ address๋ฅผ ๋ฐ๋ผ๊ฐ์ผ ํ๋ค. search๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
Array๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๊ฐ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋๋ค. Linked List๋ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋์ง ์์ง๋ง ๋ ผ๋ฆฌ์ ์ฐ์์ฑ์ ๋๋ค. ์ด์ ๋ฐ๋ผ ๊ฐ operation์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ค๋ฅด๊ฒ ๋ํ๋๋ค.
Array | Linked List | |
---|---|---|
์กฐํ | O(1) | O(n) |
์ฝ์ /์ญ์ | O(n) | O(1) |
๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ๊ฐฏ์๊ฐ ์ ํด์ ธ์๊ณ ์์ฃผ ์กฐํํ๋ค๋ฉด Array๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ
๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ์์ํ ์ ์๊ณ ์ฝ์
/์ญ์ ๊ฐ ์์ฃผ ์ผ์ด๋๋ค๋ฉด Linked List๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฃผ๋ ์ฐจ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ๊ตฌ์กฐ๋ก Array๋ ์ฐ์์ , Linked List๋ ๋ถ์ฐ์์ ์ด๋ผ๋ ๊ฑธ ์ธ์๋๋ฉด ๋๋ค.
๋์ ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ์ฉ๋๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ฐ๋ผ ๋ญ๊ฐ ๋ ํจ์จ์ ์ธ์ง ํ๋จํ๋ฉด ๋๋ค.
O(1)
O(n)
O(1)
/ ์ค๊ฐ์ธ ๊ฒฝ์ฐ -> O(n)
O(1)
์ ์๊ฐ๋ณต์ก๋O(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.Array๋ compile ๋จ๊ฒ์์ memory allocation
= Static Memory Allocation์ผ๋ก Stack Memory ์์ญ์ ํ ๋น
Linked List๋ runtime ๋จ๊ณ์์ memory allocation
= Dynamic Memory Allocation์ผ๋ก Heap Memory ์์ญ์ ํ ๋น