亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hafuman.txt

?? 利用哈夫曼編碼進行住處通訊可以大大提高信道利用率,縮短住處傳輸時間,降低成本,但是,這要求在發送端通過一個編碼系統將傳輸的數據預先編碼,在接收端通過一個譯碼系統對傳來的數據進行譯碼(復原),對于雙向傳
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
哈夫曼編碼/譯碼
點擊數:2601    發布日期:2006-12-4 0:37:00  
【收藏】 【評論】 【打印】 【編程愛好者論壇】 【關閉】


 
                                   哈夫曼編碼/譯碼

一、【實驗內容】
【問題描述】
      利用哈夫曼編碼進行住處通訊可以大大提高信道利用率,縮短住處傳輸時間,降低成本,但是,這要求在發送端通過一個編碼系統將傳輸的數據預先編碼,在接收端通過一個譯碼系統對傳來的數據進行譯碼(復原),對于雙向傳輸信息的信道,每端都一個完整的編碼譯碼系統,試為這樣的住處收發站寫一個哈夫曼友的編碼譯碼系統.

【基本要求】:一個完整的系統應以下功能:
(1) I. 初始化(Initialization)。從終端讀入字符集大小n,以及n個字符和n個權值,建立哈夫曼樹,并將它存放在文件hfmTree中.
(2) E. 編碼(Encoding)。利用已建立好的哈夫曼樹(如不在內存,則從文件hfmTree中讀入),對文件ToBeTran中的正文進行編碼,然后將結果代碼存(傳輸)到文件CodeFile中.
(3) D. 譯碼(Decoding)。利用已建好的哈夫曼樹,對傳輸到達的CodeFile中的數據代碼進行譯碼,將譯碼結果存入文件TextFile中. 
(4) P. 印文件代碼(Print)。將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件CodePrin中。 
(5) T. 印哈夫曼樹(TreePrinting)。將已在內存中的哈夫曼樹以直觀的方式(樹或凹入表的形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件TreePrint中。
      
測試數據:
(1) 利用教科書例6-2中的數據調試程序。
(2) 用下表給出的字符集和頻度的計數據建立哈曼樹,并實現以下報文的編碼和譯碼:“THIS PROGRAM IS MY FAVORITE”.。
字符       A   B    C    D    E    F    G    H    I    J    K    L    M
頻數 186  64   13   22   32   103  21   15   47   57   1    5    32   20
字符 N    O    P    Q    R    S    T    U    V    W    X    Y    Z
頻數 57   63   15   1    48   51   80   23   8    18   1    16   1 


二、實驗目的
樹型結構是一種應用極為廣泛的非線性數據結構,也是本課程的重點內容,哈夫曼樹(最優二叉樹)是樹型結構的典型應用,本次實驗突出了數據結構加操作的程序設計觀點,希望能根據樹型結構的非線性特點,熟悉各種存儲結構的特性,達到如何應用樹型結構的非線性特點,熟悉各種存儲結構的特性,達到如何應用樹型結構解決具體問題的目的.

 

 


三、實驗文檔:
                  哈夫曼編碼/譯碼
一、 需求分析
1、 利用哈夫曼編碼進行信息通信可以大大提高信道利用率,縮短信息傳輸時
間,降低傳輸成本。但是,這要求在發送端通過一個編碼系統對待傳數據預先編碼,在接收端將傳來的數據進行譯碼(復原)。對于雙工信道(既可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統。本次設計就是為這樣的信息收發站寫的一個哈夫曼的編/譯碼器。
本實驗要求:
2、本演示程序中,用戶可以輸入鍵盤中的任意字符,長度為任意長,字符輸入順序不限,且允許出現重碼
3、演示程序以用戶與計算機的對話方式執行,即在計算機終端上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中規定的運算命令,相應的輸入數據(可慮去輸入中的非法字符)和運算結果顯示在其后。
4、本演示程序中,當用戶選擇的功能錯誤時,系統會輸出相應的提示。
5、在本系統中,用戶可以對任意長的字符串可進行編碼/譯碼。
6、程序執行的命令包括:
 1) 初始化(I)   2) 編碼(E)    3) 譯碼(D) 
4) 印代碼文件(P) 5) 印哈夫曼樹(T) 6) 退出(Q)
7、測試數據:
  (1)利用教科書例6-2中的數據調試程序。
