国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

2021-12-22 15:04森明幫大于黑虎幫 C/C++

這篇文章主要介紹了C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能,本文給大家提到文件壓縮的概念介紹及壓縮方法,通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下

前言

 

一、文件壓縮

1.文件壓縮的概念

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

文件壓縮是指在不丟失有用信息的前提下,縮減數據量以減少存儲空間,提高其傳輸、存儲和處理效率,或按照一定的算法對文件中數據進行重新組織,減少數據的冗余和存儲的空間的一種技術方法。

2.為什么需要壓縮

①緊縮數據存儲容量,減少存儲空間。
②可以提高數據傳輸的速度,減少帶寬占用量,提高通訊效率。
③對數據的一種加密保護,增強數據在傳輸過程中的安全性。

3.壓縮的分類

  • 有損壓縮:有損壓縮是利用了人類對圖像或聲波中的某些頻率成分不敏感的特性,允許壓縮過程中損失一定的信息;雖然不能完全恢復原始數據,但是所損失的部分對理解原始圖像的影響縮小,卻換來了大得多的壓縮比,即指使用壓縮后的數據進行重構,重構后的數據與原來的數據有所不同,但不影響人對原始資料表達的信息造成誤解。
  • 無損壓縮:對文件中數據按照特定的編碼格式進行重新組織,壓縮后的壓縮文件可以被還原成與源文件完全相同的格式,不會影響文件內容,對于數碼圖像而言,不會使圖像細節有任何損失。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4.壓縮的方法

壓縮的目的是讓文件變小,減少文件所占的存儲空間。

專有名詞采用的固定短語:比如:南昌大學,簡稱南大或者昌大,就可以提到壓縮的目的,但只能針對于大家所熟知的專有名詞。

縮短文件中重復的數據:比如文件中存放數據為:mnoabczxyuvwabc123456abczxydefgh
對文件中重復數據使用(距離,長度)對進行替換,壓縮之后的結果為:mnoabczxyuvw(9,3)123456(18, 6)defgh。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

給文件中每個字節找一個更短的編碼:比如文件中存放數據為:ABBBCCCCCDDDDDDD。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

采用靜態等長編碼壓縮: 00010101 10101010 10000000 00000000。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

采用動態不等長編碼壓縮:10010110 11011111 11111100 00000000。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

文件16個字節,壓縮完成之后占4個字節,可以起到壓縮的目的。

 

二、HuffmanTree文件壓縮與解壓縮

1.HuffmanTree的概念

在認識哈夫曼樹之前,你必須知道以下幾個基本術語:

①什么是路徑?

在一棵樹中,從一個結點往下可以達到的結點之間的通路,稱為路徑。
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

②什么是路徑長度?

某一路徑所經過的“邊”的數量,稱為該路徑的路徑長度。
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
如圖,該路徑經過了3條邊,因此該路徑的路徑長度為3。

③什么是結點的帶權路徑長度?

若將樹中結點賦給一個帶有某種含義的數值,則該數值稱為該結點的權。從根結點到該結點之間的路徑長度與該結點的權的乘積,稱為該結點的帶權路徑長度。
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
如圖,葉子結點I的帶權路徑長度為 3 × 3 = 9 。

④什么是樹的帶權路徑長度?

樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為WPL。
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
如圖,該二叉樹的帶權路徑長度 WPL= 2 × 2 + 2 × 6 + 3 × 1 + 3 × 3 + 2 × 2 = 32

⑤什么是哈夫曼樹?

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,則稱該二叉樹為哈夫曼樹,也被稱為最優二叉樹。

根據樹的帶權路徑長度的計算規則,我們不難理解:樹的帶權路徑長度與其葉子結點的分布有關。
即便是兩棵結構相同的二叉樹,也會因為其葉子結點的分布不同,而導致兩棵二叉樹的帶權路徑長度不同。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

那如何才能使一棵二叉樹的帶權路徑長度達到最小呢?
根據樹的帶權路徑長度的計算規則,我們應該盡可能地讓權值大的葉子結點靠近根結點,讓權值小的葉子結點遠離根結點,這樣便能使得這棵二叉樹的帶權路徑長度達到最小。

2.HuffmanTree的構建

下面給出一個非常簡潔易操作的算法,來構造一棵哈夫曼樹:
1、初始狀態下共有n個結點,結點的權值分別是給定的n個數,將他們視作n棵只有根結點的樹。
2、合并其中根結點權值最小的兩棵樹,生成這兩棵樹的父結點,權值為這兩個根結點的權值之和,這樣樹的數量就減少了一個。
3、重復操作2,直到只剩下一棵樹為止,這棵樹就是哈夫曼樹。

例如,現給定5個數,分別為1、2、2、3、6,要求構建一棵哈夫曼樹。
動圖演示:

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

1、初始狀態:有5棵只有根結點的樹。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

2、合并權值為1和2的兩棵樹,生成這兩棵樹的父結點,父結點權值為3。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

3、合并權值為2和3的兩棵樹,生成這兩棵樹的父結點,父結點權值為5。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4、合并權值為3和5的兩棵樹,生成這兩棵樹的父結點,父結點權值為8。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

5、合并權值為6和8的兩棵樹,生成這兩棵樹的父結點,父結點權值為14。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

