-
[Data Structure] Linked List (Feat. Array)Data Structure 2022. 1. 12. 23:44
๋ฐฐ์ด (Array)์ด๋?
- ์์๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋ ์๋ฃ๊ตฌ์กฐ
- ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด์ ์์๋ฅผ ๋ฐ๋ก ์ฐพ์ ์ ์๋ค.
๋ฐฐ์ด์ ํน์ง
- O(1)์ n๋ฒ์งธ ์์๋ฅผ ํ์ธํ๊ณ , ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ถ๊ฐ์ ์ผ๋ก ์๋ชจ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์, ์ฆ ์ค๋ฒํค๋๊ฐ ๊ฑฐ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฐ์ดํฐ๋ค์ด ๋ถ์ด์๊ธฐ ๋๋ฌธ์, Cache hit rate๊ฐ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ ์ฐ์์ ์ผ๋ก ๊ตฌ๊ฐ์ ์ก์์ผํ๋ฏ๋ก, ํ ๋น์ ๋ค์ ์ ์ฝ์ด ์๋ค.
- ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ, ๋ง์ง๋ง ์ธ๋ฑ์ค ์ด์ธ์ ์ธ๋ฑ์ค์ ์๋กญ๊ฒ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋, ์์๋ค์ ์๋กญ๊ฒ ๋ฐฐ์นํด์ผํ๊ธฐ ๋๋ฌธ.
ใ ค
- ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ, ๋ง์ง๋ง ์ธ๋ฑ์ค ์ด์ธ์ ์ธ๋ฑ์ค์ ์๋กญ๊ฒ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋, ์์๋ค์ ์๋กญ๊ฒ ๋ฐฐ์นํด์ผํ๊ธฐ ๋๋ฌธ.
์ฐ๊ฒฐ ๋ฆฌ์คํธ (Linked List)๋?
- ๋ฉ๋ชจ๋ฆฌ ์์ ์ฐ์์ ์ด์ง ์์ ๋ฐ์ดํฐ๋ค์ ๋งํฌ๋ก ์ฐ๊ฒฐํด๋์ ์๋ฃ๊ตฌ์กฐ
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋
ธ๋๋ก ์ด๋ฃจ์ด์ ธ์๋๋ฐ, ๋
ธ๋๋ data (๋ฐ์ดํฐ), link (๋งํฌ)๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
- data์๋ ๋ฐ์ดํฐ๊ฐ, link์๋ ๋ค์์ ์ฌ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ค.
- ๋ ธ๋๋ค์ด ์ฐ๊ฒฐ๋์ด ์ด๋ฃจ์ด์ง ๊ฒ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ.