(2)用下表給出的字符集和頻度的計數據建立哈曼樹,并實現以下報文的
   編碼和譯碼:“THIS PROGRAM IS MY FAVORITE”.。
字符     A   B   C   D   E   F   G   H   I   J   K   L   M
頻數 186  64    13    22    32   103    21   15   47    57    1    5     32    20
字符 N  O   P   Q   R    S    T   U    V   W   X    Y   Z
頻數 57   63    15    1    48     51     80    23     8      18    1      16    1 

二、概要設計
為實現上述程序功能,應以指針存儲結點。為此,需要定義一個抽象數據類型。
1. 抽象數據類型定義為:
ADT HuffmanTree{
數據對象:D={ai| ai∈CharSet,i=1,2,……,n,  n≥0}
數據關系:R={< ai-1, ai > ai-1, ai∈D, ai-1<ai ,i=2,3,……,n}
基本操作P:
HuffmanTree();       構造函數
~ HuffmanTree();     析構函數
Initialization(int WeightNum);
操作結果:構造哈夫曼樹。
Encoder()
初始條件:哈夫曼樹已存在或者哈夫曼樹已存到文件中。
操作結果:對字符串進行編碼
Decoder();
初始條件:哈夫曼樹已存在且已編碼。
操作結果:對二進制串進行譯碼
Print()
初始條件:編碼文件已存在。
操作結果:把已保存好的編碼文件顯示在屏幕
TreePrinting()
初始條件:哈夫曼樹已存在。
操作結果:將已在內存中的哈夫曼樹以直觀的方式顯示在終端上
2.本程序包含三個模塊:
1)主程序模塊:
void main(){
    初始化;
do{
   接受命令;
   處理命令;
}while(“命令”=”退出”)
}
2)、建樹模塊——實現定義的抽象數據類型
3)、編/譯碼模塊——實現字符串的編/譯碼
各模塊之間的調用關系如下:
                    主程序模塊
                     
                     
                      建樹模塊                  

                     
                     
編/譯碼模塊
三、詳細設計
程序代碼如下
//        程序名:HuffmanTree.h
//      程序功能:哈夫曼樹類的頭文件(并用其來實現編/譯碼)
//          作者:劉偉高
//          日期:2006.11.27
//          版本:1.0


//對應類實現文件: HuffmanTree.cpp
//對應主程序文件: main.cpp

 

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct HuffmanNode        //定義哈夫曼樹各結點
{
 int weight;        //存放結點的權值,假設只考慮處理權值為整數的情況
 int parent;        //記錄結點父親位置,-1表示為根結點,否則表示為非根結點
 int lchild,rchild;   //分別存放該結點的左、右孩子的所在單元的編號
};
class HuffmanTree     //建立哈夫曼樹類
{
private:
 HuffmanNode *Node;      //哈夫曼樹中結點的存儲結構
 char *Info;           //用來保存各字符信息
 int LeafNum;          //樹中的葉子結點總數
public:
 HuffmanTree();     //構造函數
 ~HuffmanTree();    //析構函數
 void Initialization(int WeightNum);   //初始化函數:根據WeightNum個權值建立一棵哈夫曼樹
 void Encoder();           //編碼函數:利用構造好的哈夫曼樹對字符進行編碼
 void Decoder();          //譯碼函數:對二進制串進行譯碼
 void Print();            //印文件函數:把已保存好的編碼文件顯示在屏幕
 void TreePrinting();     //印哈夫曼樹函數:將已在內存中的哈夫曼樹以直觀的方式顯示在終端上
};


//        程序名:HuffmanTree.cpp
//      程序功能:實現哈夫曼樹類的源文件(并用其來實現編/譯碼)
//          作者:劉偉高
//          日期:2006.11.27
//          版本:1.0


#include"HuffmanTree.h"
#include<string>
using namespace std;

