[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/자료구조 & 알고리즘

[자료구조] TRIE IDEA

inu 2020. 6. 17. 16:26
  • 본 게시글은 대학생이 수업을 듣고 내용을 정리한 것입니다.
  • 따라서 완벽하지 않은 부분이 있을 수 있습니다.
  • 아울러 본 게시글에 포함된 코드들은 대략적인 개념 이해만을 위해 작성된 것으로 완전하지 않은 코드임을 알려드립니다.

Huffman Coding

  • 등장 빈도에 따라 압축한다.
  • 등장빈도가 큰 것은 짧게, 등장빈도가 작은 것은 길게 표현한다.
  • 노드들을 리프 위치에 등장빈도 순으로 일렬로 정렬하고, 등장빈도가 작은 것부터 둘 씩 묶는다.
  • 묶인 것은 합을 표현한다.
  • 그렇게 트리가 완성되면 왼쪽은 0, 오른쪽은 1로 엣지에 표기한다.
  • root부터 각 노드에 도달할 때까지의 엣지 코드가 최종 허프만 코드가 된다.
  • 이는 랜덤한 경우에 더 유용하다. 연속된 문자가 많을 경우 각각을 8a와 같은 식으로 압축하는 것이 더 효율적일 것이다.

TRIE idea

  • 리프에만 값이 존재하도록 하는 허프만 코드의 아이디어 차용
  • 빈도수 대신 각 숫자는 비트형태로 전환하여 사용
  • 최악의 경우에도 logN 시간 안에 작업이 가능하다. (N은 숫자의 자리수)
  • ( a >> ( i - 1 ) ) % 2 == 0를 4부터 1까지 진행하여 그를 기반으로 탐색, 삽입, 삭제한다.

TRIE 구현

class Node { ​​​​Node *p, *l, *r; } Node BTR; void init(Node *R) { ​​​​R->p = R->l = R->r = NULL; }
int *Search (Node * R, unsigned a) { ​​​​Node *C = R; ​​​​for (int i = 4; i >= 1; i--) { ​​​​​​​​if (( a >> ( i - 1 ) ) % 2 == 0) { ​​​​​​​​​​​​if (C->l == NULL) break; ​​​​​​​​​​​​else C = C->l; ​​​​​​​​} ​​​​​​​​if (( a >> ( i - 1 ) ) % 2 == 1) { ​​​​​​​​​​​​if (C->r == NULL) break; ​​​​​​​​​​​​else C = C->r; ​​​​​​​​} ​​​​} ​​​​if (i == 0) return C; ​​​​else return NULL; }
int *Insert (Node * R, unsigned a) { ​​​​Node *C = R, N; ​​​​int cre = 0; ​​​​for (int i = 4; i >= 1; i--) { ​​​​​​​​if (( a >> ( i - 1 ) ) % 2 == 0) { ​​​​​​​​​​​​if (C->l == NULL) { ​​​​​​​​​​​​​​​​N = new Node; ​​​​​​​​​​​​​​​​N->p = C; ​​​​​​​​​​​​​​​​N->l = N->r = NULL; ​​​​​​​​​​​​​​​​C->l = N; ​​​​​​​​​​​​​​​​C = C->l; ​​​​​​​​​​​​​​​​cre = 1; ​​​​​​​​​​​​} ​​​​​​​​​​​​else C = C->l; ​​​​​​​​} ​​​​​​​​if (( a >> ( i - 1 ) ) % 2 == 1) { ​​​​​​​​​​​​if (C->r == NULL) { ​​​​​​​​​​​​​​​​N = new Node; ​​​​​​​​​​​​​​​​N->p = C; ​​​​​​​​​​​​​​​​N->l = N->r = NULL; ​​​​​​​​​​​​​​​​C->r = N; ​​​​​​​​​​​​​​​​C = C->r; ​​​​​​​​​​​​​​​​cre = 1; ​​​​​​​​​​​​} ​​​​​​​​​​​​else C = C->r; ​​​​​​​​} ​​​​} ​​​​if (cre) return C; ​​​​else return NULL; }
int Delete(Node * R, unsigned a) { ​​​​Node *C, *T; ​​​​C = Search(R, a); ​​​​if (C == NULL) return 0; ​​​​while (C->p ! = NULL) { ​​​​​​​​if (C->l == NULL && C->r == NULL) { ​​​​​​​​​​​​T = C; ​​​​​​​​​​​​C = C->p; ​​​​​​​​​​​​delete T; ​​​​​​​​} ​​​​​​​​else break; ​​​​} ​​​​return 1; }