亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        《數(shù)據(jù)結(jié)構(gòu)》課程中哈夫曼編碼教學(xué)案例研究

        2020-11-10 04:42:23王彩霞
        高教學(xué)刊 2020年31期
        關(guān)鍵詞:教學(xué)案例數(shù)據(jù)結(jié)構(gòu)

        王彩霞

        摘 ?要:哈夫曼編碼是《數(shù)據(jù)結(jié)構(gòu)》課程中二叉樹的一個重要應(yīng)用,也是該課程的重點(diǎn)和難點(diǎn)。文章對哈夫曼編碼的課堂教學(xué)進(jìn)行了介紹,在課程中,利用樹的二叉鏈表結(jié)構(gòu)及哈夫曼樹的特點(diǎn)設(shè)計出了另一種哈夫曼編碼方法,并給出算法設(shè)計方法及描述,同時與傳統(tǒng)編碼方法做比較分析。教學(xué)實(shí)踐表明,學(xué)生對哈夫曼編碼原理的理解及編碼程序設(shè)計方法的掌握得到了顯著提高。

        關(guān)鍵詞:教學(xué)案例;數(shù)據(jù)結(jié)構(gòu);哈夫曼編碼

        中圖分類號:G642 ? ? ? 文獻(xiàn)標(biāo)志碼:A ? ? ? ? 文章編號:2096-000X(2020)31-0104-03

        Abstract: Huffman coding is an important application of binary trees in the "Data Structure" course, and it is also the focus and difficulty of the course. This article introduces the classroom teaching of Huffman coding. In the course, another Huffman coding method is designed using the binary linked list structure of the tree and the characteristics of the Huffman tree, the algorithm design method and description are given, and at the same time, it is compared and analyzed with traditional coding methods. Teaching practice shows that students' understanding of Huffman coding principles and mastery of coding programming methods have been significantly improved.

        Keywords: teaching case; data structure; Huffman coding

        引言

        《數(shù)據(jù)結(jié)構(gòu)》[1]是一門典型的將理論轉(zhuǎn)換為實(shí)踐的計算機(jī)課程,在應(yīng)用數(shù)學(xué)專業(yè)的課程體系中起著非常重要作用。如果學(xué)生在學(xué)習(xí)理論知識的過程中,能夠持續(xù)運(yùn)用不同的已學(xué)知識解決相同的問題[2],舉一反三,改造創(chuàng)新,那么理論和實(shí)踐能力都能得到發(fā)展提高。在文中,筆者利用已學(xué)的一維數(shù)組及樹的二叉鏈表結(jié)構(gòu),在傳統(tǒng)哈夫曼編碼方法基礎(chǔ)上,給出了另一種哈夫曼樹編碼方法。教學(xué)結(jié)果顯示,學(xué)生學(xué)習(xí)效率得到了大大提高,同時還激發(fā)了學(xué)生的上機(jī)編程熱情。

        一、數(shù)據(jù)結(jié)構(gòu)設(shè)計

        哈夫曼樹采用二叉鏈表結(jié)構(gòu),每個結(jié)點(diǎn)包含指向左右孩子結(jié)點(diǎn)的指針,還包括用于存放該結(jié)點(diǎn)所在分支編碼的域。n個葉子結(jié)點(diǎn)存放在一維數(shù)組中,每個數(shù)組元素包括兩個域,一個存放葉子結(jié)點(diǎn)權(quán)值,一個是指向哈夫曼樹葉子結(jié)點(diǎn)的指針。定義如下:

        typedef struct Node{//哈夫曼樹結(jié)點(diǎn)結(jié)構(gòu)

        char bit[MB];// MB為哈夫曼編碼串最大長度

        struct Node *lchild,*rchild;

        } HuffmanTreeNode;

        typedef struct{

        int ?weight;

        struct Node ?*Leaf;

        } TreeLeaf;

        TreeLeaf ?LeafNode[n];//葉子結(jié)點(diǎn)數(shù)組

        二、哈夫曼樹的構(gòu)造設(shè)計

        構(gòu)造哈夫曼樹前,先對n個葉子結(jié)點(diǎn)權(quán)值按升序排序,構(gòu)造二叉樹時避免多次循環(huán)查找最小和次小權(quán)值,只需從前往后依次取權(quán)值即可。

        (一)算法思想

        定義TreeLeaf結(jié)構(gòu)的輔助數(shù)組NLNode[n-1],構(gòu)造哈夫曼樹時生成的中間結(jié)點(diǎn),按照生成的先后順序依次加入到數(shù)組NLNode[n-1]中,則數(shù)組中的中間結(jié)點(diǎn)權(quán)值肯定是從小到大有序的。數(shù)組中Leaf域存放新生成的二叉樹的根結(jié)點(diǎn)地址。用K統(tǒng)計數(shù)組NLNode[n-1]中插入結(jié)點(diǎn)的個數(shù)。算法描述如下:

        1. 初始化數(shù)組NLNode,weight域置為MAX(MAX大于n個葉子結(jié)點(diǎn)權(quán)值之和),Leaf置為NULL。

        2. 根據(jù)數(shù)組LeafNode中的n個權(quán)值,生成n棵只有葉子結(jié)點(diǎn)的二叉樹,每個結(jié)點(diǎn)的bit域置“0”,二叉樹根結(jié)點(diǎn)地址存放在與其權(quán)值相對應(yīng)的Leaf域。

        3. 置i=0,j=0,K=0,做以下操作:

        (1)LeafNode[i].weight與NLNode[j].weight中取較小者賦給s1,Leaf域值賦給p1,并將其對應(yīng)的數(shù)組下標(biāo)增1。

        (2)LeafNode[i].weight與NLNode[j]. weight中取較小者賦給s2,Leaf域值賦給p2,并將其對應(yīng)的數(shù)組下標(biāo)增1,p2所指結(jié)點(diǎn)的bit域置“1”。

        (3)以p1,p2所指結(jié)點(diǎn)為左右子樹構(gòu)造一棵新的二叉樹,根結(jié)點(diǎn)的權(quán)值為s1+s2,bit域置“0”。將新生成的二叉樹根結(jié)點(diǎn)加入到數(shù)組NLNode中,K增1。

        (4)當(dāng)K

        4. 當(dāng)數(shù)組NLNode滿時,哈夫曼樹構(gòu)造結(jié)束。

        例如排好序的權(quán)值集W={2,3,4,4,6},構(gòu)造哈夫曼樹過程如圖1所示,根結(jié)點(diǎn)bit域值為“#”,不參與編碼。

        (a)

        (b)

        (c)

        (d)

        (e)

        圖1 哈夫曼樹構(gòu)造過程

        (二)算法C語言[3]實(shí)現(xiàn)

        void huffmantree(TreeLeaf *LeafNode,TreeLeaf *NLNode) {

        HuffmanTreeNode *p;

        int i;

        for(i=0;i

        NLNode[i].weight=MAX;

        NLNode[i].Leaf=NULL;

        }

        for(i=0;i

        p=(HuffmanTreeNode*)malloc(sizeof(Huffm

        anTreeNode));

        if(!p) return;

        p->weight=LeafNode[i].weight;

        strcpy(p->bit,"0");

        p->lchild=p->rchild=NULL;

        LeafNode[i].Leaf=p;

        }

        int j=0,K=0,s1,s2;//s1,s2存放最小和次小權(quán)值

        HuffmanTreeNode *p1,*p2;

        i=0;

        while(K

        if(i

        s1=LeafNode[i].weight;

        p1=LeafNode[i].Leaf;

        i++;

        }

        else{

        s1=NLNode[j].weight;

        p1=NLNode[j].Leaf;

        j++;

        }

        if(i

        s2=LeafNode[i].weight;

        p2=LeafNode[i].Leaf;

        i++;

        }

        else{

        s2=NLNode[j].weight;

        p2=NLNode[j].Leaf;

        j++;

        }

        strcpy(p2->bit,"1");

        p=(HuffmanTreeNode *)malloc(sizeof(Huf

        fmanTreeNode));

        p->weight=NLNode[k].weight=s1+s2;

        strcpy(p->bit,"0");

        p->lchild=p1;

        p->rchild=p2;

        NLNode[k].Leaf=p;K++;

        }

        K--; strcpy(NLNode[K].Leaf->bit,"#");//樹的根結(jié)點(diǎn)不參與編碼

        return;

        }

        三、哈夫曼編碼設(shè)計

        (一)算法思想

        在數(shù)組NLNode中從后往前依次取除根結(jié)點(diǎn)外的所有中間結(jié)點(diǎn)的地址,對哈夫曼樹從第二層起向下掃描各中間結(jié)點(diǎn),求出葉子結(jié)點(diǎn)的哈夫曼編碼。算法敘述如下:

        1. 置j=n-3,取p= NLNode[j].Leaf。

        2. 將p所指結(jié)點(diǎn)的bit域值加到p所指結(jié)點(diǎn)的左孩子及右孩子bit域值的前面,j減1。

        3. 重復(fù)2.直到數(shù)組NLNode中所有中間結(jié)點(diǎn)執(zhí)行完為止。

        4. 各葉子結(jié)點(diǎn)的bit域符號串值就是其哈夫曼編碼。

        編碼過程如圖2所示。(a)中p首先指向權(quán)值為11的結(jié)點(diǎn),將其bit域值“1”加到權(quán)值為5、6的結(jié)點(diǎn)bit域值的前面,則權(quán)值為5的結(jié)點(diǎn)的bit域值就是“10”,權(quán)值為6的結(jié)點(diǎn)的bit域值就是“11”;(b)(c)依次類推。最后得到各個葉子結(jié)點(diǎn)的權(quán)值。

        (二)算法C語言實(shí)現(xiàn)

        void huffmancode(TreeLeaf *LeafNode,TreeLeaf *NLNode) {

        int i,j;

        char *cd=(char*)malloc(MB *sizeof(char));

        HuffmanTreeNode *p;

        for(j=n-3;j>-1;j--)

        { ?p=NLNode[j].Leaf;

        strcpy(cd,p->bit);

        strcat(cd,p->lchild->bit);

        strcpy(p->lchild->bit,cd);

        strcpy(cd,p->bit);

        strcat(cd,p->rchild->bit);

        strcpy(p->rchild->bit,cd);

        }

        printf("\n各權(quán)值的哈夫曼編碼:\n");

        for(i=0;i

        p=LeafNode[i].Leaf;

        printf("%d: ?%s\n",p->weight,p->bit);

        }

        free(cd);

        return;

        }

        四、結(jié)束語

        《數(shù)據(jù)結(jié)構(gòu)》課程中,傳統(tǒng)的哈夫曼編碼方法是在結(jié)構(gòu)體數(shù)組上構(gòu)造哈夫曼樹,編碼時從葉子結(jié)點(diǎn)向上到根結(jié)點(diǎn)逆向掃描2n-1個結(jié)點(diǎn),時間復(fù)雜度為O(n2)。在本教學(xué)過程中,在傳統(tǒng)編碼方法基礎(chǔ)上提出了另一種實(shí)現(xiàn)哈夫曼編碼的方法,哈夫曼樹采用二叉鏈表結(jié)構(gòu),求編碼時從哈夫曼樹第二層向下到葉子結(jié)點(diǎn)掃描,時間復(fù)雜度為O(n)。編碼算法設(shè)計巧妙新穎,結(jié)構(gòu)清晰簡潔,這不但能拓展學(xué)生的算法設(shè)計思維,而且能提高學(xué)生的程序開發(fā)能力,在《數(shù)據(jù)結(jié)構(gòu)》課程教學(xué)中有一定的參考價值。

        參考文獻(xiàn):

        [1]嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].清華大學(xué)出版社,2011.

        [2]鮑愛華,陳衛(wèi)衛(wèi),等.基于“一題多解”的數(shù)據(jù)結(jié)構(gòu)實(shí)踐教學(xué)模式[J].計算機(jī)教育,2018(2):119-123.

        [3]黃容,趙毅.C語言程序設(shè)計[M].清華大學(xué)出版社,2012.

        猜你喜歡
        教學(xué)案例數(shù)據(jù)結(jié)構(gòu)
        數(shù)據(jù)結(jié)構(gòu)線上線下混合教學(xué)模式探討
        數(shù)據(jù)結(jié)構(gòu)課程教學(xué)網(wǎng)站的設(shè)計與實(shí)現(xiàn)
        電子測試(2018年15期)2018-09-26 06:01:42
        教學(xué)案例的內(nèi)涵及其應(yīng)用意義
        充分整合教材資源 優(yōu)化歷史課堂教學(xué)
        小學(xué)數(shù)學(xué)課堂導(dǎo)入技巧及案例分析
        考試周刊(2016年88期)2016-11-24 13:49:44
        反轉(zhuǎn)課堂模式與數(shù)學(xué)教學(xué)案例
        促進(jìn)初中化學(xué)定量觀建構(gòu)的教學(xué)案例
        小學(xué)數(shù)學(xué)“反思型” 教學(xué)的探索與實(shí)踐
        考試周刊(2016年76期)2016-10-09 09:08:16
        “翻轉(zhuǎn)課堂”教學(xué)模式的探討——以《數(shù)據(jù)結(jié)構(gòu)》課程教學(xué)為例
        高職高專數(shù)據(jù)結(jié)構(gòu)教學(xué)改革探討
        中國市場(2016年45期)2016-05-17 05:15:48
        国产精品爆乳在线播放| 日本顶级metart裸体全部| 丁香六月久久婷婷开心| 色综合久久久久久久久五月| 国产精品美女一级在线观看| 中文字幕午夜精品一区二区三区 | 国产精品高潮呻吟av久久4虎| 亚洲欧洲久久久精品| 国产亚洲精品综合一区二区| 久久成人国产精品一区二区| a级国产乱理伦片在线播放| 激情人妻在线视频| 亚洲av熟女天堂久久天堂| 国产 精品 自在 线免费| 99精产国品一二三产品香蕉| 亚洲综合网站精品一区二区| 少妇熟女天堂网av天堂| 精品国产乱码久久久久久郑州公司| 婷婷五月综合缴情在线视频| 成年视频网站在线观看777| 日韩女优图播一区二区| 无码精品人妻一区二区三区av| 真正免费一级毛片在线播放| 日本一区二区三深夜不卡| 丝袜美腿在线观看一区| 性色av一区二区三区| 国产成人久久蜜一区二区| 一本色道久久88加勒比—综合| 亚洲av无码乱码国产精品久久| 日韩精品一区二区三区视频| 色婷婷激情在线一区二区三区| 亚洲国产一区二区三区| 黑人巨大无码中文字幕无码| 国产日韩精品一区二区在线观看播放| 最新日本女优中文字幕视频| 西西午夜无码大胆啪啪国模| 国产成人av一区二区三区无码| 国产亚洲午夜高清国产拍精品不卡| 中文字幕一区二区人妻秘书| 国产精品美女久久久久| 久久久www成人免费无遮挡大片|