//////////////////////////////////////////////////////////////////////////////
//  構造函數
//  函數功能:將結點指針初始化為NULL
//  函數參數:無
//  參數返回值:無
HuffmanTree::HuffmanTree()
{
 Node=NULL;          //將樹結點初始化為空 
 Info=NULL;          //將字符數組初始化為空
 LeafNum=0;          //將葉子數初始化為0
}
//////////////////////////////////////////////////////////////////////////////
// 析構函數
// 函數功能:將所有結點的空間釋放
// 函數參數:無
// 參數返回值:無
HuffmanTree::~HuffmanTree()
{
 delete[] Node;         //釋放結點空間
 delete[] Info;         //釋放字符存儲空間
}
//////////////////////////////////////////////////////////////////////////////
//  初始化函數
//  函數功能:從終端讀入字符集大小n,以及n個字符和n個權值,
//            建立哈夫曼樹,并將它存放在文件hfmTree中.
//  函數參數:int WeightNum表示代碼個數
//  參數返回值:無 
void HuffmanTree::Initialization(int WeightNum)        //初始化
{
 int i,j,pos1,pos2,max1,max2;     //
 
 Node=new HuffmanNode[2*WeightNum-1];  //WeightNum權值對應的哈夫曼樹中的結點總數為2*WeightNum-1個
 Info=new char[2*WeightNum-1];
 for(i=0;i<WeightNum;i++)
 {
  cout<<"請輸入第"<<i+1<<"個字符值";
  getchar();           //丟棄字符'\t'與'\n'
  Info[i]=getchar();   //輸入一個字符,主要是考慮輸入空格而采用這種形式的
  getchar();
  cout<<"請輸入該字符的權值或頻度";
  cin>>Node[i].weight;       //輸入權值
  Node[i].parent=-1;      //為根結點
  Node[i].lchild=-1;      //無左孩子
  Node[i].rchild=-1;      //無右孩子
 }
 
 for(i=WeightNum;i<2*WeightNum-1;i++) //表示需做WeightNum-1次合并
 {
  pos1=-1;
  pos2=-1;          //分別用來存放當前最小值和次小值的所在單元編號 
  max1=32767;      //32767為整型數的最大值 
  max2=32767;      //分別用來存放當前找到的最小值和次小值  

  for(j=0;j<i;j++)      //在跟節點中選出權值最小的兩個
   if(Node[j].parent==-1)         //是否為根結點
    if(Node[j].weight<max1)     //是否比最小值要小
    { 
     max2=max1;            //原最小值變為次小值
     max1=Node[j].weight;      //存放最小值
     pos2=pos1;            //修改次小值所在單元編號
     pos1=j;               //修改最小值所在單元編號
    }
    else
     if(Node[j].weight<max2)     //比原最小值大但比原次小值要小
     {
      max2=Node[j].weight;     //存放次小值
      pos2=j;                  //修改次小值所在的單元編號
     }
    //for
  Node[pos1].parent=i;       //修改父親位置
  Node[pos2].parent=i;
  Node[i].lchild=pos1;       //修改兒子位置
  Node[i].rchild=pos2;
  Node[i].parent=-1;             //表示新結點應該是根結點
  Node[i].weight=Node[pos1].weight+Node[pos2].weight;
 } //for
 LeafNum=WeightNum;
 
 
 char ch;
 cout<<"是否要替換原來文件(Y/N):";
 cin>>ch;
 if(ch=='y'||ch=='Y')
 {
 ofstream fop;   //以二進制方式打開hfmTree.dat文件,并當重新運行時覆蓋原文件
 fop.open("hfmTree.dat",ios::out|ios::binary|ios::trunc);
 if(fop.fail())                     //文件打開失敗
  cout<<"文件打開失敗!\n";
 fop.write((char*)&WeightNum,sizeof(WeightNum));  //寫入WeightNum
 for(i=0;i<WeightNum;i++)         //把各字符信息寫入文件
 {
  fop.write((char*)&Info[i],sizeof(Info[i]));
  flush(cout);
 }
 for(i=0;i<2*WeightNum-1;i++)        //把個節點內容寫入文件
 {
  fop.write((char*)&Node[i],sizeof(Node[i]));
  flush(cout);
 }
 fop.close();            //關閉文件
 }
 cout<<"哈夫曼樹已構造完成。\n";
}//Initialization

