압축 알고리즘(Compression Algorithm)

데이터 압축의 원리

임베디드 친구 2025. 3. 4. 14:10
728x90
반응형

데이터 압축의 원리

데이터 압축(data compression)은 정보를 더 작은 크기로 변환하여 저장 공간을 절약하고 전송 속도를 높이는 기법입니다. 압축은 정보의 중복성을 줄이거나 특정 패턴을 활용하여 데이터를 효율적으로 표현하는 방식으로 이루어집니다. 본 글에서는 데이터 압축의 원리를 설명하고, 대표적인 압축 기법의 개념과 구현 방법을 소개합니다.

1. 데이터 압축의 개념

데이터 압축은 크게 무손실 압축(lossless compression)손실 압축(lossy compression)으로 나뉩니다.

  • 무손실 압축: 원본 데이터의 정보가 완전히 보존되며, 압축된 데이터를 원본 그대로 복원할 수 있습니다. 예: ZIP, PNG, FLAC
  • 손실 압축: 일부 데이터를 제거하여 파일 크기를 줄이며, 복원된 데이터는 원본과 완전히 동일하지 않을 수 있습니다. 예: MP3, JPEG, MP4

압축 기법의 기본 원리는 중복 제거효율적 표현입니다. 동일한 데이터를 반복적으로 표현하지 않고, 더 작은 공간을 사용하여 원래 데이터를 나타내는 방식이 활용됩니다.

2. 무손실 압축 알고리즘의 원리

2.1 런-렝스 인코딩(Run-Length Encoding, RLE)

런-렝스 인코딩(RLE)은 연속적으로 반복되는 데이터를 압축하는 방식입니다. 같은 문자가 반복되면 (문자, 반복 횟수) 형태로 저장합니다.

예제

원본 데이터:

AAAABBBCCDAA

압축된 데이터:

A4B3C2D1A2

C 언어 구현

#include <stdio.h>
#include <string.h>

void run_length_encoding(const char *input) {
    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        int count = 1;
        while (i < len - 1 && input[i] == input[i + 1]) {
            count++;
            i++;
        }
        printf("%c%d", input[i], count);
    }
    printf("\n");
}

int main() {
    char input[] = "AAAABBBCCDAA";
    run_length_encoding(input);
    return 0;
}

2.2 허프만 코딩(Huffman Coding)

허프만 코딩은 가변 길이의 비트 문자열을 사용하여 빈도가 높은 문자는 짧은 코드로, 빈도가 낮은 문자는 긴 코드로 표현하는 방식입니다. 이를 통해 평균 비트 수를 줄일 수 있습니다.

Java 구현 예제

import java.util.*;

class HuffmanNode {
    char data;
    int frequency;
    HuffmanNode left, right;
}

class HuffmanComparator implements Comparator<HuffmanNode> {
    public int compare(HuffmanNode x, HuffmanNode y) {
        return x.frequency - y.frequency;
    }
}

public class HuffmanCoding {
    public static void printCodes(HuffmanNode root, String code) {
        if (root.left == null && root.right == null) {
            System.out.println(root.data + ": " + code);
            return;
        }
        printCodes(root.left, code + "0");
        printCodes(root.right, code + "1");
    }

    public static void main(String[] args) {
        char[] charArray = { 'A', 'B', 'C', 'D', 'E' };
        int[] charFreq = { 5, 9, 12, 13, 16 };

        PriorityQueue<HuffmanNode> queue = new PriorityQueue<>(new HuffmanComparator());
        for (int i = 0; i < charArray.length; i++) {
            HuffmanNode node = new HuffmanNode();
            node.data = charArray[i];
            node.frequency = charFreq[i];
            queue.add(node);
        }

        while (queue.size() > 1) {
            HuffmanNode left = queue.poll();
            HuffmanNode right = queue.poll();
            HuffmanNode parent = new HuffmanNode();
            parent.frequency = left.frequency + right.frequency;
            parent.left = left;
            parent.right = right;
            queue.add(parent);
        }

        HuffmanNode root = queue.poll();
        printCodes(root, "");
    }
}

3. 손실 압축 알고리즘의 원리

3.1 양자화(Quantization)

손실 압축의 핵심 개념은 데이터의 일부를 제거하여 크기를 줄이는 것입니다. 양자화(quantization)는 유사한 값을 하나로 묶어 표현하는 방식입니다. 예를 들어, 이미지 압축에서는 색상 값을 근사화하여 저장합니다.

3.2 이산 코사인 변환(Discrete Cosine Transform, DCT)

JPEG 압축에서 사용되는 DCT는 이미지 데이터를 주파수 성분으로 변환한 후, 중요도가 낮은 성분을 제거하는 방식입니다. 이를 통해 사람이 인식하기 어려운 정보를 줄이고 파일 크기를 감소시킵니다.

4. 결론

데이터 압축은 저장 공간 절약과 전송 속도 향상에 중요한 역할을 합니다. 무손실 압축은 원본 데이터를 보존하는 방식으로, 텍스트 파일이나 실행 파일에 적합합니다. 반면 손실 압축은 일부 데이터를 제거하여 파일 크기를 더욱 줄일 수 있으며, 멀티미디어 데이터에 주로 사용됩니다.

다양한 압축 기법을 이해하고 적절한 방식으로 활용하면 데이터 처리 및 저장 효율을 크게 향상시킬 수 있습니다

반응형