์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํน์ง
- n๋ฒ์งธ ์์๋ฅผ ํ์ธ/๋ณ๊ฒฝํ ๋์ ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค.
- ์์์ ์์น์ ์์๋ฅผ ์ถ๊ฐ/์ญ์ ํ ๋์ ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
- ์์๋ค์ด ๋ฉ๋ชจ๋ฆฌ ์์ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์, Cache hit rate๊ฐ ๋ฎ์ง๋ง ํ ๋น์ด ๋ค์ ์ฝ๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์์ ์์น์ ์์ ์ถ๊ฐ/์ญ์ ํ๊ธฐ
- ์๊ฐ ๋ณต์ก๋ = O(1)
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ 2๋ฒ์งธ ์์น์ ์์ ์ถ๊ฐํ๊ธฐ
- ์ฒซ๋ฒ์งธ ์์๊ฐ ์๋ก ์ถ๊ฐ๋๋ ์์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๊ณ , ์๋ก ์ถ๊ฐ๋๋ ์์๋ ์๋ 2๋ฒ์งธ ์์น์ ์กด์ฌํ๋ ์์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค.
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ 2๋ฒ์งธ ์์น์ ์กด์ฌํ๋ ์์ ์ ๊ฑฐํ๊ธฐ
- ์ฒซ๋ฒ์งธ ์์๊ฐ 2๋ฒ์งธ ์์๊ฐ ์๋ ์ธ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๊ธฐ
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ข ๋ฅ
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Singly Linked List)
- ๊ฐ ์์๊ฐ ์์ ์ ๋ค์ ์์์ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
- ์ฃผ์ด์ง ์์์ ์ด์ ์์๊ฐ ๋ฌด์์ธ์ง ์ ์ ์๋ค.
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Doubly Linked List)
- ๊ฐ ์์๊ฐ ์์ ์ ์ด์ ์์์ ๋ค์ ์์์ ์ฃผ์๋ฅผ ๋ชจ๋ ๊ฐ๋๋ค.
- ์ฃผ์ด์ง ์์์ ์ด์ ์์๊ฐ ๋ฌด์์ธ์ง ์ ์ ์๋ค.
- ์์๊ฐ ๊ฐ๊ณ ์๋ ์ ๋ณด๊ฐ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ณด๋ค 1๊ฐ ๋ ๋์ด๋๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ๋ ๋ค๋ ๋จ์ ์ด ์๋ค.
- ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Circular Linked List)
- ๋ฆฌ์คํธ์ ๋์ด ์ฒ์๊ณผ ์ฐ๊ฒฐ๋์ด์๋ค.
- ๊ฐ ์์๊ฐ ์์ ์ ์ด์ ์์์ ๋ค์ ์์์ ์ฃผ์๋ฅผ ๋ชจ๋ ๊ฐ๊ณ ์์ด๋, ์์ด๋ ์๊ด์ด ์๋ค.
ใ ค

ใ ค
๋ฐฐ์ด vs ์ฐ๊ฒฐ ๋ฆฌ์คํธ