//////////////////////////////////////////////////////////////////////////////
//  編碼函數
//  函數功能:利用已建立好的哈夫曼樹(如不在內存,則從文件hfmTree中讀入),
//            對文件ToBeTran中的正文進行編碼,然后將結果代碼存(傳輸)到文件CodeFile中.
//  函數參數:無
//  參數返回值:無
void HuffmanTree::Encoder()
{
 if(Node==NULL)       //哈夫曼樹不在內存,從文件hfmTree中讀入
 {
  ifstream fip;        //以二進制方式打開hfmTree.dat文件
  fip.open("hfmTree.dat",ios::binary|ios::in);
  if(fip.fail())       //文件打開失敗
  {
   cout<<"文件打開失敗!\n";
   return;          //結束本函數
  }
  fip.read((char*)&LeafNum,sizeof(LeafNum));  //讀取葉子數
  Info=new char[LeafNum]; 
  Node=new HuffmanNode[2*LeafNum-1];
  for(int i=0;i<LeafNum;i++)              //讀取字符信息
   fip.read((char*)&Info[i],sizeof(Info[i]));
  for(i=0;i<2*LeafNum-1;i++)              //讀取結點信息
   fip.read((char*)&Node[i],sizeof(Node[i]));
 }
 
 char *Tree;          //用于存儲需編碼內容
 int i=0,num;
 char Choose;         //讓用戶選擇讀取文件或重新輸入需編碼內容
 cout<<"你要從文件中讀取內容(1),還是重新輸入(2):";
 cin>>Choose;
 if(Choose=='1')          //讀取文件ToBeTran.txt
 {
  ifstream fip1("ToBeTran.txt");
  if(fip1.fail())      //文件不存在
  {
   cout<<"文件打開失敗!\n";
   return;          //結束本函數
  }
  char ch;
  int k=0;
  while(fip1.get(ch))            
  {
   k++;                     //計算CodeFile中代碼長度
  } 
  fip1.close();  
 
  Tree=new char[k+1];
  ifstream fip2("ToBeTran.txt");

  k=0; 
  while(fip2.get(ch))
  {
   Tree[k]=ch;           //讀取文件內容,并存到Tree中

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂蜜桃一区二区三区 | 色婷婷精品大在线视频| 99精品视频一区二区三区| 91精彩视频在线观看| 日韩一级在线观看| 国产精品家庭影院| 日韩成人一级大片| 成人国产电影网| 在线观看亚洲专区| 久久久综合网站| 亚洲福中文字幕伊人影院| 国产中文字幕一区| 在线观看区一区二| 国产天堂亚洲国产碰碰| 婷婷六月综合亚洲| 91麻豆文化传媒在线观看| 日韩精品自拍偷拍| 亚洲图片自拍偷拍| 成人av电影在线| 精品裸体舞一区二区三区| 一区二区三区在线视频免费观看| 亚洲国产一区在线观看| 成人av在线资源网站| 日韩一级免费观看| 亚洲电影激情视频网站| 不卡一区在线观看| 国产亚洲制服色| 亚洲自拍偷拍图区| 波多野结衣中文字幕一区| 26uuu亚洲综合色| 日韩精品1区2区3区| 在线亚洲一区二区| 中文字幕av资源一区| 日韩电影免费一区| 777久久久精品| 图片区小说区区亚洲影院| 日本高清不卡一区| 亚洲欧美视频在线观看| 美女国产一区二区| 欧美一级一级性生活免费录像| 亚洲自拍偷拍麻豆| 欧美在线一二三四区| 亚洲欧美日韩国产成人精品影院| 国产v日产∨综合v精品视频| 久久综合色之久久综合| 毛片一区二区三区| 日韩精品中午字幕| 国产在线精品一区二区三区不卡| 欧美日韩午夜精品| 亚洲高清免费在线| 555夜色666亚洲国产免| 亚洲va天堂va国产va久| 精品视频一区二区三区免费| 亚洲激情网站免费观看| 色综合久久久久综合体桃花网| 亚洲丝袜另类动漫二区| 色综合激情五月| 天堂久久久久va久久久久| 欧美久久久久免费| 精品一区二区三区在线视频| 91精品国产综合久久小美女| 日本不卡一二三| 久久久久国产精品麻豆ai换脸| 国产精品自在欧美一区| 欧美国产一区视频在线观看| 成人看片黄a免费看在线| 亚洲视频一区在线观看| 欧美亚洲日本一区| 日韩黄色小视频| 欧美人与z0zoxxxx视频| 一区二区三区四区在线播放| 欧美天堂亚洲电影院在线播放| 日韩高清不卡一区| 欧美美女bb生活片| 国产酒店精品激情| 亚洲美女一区二区三区| 欧美老肥妇做.爰bbww| 激情文学综合丁香| 亚洲欧洲日产国产综合网| 欧美无乱码久久久免费午夜一区| 久久成人免费网| 亚洲国产成人午夜在线一区| 97久久精品人人澡人人爽| 午夜精品久久久| 国产情人综合久久777777| 在线观看国产一区二区| 精品在线播放午夜| 国产精品免费丝袜| 欧美久久久久久久久久| 国产不卡视频在线观看| 亚洲午夜激情网页| 中文字幕二三区不卡| 欧美久久久久久蜜桃| 不卡视频一二三| 久久99国产精品尤物| 亚洲精品一二三区| 国产三区在线成人av| 欧美另类高清zo欧美| 99久久久久久| 国产一区二区三区观看| 亚洲大片精品永久免费| 国产欧美一区二区精品性色| 91碰在线视频| 韩国精品一区二区| 午夜伦理一区二区| 亚洲欧美日本韩国| 国产欧美精品一区二区三区四区| 欧美丰满美乳xxx高潮www| av综合在线播放| 国产一区二区剧情av在线| 视频在线观看一区| 亚洲永久精品国产| 中文字幕亚洲在| 中文成人av在线| 久久久久久免费网| 5月丁香婷婷综合| 欧美日韩电影一区| 在线观看91视频| 一本一道久久a久久精品| 国产成人自拍高清视频在线免费播放| 日本sm残虐另类| 日本在线不卡视频| 亚洲一区日韩精品中文字幕| 最新高清无码专区| 欧美精品一区二区三区久久久 | 欧美精品一区二区三区蜜臀| 91丨porny丨中文| 激情综合网激情| 韩国精品主播一区二区在线观看 | 日本国产一区二区| 91在线你懂得| 欧亚一区二区三区| 欧美三电影在线| 欧美日韩电影一区| 制服丝袜在线91| 日韩精品一区二区三区中文不卡| 欧美精品 国产精品| 欧美久久一二区| 精品国产一区二区亚洲人成毛片| 欧美不卡一二三| 欧美一级电影网站| 日韩一区二区三区电影在线观看| 欧美电影免费观看高清完整版在 | 97精品久久久午夜一区二区三区| 在线看国产一区二区| 日韩欧美一级二级三级| 中文字幕亚洲在| 久久精品国产久精国产爱| 成人午夜激情视频| 91精品国产黑色紧身裤美女| 欧美激情一区二区三区在线| 亚洲电影在线免费观看| 久久爱另类一区二区小说| av电影在线观看不卡 | 在线看国产一区| 欧美精品一区二区不卡| 一区二区免费看| 国产福利不卡视频| 制服丝袜亚洲精品中文字幕| 中文字幕在线不卡国产视频| 美国av一区二区| 欧美三级韩国三级日本一级| 久久久噜噜噜久久中文字幕色伊伊| 伊人婷婷欧美激情| 国产夫妻精品视频| 欧美一级搡bbbb搡bbbb| 亚洲欧美在线视频| 国内欧美视频一区二区 | 国产网站一区二区三区| 亚洲成av人片| 色婷婷久久久综合中文字幕| 久久伊99综合婷婷久久伊| 亚洲丰满少妇videoshd| 99精品视频在线免费观看| 久久婷婷国产综合精品青草| 日韩专区中文字幕一区二区| 色久优优欧美色久优优| 中文字幕免费观看一区| 九一九一国产精品| 56国语精品自产拍在线观看| 亚洲综合在线电影| 色香蕉久久蜜桃| 最新中文字幕一区二区三区| 国产成人在线视频网址| 亚洲精品在线免费播放| 蜜桃av噜噜一区二区三区小说| 欧美老肥妇做.爰bbww| 一区二区免费视频| 欧美日韩在线播| 香蕉av福利精品导航| 欧美日韩电影在线| 日韩中文字幕91| 欧美一区二区在线播放| 肉色丝袜一区二区| 欧美一区二区不卡视频| 蜜桃av一区二区三区电影| 欧美大片日本大片免费观看| 美女一区二区久久| 精品处破学生在线二十三| 国产乱码精品一品二品|