let's get IT with DAVINA ๐Ÿ’ป

[์ž๋ฃŒ๊ตฌ์กฐ/์„ ํ˜•๊ตฌ์กฐ] ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ณธ๋ฌธ

DEV_IN/Algorithm

[์ž๋ฃŒ๊ตฌ์กฐ/์„ ํ˜•๊ตฌ์กฐ] ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๋‹ค๋นˆ์น˜์ฝ”๋“œ๐Ÿ’Ž 2023. 3. 8. 17:08

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

  • ์›์†Œ๋“ค์„ ์ €์žฅํ•  ๋•Œ ๊ทธ ๋‹ค์Œ ์›์†Œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์„ฑ์งˆ

  1. k๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ™•์ธ/๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด O(k)๊ฐ€ ํ•„์š”ํ•จ
    • ์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ, ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค์Œ ์ฃผ์†Œ๋กœ ๋„˜์–ด๊ฐ€๋ฉฐ ์ฐพ์•„์•ผ ํ•จ
  2. ์ž„์˜์˜ ์œ„์น˜์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐ๋Š” O(1)
    • ์ด์ „ ์›์†Œ์— ๋‹ค์Œ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝ๋งŒ ํ•ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
    • ๋‹จ, ์ถ”๊ฐ€/์ œ๊ฑฐ ํ•˜๊ณ  ์‹ถ์€ ์œ„์น˜์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ O(1)
  3. ์›์†Œ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์—ฐ์†ํ•ด์žˆ์ง€ ์•Š์•„ Cache hit rate๊ฐ€ ๋‚ฎ์ง€๋งŒ ํ• ๋‹น์ด ๋‹ค์†Œ ์‰ฌ์›€

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ข…๋ฅ˜

  • ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ : ๊ฐ ์›์†Œ๊ฐ€ ์ž์‹ ์˜ ๋‹ค์Œ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๋“ค๊ณ  ์žˆ์Œ
  • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ : ๊ฐ ์›์†Œ๊ฐ€ ์ž์‹ ์˜ ์ด์ „ & ๋‹ค์Œ ์ฃผ์†Œ๋ฅผ ๋‘˜ ๋‹ค ๋“ค๊ณ  ์žˆ์Œ
  • ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ : ๋์ด ์ฒ˜์Œ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ
    • ๊ฐ ์›์†Œ๊ฐ€ ์ด์ „๊ณผ ๋‹ค์Œ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๋ชจ๋‘ ๋“ค๊ณ  ์žˆ์–ด๋„ ์ƒ๊ด€ X

๋ฐฐ์—ด VS ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

  • BOTH → ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  ๋ฐฐ์—ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
k๋ฒˆ์งธ ์›์†Œ์˜ ์ ‘๊ทผ O(1) O(k)
์ž„์˜ ์œ„์น˜์— ์›์†Œ ์ถ”๊ฐ€/์ œ๊ฑฐ O(N) O(1)
๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฐฐ์น˜ ์—ฐ์† ๋ถˆ์—ฐ์†
์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ณต๊ฐ„ (Overhead) - O(N)

๊ธฐ๋Šฅ๊ณผ ๊ตฌํ˜„

insert ํ•จ์ˆ˜

1. ์ƒˆ๋กœ์šด ์›์†Œ๋ฅผ ์ƒ์„ฑ
2. ์ƒˆ ์›์†Œ์˜ pre ๊ฐ’์— ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ์ฃผ์†Œ๋ฅผ ๋Œ€์ž…
3. ์ƒˆ ์›์†Œ์˜ nxt ๊ฐ’์— ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ nxt๊ฐ’์„ ๋Œ€์ž…
4. ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ nxt๊ฐ’๊ณผ ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ๋‹ค์Œ ์›์†Œ์˜ pre๊ฐ’์„ ์ƒˆ ์›์†Œ๋กœ ๋ณ€๊ฒฝ
5. unused 1์ฆ๊ฐ€
void insert(int addr, int num) { //์‚ฝ์ž…ํ•  ์œ„์น˜ addr, ์‚ฝ์ž…ํ•  ์ˆซ์ž num
	dat[unused]=num;
    pre[unused]=addr; //์‚ฝ์ž…ํ•  ์œ„์น˜๊ฐ€ ์ด์ „ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์—.
    nxt[unused]=nxt[addr];
    if(nxt[addr]!= -1) pre[nxt[addr]]= unused; //์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ๋‹ค์Œ ์›์†Œ์˜ pre๊ฐ’
    nxt[addr]=unused; //์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ๋‹ค์Œ๊ฐ’์ด ๋‚ด๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์›์†Œ์˜ ์œ„์น˜
    unused++;
}

๋งจ ๋งˆ์ง€๋ง‰ ์›์†Œ์˜ ๋’ค์— ์ƒˆ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ, ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ๋‹ค์Œ ์›์†Œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— if๋ฌธ ์‚ฌ์šฉ!

erase ํ•จ์ˆ˜

1. ์ด์ „ ์œ„์น˜์˜ nxt๋ฅผ ์‚ญ์ œํ•  ์œ„์น˜์˜ nxt๋กœ ๋ณ€๊ฒฝ
2. ๋‹ค์Œ ์œ„์น˜์˜ pre๋ฅผ ์‚ญ์ œํ•  ์œ„์น˜์˜ pre๋กœ ๋ณ€๊ฒฝ
void erase(int addr){
	nxt[pre[addr]]=nxt[addr];
    if(nxt[addr]!=-1) pre[nxt[addr]]=pre[addr];
}

dummy node์˜ ์กด์žฌ๋กœ ์ธํ•ด ๊ทธ ์–ด๋–ค ์›์†Œ๋ฅผ ์ง€์šฐ๋”๋ผ๋„ pre[addr]๋Š” -1์ด ์•„๋‹˜์ด ๋ณด์žฅ๋˜์ง€๋งŒ, 

๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ์ง€์šฐ๋ฉด ๋‹ค์Œ๊บผ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— if๋ฌธ ๋ถ™์—ฌ์ฃผ๊ธฐ!

Comments