[javascript] 허프만 트리 (Huffman Tree) 데이터 구조

허프만 트리는 데이터 압축에 매우 유용한 데이터 구조 중 하나입니다. 이 트리는 각 문자 또는 문자열의 빈도를 기반으로 생성됩니다. 허프만 트리는 주어진 문자 빈도에 따라 각 문자에 대한 고유한 이진 코드를 생성하여 데이터를 압축합니다.

허프만 트리 알고리즘

허프만 트리 알고리즘은 다음 단계로 구현됩니다:

  1. 주어진 문자열 내 각 문자의 빈도를 계산합니다.
  2. 모든 문자를 단일 노드로 하는 트리를 생성합니다.
  3. 가장 빈도가 적은 두 노드를 찾아 이를 자식 노드로 하는 새로운 노드를 생성합니다.
  4. 이 과정을 반복하여 단일 노드가 하나만 남을 때까지 트리를 확장합니다.

허프만 압축

허프만 트리를 사용하여 데이터를 압축하려면 다음 단계를 따릅니다:

  1. 문자열의 각 문자에 해당하는 이진 코드를 허프만 트리에서 찾습니다.
  2. 이진 코드를 사용하여 원래 데이터를 비트 스트림으로 변환합니다.

자바스크립트 예시

class Node {
  constructor(char, freq) {
    this.char = char;
    this.freq = freq;
    this.left = null;
    this.right = null;
  }
}

function buildHuffmanTree(str) {
  // 문자 빈도 계산
  const freqMap = {};
  for (let char of str) {
    freqMap[char] = (freqMap[char] || 0) + 1;
  }

  // 트리 노드 생성
  const nodes = Object.keys(freqMap).map(char => new Node(char, freqMap[char]));

  while (nodes.length > 1) {
    nodes.sort((a, b) => a.freq - b.freq);
    const left = nodes.shift();
    const right = nodes.shift();
    const merge = new Node(null, left.freq + right.freq);
    merge.left = left;
    merge.right = right;
    nodes.push(merge);
  }

  return nodes[0];
}

위의 코드는 주어진 문자열을 기반으로 허프만 트리를 구축하는 간단한 자바스크립트 예시입니다.

허프만 트리는 데이터 압축 뿐만 아니라 무손실 압축, 패턴 매칭, 코딩 이론 등 많은 분야에서 유용하게 활용될 수 있는 데이터 구조입니다.

자세한 내용은 Huffman coding을 참조할 수 있습니다.