Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> प्रोग्रामिंग

हफमैन कोडिंग


हफमैन कोडिंग एक लॉसलेस डेटा कम्प्रेशन एल्गोरिदम है। इस एल्गोरिदम में इनपुट के विभिन्न कैरेक्टर को एक वेरिएबल-लेंथ कोड असाइन किया जाता है। कोड की लंबाई इस बात से संबंधित होती है कि कैरेक्टर कितनी बार उपयोग किए जाते हैं। सबसे अधिक बार आने वाले कैरेक्टर के सबसे छोटे कोड होते हैं, और कम बार आने वाले कैरेक्टर के लंबे कोड होते हैं।

मुख्य रूप से दो भाग हैं। पहला हफमैन ट्री बनाना, और दूसरा कोड खोजने के लिए ट्री को ट्रैवर्स करना।

उदाहरण के लिए, कुछ स्ट्रिंग "YYYZXXYYX" पर विचार करें, कैरेक्टर Y की आवृत्ति X से अधिक है और कैरेक्टर Z की आवृत्ति सबसे कम है। इसलिए Y के लिए कोड की लंबाई X से छोटी है, और X का कोड Z से छोटा होगा।

  • प्रत्येक कैरेक्टर को उनकी आवृत्ति के अनुसार कोड असाइन करने की जटिलता O(n log n) है

इनपुट − विभिन्न कैरेक्टर वाली एक स्ट्रिंग, मान लें "ACCEBFFFFAAXXBLKE"
आउटपुट − विभिन्न कैरेक्टर के लिए कोड:

Data: K, Frequency: 1, Code: 0000
Data: L, Frequency: 1, Code: 0001
Data: E, Frequency: 2, Code: 001
Data: F, Frequency: 4, Code: 01
Data: B, Frequency: 2, Code: 100
Data: C, Frequency: 2, Code: 101
Data: X, Frequency: 2, Code: 110
Data: A, Frequency: 3, Code: 111

एल्गोरिदम

huffmanCoding(string)

इनपुट − विभिन्न कैरेक्टर वाली एक स्ट्रिंग।

आउटपुट − प्रत्येक व्यक्तिगत कैरेक्टर के लिए कोड।

Begin
    कैरेक्टर, फ्रीक्वेंसी, नोड के लेफ्ट और राइट चाइल्ड के साथ एक नोड परिभाषित करें हफमैन ट्री के लिए।
    'freq' नामक एक लिस्ट बनाएं प्रत्येक कैरेक्टर की फ्रीक्वेंसी संग्रहीत करने के लिए, प्रारंभ में सभी 0 हैं
    स्ट्रिंग में प्रत्येक कैरेक्टर c के लिए do
        freq लिस्ट में कैरेक्टर ch की फ्रीक्वेंसी बढ़ाएं।
    done
    सभी प्रकार के कैरेक्टर ch के लिए do
        यदि ch की फ्रीक्वेंसी नॉन-ज़ीरो है तो ch और उसकी फ्रीक्वेंसी को प्रायोरिटी क्यू Q के नोड के रूप में जोड़ें।
    done
    while Q खाली नहीं है do
        Q से आइटम हटाएं और नोड के लेफ्ट चाइल्ड को असाइन करें
        Q से आइटम हटाएं और नोड के राइट चाइल्ड को असाइन करें
        नोड को ट्रैवर्स करें असाइन किए गए कोड को खोजने के लिए
    done
End

traverseNode(n: node, code)

इनपुट − हफमैन ट्री का नोड n, और पिछले कॉल से असाइन किया गया कोड

आउटपुट − प्रत्येक कैरेक्टर के साथ असाइन किया गया कोड

if नोड n का लेफ्ट चाइल्ड ≠ φ then
    traverseNode(लेफ्टचाइल्ड(n), code+'0') //लेफ्ट चाइल्ड के माध्यम से ट्रैवर्स करें
    traverseNode(राइटचाइल्ड(n), code+'1') //राइट चाइल्ड के माध्यम से ट्रैवर्स करें
else
    वर्तमान नोड के कैरेक्टर और डेटा प्रदर्शित करें।

उदाहरण (C++)