ใ ค
์ผ๋งค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌํํ๊ธฐ
์์๋ฅผ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๊ณ pre์ nxt์ ์ด์ /๋ค์ ์์์ ํฌ์ธํฐ ๋์ ๋ฐฐ์ด ์์ ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ.
let MX = 100 var dat = [Int](repeating: 0, count: MX) // ๋ฐ์ดํฐ ์ ์ฅ var pre = [Int](repeating: -1, count: MX) // ์ด์ ์ฃผ์ (์ธ๋ฑ์ค) ์ ์ฅ var nxt = [Int](repeating: -1, count: MX) // ๋ค์ ์ฃผ์ (์ธ๋ฑ์ค) ์ ์ฅ var unused = 1 // ํ์ฌ ์ฌ์ฉ๋์ง ์๋ ์ธ๋ฑ์ค (์๋ก์ด ์์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์ธ๋ฑ์ค)๋ก, ์์ ์ถ๊ฐ ์ดํ์๋ 1์ฉ ์ฆ๊ฐ- dat[i] : i๋ฒ์ง ์์์ ๊ฐ
- pre[i] : i๋ฒ์ง ์์์ ๋ํด ์ด์ ์์์ ์ธ๋ฑ์ค
- nxt[i] : i๋ฒ์ง ์์์ ๋ํด ๋ค์ ์์์ ์ธ๋ฑ์ค
- pre๋ nxt์ ๊ฐ์ด -1์ด๋ฉด ํด๋น ์์์ ์ด์ /๋ค์ ์์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ๋ป์ด๋ค.
- unused : ํ์ฌ ์ฌ์ฉ๋์ง ์๋ ์ธ๋ฑ์ค. ์ฆ ์๋ก์ด ์์๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์ธ๋ฑ์ค๋ก, ์์๊ฐ ์ถ๊ฐ๋ ์ดํ์๋ 1์ฉ ์ฆ๊ฐ๋ ๊ฒ์ด๋ค.
- 0๋ฒ์ง๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์ ์์๋ก ๊ณ ์ . ๋ค๋ฅด๊ฒ ๋งํ์๋ฉด 0๋ฒ์ง์๋ ๊ฐ์ด ๋ค์ด๊ฐ์ง ์๊ณ ๋จ์ง ์์์ ์ ๋ํ๋ด๊ธฐ ์ํ dummy node์ด๋ค.
- ๊ธธ์ด๊ฐ ๋ฐ๋ก ํ์ํ๋ค๋ฉด, len ๋ณ์๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ ์์๊ฐ ์ถ๊ฐ๋ ๋ 1์ฉ ์ฆ๊ฐ์ํค๊ณ , ์ ๊ฑฐ๋ ๋ 1์ฉ ๊ฐ์์ํค๋ฉด ๋๋ค.
traverse ํจ์ - ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ค ์ถ๋ ฅํ๊ธฐ
- 0๋ฒ์ง์์ ์ถ๋ฐํด์ nxt์ ์ ํ ๊ฐ์ ๋ณด๊ณ ๊ณ์ ๋์ด๊ฐ๋ฉด์ dat๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
- cur๋ผ๋ ๋ณ์์ ๊ฐ ์์๋ค์ ์ฃผ์๋ฅผ ๋ด์๊ฐ๋ฉด์ ์ด๋ํ๋ ๋ฐฉ์์ผ๋ก, cur์ -1์ด ์ ์ฅ๋๋ฉด ๋์ ๋๋ฌํ๋ค๋ ๋ป์ด๋ฏ๋ก while๋ฌธ์ ํ์ถํ๊ณ traverse๊ฐ ์ข ๋ฃ๋๋ค.
/// ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ค์ ์ถ๋ ฅ (์ฐ๊ฒฐ ์์๋๋ก ์ถ๋ ฅ) func traverse() { var cur = nxt[0] while cur != -1 { print(dat[cur], terminator: " ") cur = nxt[cur] } print("** traverse ๋ **") }insert ํจ์ - ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์ ์ฝ์ ํ๊ธฐ
- ์ ์์๋ฅผ ์์ฑํ๋ค. ์ด ๋ unused ๊ฐ์ด ์๋ก์ด ์์๊ฐ ๋ค์ด๊ฐ ์ธ๋ฑ์ค๊ฐ ๋๋ค.
- ์ ์์์ pre ๊ฐ์ ์ฝ์ ํ ์์น์ ์ฃผ์ (์ธ๋ฑ์ค)๋ฅผ ๋์ ํ๋ค.
- unused๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ด ์๋ก์ด ์์๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ. ๊ทธ ์๋ฆฌ์ dat์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
/// ์๋ฅผ ๋ค์ด ์์ 13์ด 2๋ฒ์ง์ด๊ณ 13 ๋ค์ 20์ ์๋ก ์ถ๊ฐํ๊ณ ์ถ์๊ฑฐ๋ฉด insert(2, 20)์ ํธ์ถ /// unused๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ด ์๋ก์ด ์์๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ. ๊ทธ ์๋ฆฌ์ dat์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. /// - Parameters: /// - addr: ์ถ๊ฐํ๋ ค๋ ์์์ ์์น (์ฃผ์, ์ธ๋ฑ์ค, ๋ฒ์ง) /// - num: ์ถ๊ฐํ ๊ฐ func insert(addr: Int, num: Int) { // 1. ์๋ก์ด ์์ ์์ฑ dat[unused] = num // 2. ์ ์์์ pre ๊ฐ์ ์ฝ์ ํ ์์น (์ฃผ์) ๊ฐ ์ ์ฅ pre[unused] = addr // 3. ์ ์์์ nxt ๊ฐ์ ์ฝ์ ํ ์์น์ nxt ๊ฐ ์ ์ฅ nxt[unused] = nxt[addr] // 4. ์๋กญ๊ฒ ๋ค์ด๊ฐ ์์์ ์๋ฆฌ์ ์๋ ์๋ ์์์ nxt ๊ฐ๊ณผ ์ฝ์ ํ ์์น์ ๋ค์ ์์์ pre ๊ฐ์ ์ ์์๋ก ๋ณ๊ฒฝ // (์ฝ์ ํ ์์น์ nxt ๊ฐ๊ณผ ์ฝ์ ํ ์์น์ ๋ค์ ์์์ pre ๊ฐ์ ์ ์์๋ก ๋ณ๊ฒฝ) if nxt[unused] != -1 { // ์๋ก ์ฝ์ ํ ์์๊ฐ ๋ง์ง๋ง์ด ์๋ ๊ฒฝ์ฐ์๋ง! pre[nxt[addr]] = unused } nxt[addr] = unused unused += 1 }erase ํจ์ - ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์ ์ฝ์ ํ๊ธฐ
- ์ด์ ์์์ nxt๋ฅผ ์ญ์ ํ๋ ค๋ ์์์ nxt๋ก ๋ณ๊ฒฝํ๋ค.
- ๋ค์ ์์์ pre๋ฅผ ์ญ์ ํ๋ ค๋ ์์์ pre๋ก ๋ณ๊ฒฝํ๋ค. ์ญ์ ํ๋ ค๋ ์์๊ฐ ๋ง์ง๋ง ์์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ด ์์ ์ ์งํํ๋ค.
/// ์์ 13์ด 2๋ฒ์ง์ด๊ณ , 13์ ์ง์ฐ๊ณ ์ถ์ผ๋ฉด erase(2)๋ฅผ ํธ์ถ /// - Parameter addr: ์ง์ฐ๋ ค๋ ์์์ ์์น (์ฃผ์, ์ธ๋ฑ์ค, ๋ฒ์ง) func erase(addr: Int) { // 1. ์ด์ ์์์ nxt๋ฅผ ์ญ์ ํ๋ ค๋ ์์์ nxt๋ก ๋ณ๊ฒฝ nxt[pre[addr]] = nxt[addr] // 2. ๋ค์ ์์์ pre๋ฅผ ์ญ์ ํ๋ ค๋ ์์์ pre๋ก ๋ณ๊ฒฝ. if nxt[addr] != -1 { // ์ญ์ ํ๋ ค๋ ์์๊ฐ ๋ง์ง๋ง ์์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง! pre[nxt[addr]] = pre[addr] } }์ ์ฒด ์ผ๋งค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฝ๋
import Foundation let MX = 100 var dat = [Int](repeating: 0, count: MX var pre = [Int](repeating: -1, count: MX) var nxt = [Int](repeating: -1, count: MX) var unused = 1 func insert(addr: Int, num: Int) { dat[unused] = num pre[unused] = addr nxt[unused] = nxt[addr] if nxt[unused] != -1 { pre[nxt[addr]] = unused } nxt[addr] = unused unused += 1 } func erase(addr: Int) { nxt[pre[addr]] = nxt[addr] if nxt[addr] != -1 { pre[nxt[addr]] = pre[addr] } } func traverse() { var cur = nxt[0] while cur != -1 { print(dat[cur], terminator: " ") cur = nxt[cur] } print("** traverse ๋ **") } print("๐insert test๐") insert(addr: 0, num: 10) traverse() // 10(address=1) insert(addr: 0, num: 30) traverse() // 30(address=2) 10 insert(addr: 2, num: 40) traverse() // 30 40(address=3) 10 insert(addr: 1, num: 20) traverse() // 30 40 10 20(address=4) insert(addr: 4, num: 70) traverse() // 30 40 10 20 70(address=5) print("\n๐erase test๐") erase(addr: 1) traverse() // 30 40 20 70 erase(addr: 2) traverse() // 40 20 70 erase(addr: 4) traverse() // 40 70 erase(addr: 5) traverse() // 40
ใ ค
ใ ค'Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Structure] ๊ทธ๋ํ์ ํธ๋ฆฌ (0) 2022.03.14 [Data Structure] ํ (Queue) (0) 2022.02.13 [Data Structure] ์คํ (Stack) (0) 2022.02.09