Skip to content

Latest commit

ย 

History

History
117 lines (92 loc) ยท 3.34 KB

Trie.md

File metadata and controls

117 lines (92 loc) ยท 3.34 KB

ํŠธ๋ผ์ด (Trie)


ํŠธ๋ผ์ด๋ž€?

๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ๋ฐ ์ €์žฅ์„ ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ

  • ๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ์— ์‚ฌ์šฉ
  • ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ

ํŠธ๋ผ์ด์˜ ์ž‘๋™ ์›๋ฆฌ

์ƒ์„ฑ

  1. ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๋งจ ์•ž ๋ฌธ์ž๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. ํ˜„์žฌ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด, ๊ทธ ๋…ธ๋“œ๋กœ ๋‹ค์Œ ๋ฌธ์ž์—ด์„ ํƒ์ƒ‰ํ•˜๊ณ , ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋…ธ๋“œ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ํ›„ ๋‹ค์Œ ๋ฌธ์ž์—ด์„ ํƒ์ƒ‰ํ•œ๋‹ค.
  3. ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์—ด์ด ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  4. ๋”์ด์ƒ ์‚ฝ์ž…ํ•  ๋ฌธ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋๋‚œ ๋ฌธ์ž์—ด์ž„์„ ํ‘œ์‹œํ•œ๋‹ค.

ํƒ์ƒ‰

  1. ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. ํ˜„์žฌ ๋…ธ๋“œ(๋ฃจํŠธ๋…ธ๋“œ)์˜ ์ž์‹ ๋…ธ๋“œ์— ํ•ด๋‹น ๋ฌธ์ž์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ ๋ฌธ์ž๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    • ๋งŒ์•ฝ ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์— ํ•ด๋‹น ๋ฌธ์ž์˜ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํŠธ๋ผ์ด์— ์‚ฝ์ž…๋˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.
  3. ์œ„์˜ ๊ณผ์ •์„ ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  4. ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์—ด๊นŒ์ง€ ๋…ธ๋“œ์— ์กด์žฌํ•  ๊ฒฝ์šฐ, ๋๋‚œ ๋ฌธ์ž์—ด ํ‘œ์‹œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
    • ๋งŒ์•ฝ ๋ฌธ์ž์—ด์ด ๋๋‚ฌ๋‹ค๋Š” ํ‘œ์‹œ๊ฐ€ ๋˜์–ด์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฌธ์ž์—ด์€ ํŠธ๋ผ์ด์— ์กด์žฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ๋ฌธ์ž์—ด์€ ํŠธ๋ผ์ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.



ํŠธ๋ผ์ด์˜ ์žฅ์ 

  • ๋น ๋ฅธ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค.
    • ์ƒ์„ฑ ์‹œ๊ฐ„ ๋ณต์žก๋„ -> O(M*L)
    • ํƒ์ƒ‰ ์‹œ๊ฐ„ ๋ณต์žก๋„ -> O(L)
    • M์€ ์ด ๋ฌธ์ž์—ด์˜ ์ˆ˜, L์€ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
  • ์ •๋ ฌ๋˜์–ด ์ €์žฅ๋œ๋‹ค.

ํŠธ๋ผ์ด์˜ ๋‹จ์ 

  • ์ €์žฅ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค.



์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ (C)

๋…ธ๋“œ ๊ตฌ์กฐ

typedef struct node{
    int fin; //๋๋‚œ ๋ฌธ์ž์—ด์ž„์„ ์•Œ๋ฆฌ๋Š” ๋ณ€์ˆ˜
    struct node *child[26] //์•ŒํŒŒ๋ฒณ 26๊ฐœ(์ž์‹์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜)
}node;

๋…ธ๋“œ ์ƒ์„ฑ

node *newNode(){
    node* new=(node *)malloc(sizeof(node));
    new-> fin=0;
    for(int i=0;i<26;i++) new->child[i]=0; //0์œผ๋กœ ์ดˆ๊ธฐํ™”
    return new;
}

์‚ฝ์ž…

void insert(node *root, const char* str){
    int len=strlen(str);
    node* now=root;
    for(int i=0;i<len;i++){
        if(!now->child[str[i]-'a']) now->child[str[i]-'a']=newNode(); //ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ž์‹๋…ธ๋“œ ์ƒ์„ฑ
        now=now->child[str[i]-'a']; //๋ฌธ์ž ์ €์žฅ
    }
    now->fin=1; //๊ธธ์ด๋งŒํผ ์ €์žฅํ•˜๋ฉด, ๋๋‚œ ๋ฌธ์ž์—ด์ž„์„ ์•Œ๋ฆฐ๋‹ค
}

ํƒ์ƒ‰

int search(node *root, const char* str){
    node* now=root;
    for(int i=0;i<strlen(str);i++){
        if(!now->child[str[i]-'a']) return 0;
        now=now->child[str[i]-'a'];
    }
    return now->fin;
}

radix Trie

  • ํŠธ๋ผ์ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์ข‹๊ฒŒ ๋งŒ๋“  ์ž๋ฃŒ๊ตฌ์กฐ.
  • compact prefix tree๋ผ๊ณ ๋„ ํ•จ
  • ํ™€๋กœ ์žˆ๋Š” ์ž์‹์ธ ๊ฒฝ์šฐ, ๋ถ€๋ชจ๋…ธ๋“œ์™€ ํ•ฉ์ณ์„œ ๊ณต๊ฐ„ ์ตœ์ ํ™”๋ฅผ ํ•จ.
  • radix Tree์™€ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•จ



์ฐธ๊ณ ์ž๋ฃŒ
https://yabmoons.tistory.com/379 https://en.wikipedia.org/wiki/Radix_tree https://brunch.co.kr/@springboot/75