#include 
#include 
#include 
using namespace std;
struct node{
    int freq;
    char data;
    const node *child0, *child1;
    node(char d, int f = -1){ //नोड में मान असाइन करें
        data = d;
        freq = f;
        child0 = NULL;
        child1 = NULL;
    }
    node(const node *c0, const node *c1){
        data = 0;
        freq = c0->freq + c1->freq;
        child0=c0;
        child1=c1;
    }
    bool operator<( const node &a ) const { //< ऑपरेटर क्यू में प्रायोरिटी खोजने के लिए
        return freq > a.freq;
    }
    void traverse(string code = "")const{
        if(child0!=NULL){
            child0->traverse(code+'0'); //लेफ्ट चाइल्ड के रूप में कोड के साथ 0 जोड़ें
            child1->traverse(code+'1'); //राइट चाइल्ड के रूप में कोड के साथ 1 जोड़ें
        }else{
            cout << "Data: " << data << ", Frequency: " << freq << ", Code: " << code << endl;
        }
    }
};
void huffmanCoding(string str){
    priority_queue qu;
    int frequency[256];
    for(int i = 0; i < 256; i++)
        frequency[i] = 0; //सभी फ्रीक्वेंसी क्लियर करें
    for(int i = 0; i < str.size(); i++){
        frequency[int(str[i])]++; //फ्रीक्वेंसी बढ़ाएं
    }
    for(int i = 0; i < 256; i++){
        if(frequency[i]){
            qu.push(node(i, frequency[i]));
        }
    }
    while(qu.size() > 1){
        node *c0 = new node(qu.top()); //लेफ्ट चाइल्ड प्राप्त करें और क्यू से हटाएं
        qu.pop();
        node *c1 = new node(qu.top()); //राइट चाइल्ड प्राप्त करें और क्यू से हटाएं
        qu.pop();
        qu.push(node(c0, c1)); //दो चाइल्ड की फ्रीक्वेंसी जोड़ें और फिर क्यू में जोड़ें
    }
    cout << "The Huffman Code: " << endl;
    qu.top().traverse(); //कोड प्राप्त करने के लिए ट्री ट्रैवर्स करें
}
int main(){
    string str = "ACCEBFFFFAAXXBLKE"; //फ्रीक्वेंसी प्राप्त करने के लिए मनमाना स्ट्रिंग
    huffmanCoding(str);
}

आउटपुट

The Huffman Code:
Data: K, Frequency: 1, Code: 0000
Data: L, Frequency: 1, Code: 0001
Data: E, Frequency: 2, Code: 001
Data: F, Frequency: 4, Code: 01
Data: B, Frequency: 2, Code: 100
Data: C, Frequency: 2, Code: 101
Data: X, Frequency: 2, Code: 110
Data: A, Frequency: 3, Code: 111
  1. चलते-फिरते कोडिंग के लिए iOS के 5 बेस्ट कोडिंग ऐप्स चलते-फिरते कोडिंग के लिए iOS के 5 बेस्ट कोडिंग ऐप्स

    जबकि अधिकांश डेवलपर्स अपने Mac पर Xcode और Sublime Text जैसे लोकप्रिय IDE का उपयोग करते हैं, कुछ को एहसास होता है कि उनके iPhone और iPad भी कोडिंग ऐप्स को संभाल सकते हैं। जबकि वे अपने डेस्कटॉप समकक्षों जितने शक्तिशाली नहीं हो सकते, निश्चित रूप से कुछ सक्षम मोबाइल IDE हैं जो आपके प्राथमिक डिवाइस के ल

  1. लॉकडाउन के दौरान अपने बच्चे को कोडिंग कैसे सिखाएं लॉकडाउन के दौरान अपने बच्चे को कोडिंग कैसे सिखाएं

    दिए गए विश्व अधिक तकनीकी रूप से उन्नत होता जा रहा है, अपने बच्चे को कोडिंग सिखाना उनकी शिक्षा का एक महत्वपूर्ण और आवश्यक तत्व है। यहां हम आपको दिखाते हैं कि लॉकडाउन के दौरान अपने बच्चे को कोडिंग कैसे सिखाएं। यहां दी गई सलाह आपके बच्चों के कोडिंग ज्ञान को बेहतर बनाने के लिए उतनी ही मान्य है, भले ही स

  1. MongoDB में कोड इंजेक्शन हमलों को रोकना: एक डेवलपर गाइड MongoDB में कोड इंजेक्शन हमलों को रोकना: एक डेवलपर गाइड

    मूल रूप से 5 मार्च, 2019 को प्रकाशित यदि आप एक एप्लिकेशन डेवलपर, डेटाबेस एडमिनिस्ट्रेटर (DBA), या किसी भी प्रकार के टेक्नोलॉजिस्ट हैं, तो कोड इंजेक्शन आपके रडार पर होना चाहिए। आपके पास एक सुरक्षित क्लाउड वातावरण है। आपके पास डेटाबेस एक्सेस लॉक्ड डाउन है। लेकिन आपके एप्लिकेशन कोड का क्या? हालांकि इस