6、此時只剩下一棵樹了,這棵樹就是哈夫曼樹。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

3.文件壓縮

1.統計源文件中每個字符出現的頻數

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

2.根據統計的結果創建HuffmanTree

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

3.借助Huffman樹獲取每個字節的編碼

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4.使用獲取到的字節編碼對源文件進行改寫,對源文件每個字節替換成huffman編碼

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4.文件解壓縮

1.解壓縮需要獲取的信息

1.獲取源文件后綴
2.構建字節頻次信息,統計有效字符總行數
3.寫入信息
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

2.從壓縮文件讀取解壓縮需要用到的信息

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

3.恢復huffmanTree

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4.讀取壓縮信息,結合huffmanTree進行解壓縮

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

 

三、HuffmanTree壓縮解壓縮碰到的問題

1.創建優先級隊列要使用自己寫的仿函數

默認創建的是根據節點的地址來比較,這里寫最后是按地址的大小比較,因為傳過去的是節點的指針,而我們要根據根據節點里面的權值來創建小堆,所以自己寫仿函數。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

2.自定義類型結構體類型相加和仿函數要重載operator+和operator>

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

3.剔除在HuffmanTree出現0次的字符,不用統計出現0次的字符

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4.如果在解壓縮時,最后一個字節的壓縮數據不滿8個比特位,則在解壓縮過程中如何處理?

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能
C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

5.在解壓縮源文件中有漢字,解壓縮過時出現亂碼,怎么處理?

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

首先應該注意到是的亂碼出現的原因:
1.文件中存在漢字,而漢字的編碼對應ASCII表可能是使用多個字節來編碼一個漢字,但是在解碼過程中是逐字節獲取,這就導致了該字節在表中對應一個負數。

壓縮帶中文的文件,程序就會崩潰。

最后發現數組越界的問題.
因為char它的范圍是-128127,程序中使用char類型為數組下標(0127),所以字符沒有問題,但是漢字是占兩個字節的,所以會出現越界的問題,解決的方法就是char類型強轉為unsigned char,它的范圍為0~255。

6.文件中包含多行文本時解壓縮出現亂碼

最直接的排錯方式:查看壓縮與解壓縮時使用的Huffman樹是否相同,相當于比較壓縮與解壓縮時所使用的字節頻次信息是否相同,遇到換行時,直接開始下一次循環,以至于最后的循環少一次。

7.解壓縮文件大小小于源文件大小,沒有解壓縮全部如何解決

①如何判斷解壓縮文件是否正確,使用的是Ultar Edit

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

②文件讀取時,”r"文本方式讀入,讀取時遇到-1就會結束,所以在此處要采用二進制方式進行讀寫“rb”

 

四、測試結果

1.字符文件

自帶的壓縮軟件為1KB,這個為6KB。

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

2.文本文件

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

3.圖片文件

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

4.如果對壓縮結果二次或者多次壓縮,會不會每次都變小

不會,對壓縮文件再次壓縮就相當于在進行一次Huffman編碼的基礎上再進行編碼,結果不一定。

5.Huffman壓縮有無出現壓縮結果變大的可能

有,在文件中如果字節的種類非常多,而且出現次數比較均衡的情況下,變大的可能性就越大,Huffman樹在越接近平衡二叉樹的情況下,壓縮結果越不理想,字節的編碼長度都差不多,比如壓縮音頻以及視頻文件,壓縮率都超過了100%!

6.結論

C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能

文本文件的壓縮率比二進制文件的壓縮率更好,因為文本文件的編碼相比于二進制文件的編碼相對更簡單,導致了文件壓縮率的差距較大。相比傳統的壓縮工具,這個工具壓縮效率基本為傳統壓縮效率的3分之一。

到此這篇關于C++項目基于HuffmanTree實現文件的壓縮與解壓縮功能的文章就介紹到這了,更多相關C++文件的壓縮與解壓縮內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_44918090/article/details/119894183

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 中文字幕91视频 | 欧美日韩国产一区二区三区不卡 | 超碰在线91| 欧美日韩视频在线第一区 | 久久最新 | 精品99免费 | 亚洲精品网址 | 一区二区三区久久久久 | 精品久久久久久久久久久久久久 | 国产精品福利在线观看 | 亚洲一区自拍 | 毛片综合 | 欧美三区 | 国产欧美高清在线观看 | 国产色秀视频在线观看 | 免费观看日本视频 | 精品96久久久久久中文字幕无 | 成人av网站免费观看 | 久久亚| 啵啵影院午夜男人免费视频 | 欧美日韩精品免费 | 精品福利视频网站 | 天天操夜夜操 | 九色影院 | 国产精品无码久久久久 | 久久久久久久av | 亚洲一区二区免费视频 | av一区二区不卡 | 国产专区在线 | 欧美大片免费在线观看 | 精品久久精品 | 日韩中文字幕在线观看视频 | 亚洲精品伊人 | 久久久久亚洲精品 | 国产免费高清 | 国产精品区二区三区日本 | a级片在线观看 | 色婷婷av一区二区三区大白胸 | 欧美乱大交xxxxx春色视频 | 日韩中文字幕免费在线播放 | 日韩欧美一级片 |