- Basic Concepts(2)
ADT Implementations
Two basic structures to implement ADTโs
1) ๋ฐฐ์ด ๊ธฐ๋ฐ ๊ตฌํ โ โindex โ elementโ ๋งคํ
์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ฅผ ๋๋ํ ์ ์ฅํ์ฌ ์ธ๋ฑ์ค๋ก ์ฆ์ ์ ๊ทผํ๋ค.
์๊ฐ ๋ณต์ก๋
์ฐ์ฐ | ๋ณต์ก๋ | ๋น๊ณ |
---|---|---|
์์ ์ ๊ทผ A[i] |
O(1) | ์ธ๋ฑ์ค ์ง์ ์ ๊ทผ |
๋์ ์ฝ์ ยท์ญ์ | O(1) amortized / ์ต์ O(n) | ์ฉ๋ 2๋ฐฐ(doubling) ์ ๋ต ์ ํ๊ท O(1), ์ฌํ ๋น ์ O(n) |
์ค๊ฐ ์ฝ์ ยท์ญ์ | O(n) | ๋ค ์์ ์ด๋ ํ์ |
ํ์ | ์ ๋ ฌ X: O(n) / ์ ๋ ฌ O: O(log n) | ์ด๋ถ ํ์ ๊ฐ๋ฅ(์ ๋ ฌ ์) |
์ฅ์
- ์บ์ ์ง์ญ์ฑ ์ฐ์ โ ์ค์ ์คํ ์๋ ์ ๋ฆฌ
- ์ค๋ฒํค๋ ์์(ํฌ์ธํฐ ์ ์ฅ ๋ถํ์)
๋จ์
- ํฌ๊ธฐ ๋ณ๊ฒฝ ๋น์ฉ(์ฌํ ๋น/๋ณต์ฌ)
- ์ฐ์ ๊ณต๊ฐ ์๊ตฌ โ ํฐ ๋ฐฐ์ด์ ํ ๋น ์คํจ ๊ฐ๋ฅ
์ ํ์ ์ฉ๋
- ์คํ, ์ํ ํ(๋ฐฐ์ด), ๋์ ๋ฐฐ์ด(
vector
/ArrayList
) - ๋น๋ฒํ ๋๋ค ์ก์ธ์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ
2) ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ธฐ๋ฐ ๊ตฌํ โ โnode โ next์ ์์นโ ์ ์ฅ
๊ฐ ๋ ธ๋๋ ๋ฐ์ดํฐ์ ๋ค์ ๋ ธ๋์ ์ฃผ์(ํฌ์ธํฐ)๋ฅผ ๊ฐ์ง๋ค. ๋ฉ๋ชจ๋ฆฌ๋ ๋ถ์ฐ์ ๊ฐ๋ฅ.
์๊ฐ ๋ณต์ก๋
์ฐ์ฐ | ๋ณต์ก๋ | ๋น๊ณ |
---|---|---|
์์ ์ ๊ทผ | O(n) | ์์์๋ถํฐ ์์ฐจ ์ถ์ |
์/๋ค ์ฝ์ ยท์ญ์ | O(1) | ํฌ์ธํฐ ๊ฐฑ์ ๋ง; ๋ค ์ฝ์
O(1) ๋ณด์ฅ์ tail ์ ์ง |
๋ ธ๋ ์์น ์๊ณ ์์ ๋ ์ฝ์ /์ญ์ | O(1) | ์ฐธ์กฐ ๋ ธ๋ ์ฃผ์ด์ง |
ํ์ | O(n) | ์ ํ ํ์ |
์ฅ์
- ํฌ๊ธฐ ๊ฐ๋ณ, ์ค๊ฐ ์ฝ์ ยท์ญ์ ๋น๋ฒํ ๋ ์ ๋ฆฌ
- ์ฐ์ ๊ณต๊ฐ ๋ถํ์ โ ์ธ๋ถ ๋จํธํ์ ๋ ๋ฏผ๊ฐ
๋จ์
- ํฌ์ธํฐ ์ ์ฅ ์ค๋ฒํค๋(๋จ์ผ/์ด์ค ๋งํฌ์ ๋ฐ๋ผ 1~2๊ฐ)
- ์บ์ ์ฑ๋ฅ ์ ํ(pointer chasing)
- ๋์ ํ ๋น/ํด์ ๋น์ฉ, ํํธํ
์ ํ์ ์ฉ๋
- ๋ฆฌ์คํธ ADT์์ ์ค๊ฐ ์ฝ์ /์ญ์ ๊ฐ ๋ง์ ๋
- ์ฐ์ ํ ๋น์ด ์ด๋ ค์ด ํ๊ฒฝ
3) ๋ฌด์์ ์ธ์ ์ฐ๋๊ฐ โ ๊ฒฐ์ ๊ท์น
- ๋๋ค ์ ๊ทผ์ด ๋ง๋ค โ ๋ฐฐ์ด
- ์ค๊ฐ ์ฝ์ /์ญ์ ๋น๋ฒ โ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ํฌ๊ธฐ๋ฅผ ์์ฃผ ํค์ด๋ค โ ๋ ๋ค ๊ฐ๋ฅ
- ๋ฐฐ์ด์ doubling์ผ๋ก amortized O(1) ์ ์ง
- ๋งค์ฐ ํฐ ๊ฐ์ฒด ๋ณต์ฌ ๋น์ฉ์ด ๋ฌธ์ ๋ฉด ๋ฆฌ์คํธ
- ๋ฉ๋ชจ๋ฆฌ ์ง์ญ์ฑ/์คํ ์๋๊ฐ ์ค์ โ ๋ฐฐ์ด
- ์ฐ์ ํ ๋น์ด ์ด๋ ค์ โ ๋ฆฌ์คํธ
4) ๋ํ ADT๋ฅผ ๋ ๋ผ๋๋ก ๊ตฌํํ ๋
ADT | ๋ฐฐ์ด ๊ธฐ๋ฐ | ๋ฆฌ์คํธ ๊ธฐ๋ฐ |
---|---|---|
์คํ | top ์ธ๋ฑ์ค ์ด๋ โ push/pop/top O(1) amortized |
๋จธ๋ฆฌ ์ฝ์
/์ญ์ โ push/pop/top O(1) |
ํ | ์ํ ๋ฒํผ๋ก head/tail ๋ชจ๋๋ฌ ๊ฐฑ์ โ O(1) |
head/tail ํฌ์ธํฐ ์ ์ง โ O(1) |
์์ฐจ ๋ฆฌ์คํธ(List) | ์ ๊ทผ O(1) / ์ค๊ฐ ์ฝ์ ยท์ญ์ O(n) | ์์น๋ง ์๋ฉด ์ฝ์ ยท์ญ์ O(1) / ์ ๊ทผ O(n) |
5) ๊ตฌํ ์ ์ฃผ์(์ค์ ํ)
- ๋ฐฐ์ด ๋์ ํ์ฅ: ์ฉ๋ 2๋ฐฐ ์ ๋ต์ผ๋ก ํ๊ท O(1).
์ถ์๋ ํ์คํ ๋ฆฌ์์ค(์: ์ฌ์ฉ๋ฅ 1/4 ์ดํ์์๋ง ์ถ์)๋ก ๊ณผ๋ํ ์ฌํ ๋น ๋ฐฉ์ง. - ๋ฆฌ์คํธ ๋
ธ๋ ํฌ๊ธฐ: ๋ฐ์ดํฐ๊ฐ ์์์๋ก ํฌ์ธํฐ ์ค๋ฒํค๋ ๋น์จโ.
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ํฌ์ธํฐ 2๊ฐ. - ์บ์/๋ถ๊ธฐ ์์ธก: ๋ฐฐ์ด์ ์ ํ ์ํ ๋งค์ฐ ๋น ๋ฆ, ๋ฆฌ์คํธ๋ pointer chasing ๋ณ๋ชฉ.
- ๋ฉ๋ชจ๋ฆฌ ์์ ๊ถ: ๋ฆฌ์คํธ์ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ์ ์ฅํ ๋ ํด์ ์ฃผ์ฒด(policy)๋ฅผ ๋ช ํํ ์ ํ ๊ฒ.
1. โ๋๋ค ์ ๊ทผโ์ ์๋ฏธ
์ ์(์๊ณ ๋ฆฌ์ฆ ๊ด์ ): i
๊ฐ ๋งค๋ฒ ๋ฌ๋ผ์ง๋ ์ํฉ์์ i
๋ฒ์งธ ์์๋ฅผ ์ฆ์ ์ฝ๊ฑฐ๋ ์ฐ๋ ์ ๊ทผ์ด ์์ฃผ ๋ฐ์ํ๋ ๊ฒ.
โ ์์์๋ถํฐ ์ฐจ๋ก๋ก ์ค์บํ๋ ์์ฐจ ์ ๊ทผ๊ณผ ๋๋น๋๋ค.
์
- ์ด๋ถ ํ์
- ํ์ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ๋ถ๋ชจ/์์ ์ฐธ์กฐ
- DP ํ
์ด๋ธ์์
dp[iยฑk]
์ฐธ์กฐ - ๋ฐฐ์ด ๊ธฐ๋ฐ ๊ทธ๋ํ(์ธ์ ํ๋ ฌ)์์
M[u][v]
์ง์
2. ๋ฐฐ์ด์ด ๋๋ค ์ ๊ทผ์ ๊ฐํ ์ด์
2.1 (a) ์ฃผ์ ๊ณ์ฐ์ด O(1)
์ฐ์ ๋ฉ๋ชจ๋ฆฌ + ๊ณ ์ ํฌ๊ธฐ ์์ โ ์ฃผ์ ๊ณ์ฐ: addr = base + i * sizeof(T)
CPU๋ ํ ๋ฒ์ ์ฃผ์ ๊ณ์ฐ + ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋ก๋/์คํ ์ด๋ก ๋๋๋ค.
โ ์๊ฐ ๋ณต์ก๋ O(1)
, ์์ํญ๋ ์๋ค.
2.2 (b) ํฌ์ธํฐ ์ถ์ ์ด ์์
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ k
๋ฒ์งธ๋ฅผ ์ฝ์ผ๋ ค๋ฉด ํค๋๋ถํฐ k
๋ฒ ํฌ์ธํฐ ์ญ์ฐธ์กฐ๊ฐ ํ์.
โ ๊ธฐ๋ ์๊ฐ O(k)
, ํ๊ท O(n/2)
.
m
๊ฐ์ ์๋ก ๋ค๋ฅธ ๋๋ค ์ธ๋ฑ์ค๋ฅผ ์ง์ํ๋ฉด ์ด ๋น์ฉ์ด ๋๋ต O(mยทn)
๊น์ง ์ปค์ง ์ ์๋ค.
2.3 (c) ํ๋์จ์ด ํจ์จ
์ฐ์ ๋ฐฐ์น ๋๋ถ์ ์บ์ / TLB / ํ๋ฆฌํ์ณ๊ฐ ์ ์๋.
๋๋ค ์ธ๋ฑ์ค๋๋ผ๋ โ์์๋น ๋ก๋ 1ํโ๋ก ๋๋๋ ๊ฒฝํฅ.
๋ฐ๋ฉด ๋ฆฌ์คํธ๋ ๋
ธ๋๋น ๋ฐ์ดํฐ + ๋ค์ ํฌ์ธํฐ ๋ฑ ์ฌ๋ฌ ๋ก๋์ ๋ถ๊ธฐ ์์กด์ด ์๊ธด๋ค.
๋ฒกํฐํ(SIMD), ๋ถ๊ธฐ ์์ธก ์ธก๋ฉด์์๋ ๋ฐฐ์ด์ด ์ ๋ฆฌ.
3. ๊ฐ๋จ ๋น๊ต ์์
3.1 ๋ฐฐ์ด
int x = A[i]; // i๊ฐ ๋งค๋ฒ ๋ฐ๋์ด๋ ํ ๋ฒ์ O(1)
A[j] = 7;
3.2 ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
typedef struct Node {
int val;
struct Node* next;
} Node;
int get_kth(Node* head, int k){ // 0-index
for (int t = 0; t < k; ++t) head = head->next; // k๋ฒ ํฌ์ธํฐ ์ถ์
return head->val;
}
// get_kth ์์ฒด๊ฐ O(k). m๋ฒ ์๋ก ๋ค๋ฅธ k๋ฅผ ์์ฒญ๋ฐ์ผ๋ฉด ์ด ฮฃk โ O(mยทn).
4. ์ค์ ์์น ๊ฐ๊ฐ
n = 1,000,000
, m = 1,000,000
๊ฐ์ ์์ ์ธ๋ฑ์ค ์กฐํ:
- ๋ฐฐ์ด:
m
ํ ร 1 ๋ก๋ โ 1,000,000ํ ๋ก๋ - ๋ฆฌ์คํธ: ํ๊ท
n/2 โ 500,000
๋จ๊ณ๋ฅผm
๋ฒ โ 5ร10^11 ํ ํฌ์ธํฐ ์ถ์
โ ์ฐจ์์ด ๋ค๋ฅด๋ค
5. ์์ธ์ ์ฃผ์
-
๊ฐ๋ณ ํฌ๊ธฐ ์์
๊ฐ๋ณ ๊ธธ์ด ๋ฌธ์์ด ๋ฑ์ ํ ๋ฉ์ด๋ฆฌ ๋ฐฐ์ด์ ์์ด ์ ์ฅํ๋ฉดi
๋ฒ์งธ์ ์์ ์ฃผ์๋ฅผ ๊ณ์ฐํ ์ ์์ดO(1)
์ด ๊นจ์ง๋ค.
โ ์คํ์ ํ ์ด๋ธ(์ธ๋ฑ์ค ๋ฐฐ์ด)์ ๋ณ๋๋ก ๋๋ค. -
์์ ๋๋ค ํจํด + ๋งค์ฐ ํฐ ๋ฐ์ดํฐ
๋ฐ์ดํฐ๊ฐ L3 ์บ์๋ฅผ ํจ์ฌ ๋์ผ๋ฉด ์บ์ ์ ์ค๋ฅ ์ ๋ฎ์์ง๋ค.
๊ทธ๋๋ ๋ฐฐ์ด์ ์์๋น 1ํ ์ ๊ทผ, ๋ฆฌ์คํธ๋ ๋ ธ๋๋ง๋ค ๋ค์ ์ ๊ทผ + ์์กด ์ฒด์ธ์ด๋ผ ๋ถ๋ฆฌํจ์ ์ ์ง.
6. ๊ฒฐ๋ก โ ์์ฌ๊ฒฐ์ ๋ฌธ์ฅ
- ์์ ์์น ์ฐธ์กฐ๊ฐ ๋น๋ฒ,
k
๋ฒ์งธ ์์๋ฅผ ์์ฃผ ์ฝ๊ณ /์ฐ๋ ๋ฌธ์ โ ๋ฐฐ์ด(๋์ ๋ฐฐ์ด/vector) ๊ถ์ฅ. - ์ค๊ฐ ์ฝ์ /์ญ์ ๊ฐ ์๋์ ์ผ๋ก ๋ง๊ณ , ์ ๊ทผ์ด ์ฃผ๋ก ํ์ฌ ์์น ๊ธฐ์ค์ด๋ฉด โ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ณ ๋ ค.
๋ถ๋ก. ์ ๊ทผ ํจํด๋ณ ์์ฝ
A. ์์ ์ ๊ทผ (random access)
- ๋ฐฐ์ด:
addr = base + i*sizeof(T)
ํ ๋ฒ ๊ณ์ฐ โ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋ก๋๋ก ๋. ์ฌ์ค์ โ์ต๋ ํ ๋ฒโ. - ์ฐ๊ฒฐ ๋ฆฌ์คํธ:
k
๋ฒ์งธ๋ฅผ ๋ณด๋ ค๋ฉดhead
๋ถํฐnext
ํฌ์ธํฐ๋ฅผk
๋ฒ ๋ฐ๋ผ๊ฐ โk
๋ฒ์ ํฌ์ธํฐ ์ญ์ฐธ์กฐ + ์บ์ ๋ฏธ์ค ๊ฐ๋ฅ์ฑ.
๊ฒฐ๋ก : ์์ ์์น ์ ๊ทผ์ด ์ฆ์ผ๋ฉด ๋ฐฐ์ด์ด ์๋์ ์ผ๋ก ์ ๋ฆฌ.
B. ์์ฐจ ์ค์บ (one-pass scan)
- ์ด๋ก ์ ๋ ๋ค
O(n)
. - ๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ ์ฐ์์ด๋ผ ์บ์/ํ๋ฆฌํ์น๊ฐ ์ ์๋ํด ๋งค์ฐ ๋น ๋ฆ(๋ฃจํ๋น ๋จ์ ์ธ๋ฑ์ค ์ฆ๊ฐ).
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋งค ์์๋ง๋ค
next
์ญ์ฐธ์กฐ โ ์์กด ์ฒด์ธ + ๋ฎ์ ์บ์ ํจ์จ.
์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ด ๋ ๋น ๋ฆ.
C. ์ธ์ ๋ฆฌ์คํธ๊ฐ ๋ซ๋
- ์ค๊ฐ ์ฝ์
/์ญ์ ๊ฐ ๋งค์ฐ ์ฆ๊ณ , ๊ทธ ์ง์ ์ ๋
ธ๋ ํฌ์ธํฐ๋ฅผ ์ด๋ฏธ ๋ณด์ ํ๊ณ ์๋ ๊ฒฝ์ฐ โ ๊ทธ ์๋ฆฌ์์
O(1)
์ฝ์ /์ญ์ . - ๊ทธ ์ธ(๋๋ค ์ ๊ทผยท๋๋ ์ค์บ ์ค์ฌ)๋ ๋์ฒด๋ก ๋ฐฐ์ด์ด ๋ซ๋ค.
Leave a comment