1. 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