主頁 >  其他 > 讀資料壓縮入門筆記03_VLC

讀資料壓縮入門筆記03_VLC

2023-05-31 08:38:53 其他

1. 概率、熵與碼字長度

1.1. 資料壓縮的目的

1.1.1. 給定一個資料集中的符號,將最短的編碼分配給最可能出現的符號

1.2

1.2.1. 當P(A)=P(B),也就是兩個符號等可能出現時,資料集對應的熵取最大值LOG2(符號的個數),此時資料集很難壓縮

1.2.2. 其中一個符號出現的可能越大,資料集的熵值就越小,此時資料集也越容易壓縮

1.2.3. 對只包含兩個符號的資料集來說,兩個符號互換概率不影響其熵值

1.3. 啟示

1.3.1. 隨著資料集的冗余度下降,它的熵在變大,其最大值為資料集中不同符號個數的LOG2值

1.3.2. 資料集中一個符號出現的概率越大,整個資料集的熵就越小,資料集也就越容易壓縮

1.3.3. 碼字的長度與符號的出現概率密切相關,而與符號本身沒有太大關系

2. VLC演算法

2.1. 在過去的40多年中,人們創造了數百種VLC演算法

2.2. 在為資料集選擇一種VLC編碼方法的考慮因素

2.2.1. 資料集的整體大小

2.2.2. 資料范圍

2.2.3. 計算各個符號的出現概率

2.2.4. 如果不這樣做,得到的結果可能就是,資料集的大小不但沒有壓縮,有可能反而比原來的資料集還大

2.3. 存在的主要問題

2.3.1. 它們不按位元組 / 字 / 整型對齊

2.3.2. 對于大的數值N,為了方便解碼,其碼字長度的增長速度一般會超過lb(N)個二進制位

2.3.3. 解碼的速度很慢(每次只能讀取一個二進制位)

2.3.4. 只能用于表示壓縮資料流,沒有其他應用

3. 設計VLC集的碼字原則

3.1. 越頻繁出現的符號,其對應的碼字越短

3.2. 碼字需滿足前綴性質

4. 前綴性質

4.1. 如果一個碼字是另一個碼字的前綴,那么用VLC解碼二進制流就會很難

4.2. 某個碼字被分配給一個符號之后,其他的碼字就不能用該碼字作為前綴

4.2.1. 每個符號都能通過其碼字前綴唯一地確定

4.3. 前綴性質是VLC能正常作業所必須具有的性質

4.3.1. 與二進制表示相比,VLC要更長一些

5. 唯一可譯碼

5.1. uniquely decodable codes

6. 非奇異碼

6.1. nonsingular codes

7. 每一種前綴編碼都是唯一可譯的和非奇異的

8. VLC編碼步驟

8.1. 遍歷資料集中的所有符號并計算每個符號的出現概率

8.1.1. 畫出資料集中所有符號的直方圖

8.2. 根據概率為每個符號分配碼字,一個符號出現的概率越大,所分配的碼字就越短

8.2.1. 根據出現的頻數對直方圖進行排序

8.2.2. 給每個符號分配一個VLC,從VLC集中碼字最短的開始

8.3. 再次遍歷資料集,對每一個符號進行編碼,并將對應的碼字輸出到壓縮后的資料流中

9. VLC解碼步驟

9.1. 由于碼字的長度并非是固定的,因此解碼程序還是稍微有些復雜

9.2. 解碼的時候,我們會一二進制位一二進制位地讀取資料,直到讀取的二進制位流與其中的某個碼字相匹配

9.3. 一旦匹配,就會輸出相應的符號,并繼續讀取下一個碼字

10. 摩爾斯碼

10.1. 1836年

10.1.1. 畫家Samuel F. B. Morse

10.1.2. 物理學家Joseph Henry

10.1.3. 機械師Alfred Vail

10.1.4. 發明了第一套電報系統

10.2. 克勞德?香農

10.2.1. 摩爾斯碼方面的專家

10.3. 最簡單的編碼文本資訊的方法

10.3.1. 用數字126來編碼AZ的英文字母

10.4. 發送一次資訊所需要的人工操作次數太多

10.4.1. 物理硬體(發報機設備)和人工硬體(也就是操作人員的手腕)的磨損比預期的要快,解決方法則是使用統計來減少作業量

10.5. 對符號分配變長編碼(variable-length codes,VLC)的最初實作之一

10.6. 為英語字母表中的每一個字符都分配了或長或短的脈沖,一個字母用得越頻繁,其編碼也就越短、越簡單

10.6.1. 目的則在于減少傳輸資訊程序中所需要的總作業量

11. 通用編碼

11.1. universal codes

11.2. 一種將整數轉換為VLC的獨特方法

11.3. 一類特殊的前綴編碼

11.4. 為正整數賦上一個長度可變的二進制碼字

11.5. 數值越小,其對應的碼字也越短

11.5.1. 因為假定小整數比大整數出現得更頻繁

12. 二進制編碼

12.1. 不滿足前綴性質

12.2. 用B(n)來表示整數n的標準二進制表示

12.3. beta編碼或二進制編碼

12.4. 給定0~N的任意整數,都能用1+floor(lb(n))個二進制位來表示

12.4.1. 只要提前知道N的值,就能通過固定長度表示法來避開前綴問題

12.4.2. 如果不能提前知道資料集中有多少個不同的整數,就不能用固定長度表示法

13. 一元碼

13.1. 滿足前綴性質

13.2. 任意正整數N,它的一元碼表示都是N-1個1后面跟著1個0

13.2.1. 4的一元碼表示為1110

13.3. 整數N的一元碼長度也是N個二進制位

13.4. 將一元碼應用在那些前一個符號的出現概率是后一個符號2倍的資料集上,效果最佳

13.5. 如果每個整數N的出現概率P(N)服從指數分布2^(-N),即1/2、1/4、1/8、1/16、1/32,其他以此類推,就可以使用一元碼進行編碼

14. Peter Elias

14.1. 1923年11月23日生

14.2. 1955年,他就引入了卷積碼(convolutional codes),作為分組碼(block codes)的一種替代方法

14.3. 建立了二進制洗掉信道(binary erasure channel),并提出了用糾錯碼的串列譯碼(list decoding of error-correcting codes)來代替唯一可譯碼(unique decoding)

14.4. Elias gamma編碼

14.4.1. 用于事先無法確定其上界的整數的編碼

14.4.1.1. 不知道最大的整數會是多大

14.4.2. 對整數n的出現概率P(n)=1/(2n*n)的情形比較適用

14.4.3. 最主要的思想是不再對整數直接編碼,而是用其數量級作為前綴

14.4.3.1. 相應的碼字就由兩部分組成,即與此整數相當的2的次冪再加上余數

14.4.4. 作業原理

14.4.4.1. 找出最大的整數N,使其滿足2N<n<2(N+1),并且將n表示為n=2^N+L這樣的形式

14.4.4.1.1. L=n-2^N
14.4.4.1.2. n=12,23=8,24=16,23<n<24,N=3
14.4.4.1.3. L=12-2^3=4

14.4.4.2. 用一元碼表示N

14.4.4.2.1. N=3,一元碼110

14.4.4.3. 將L表示為長為N的二進制編碼,并加在步驟(2)中得出的一元碼之后

14.4.4.3.1. 有了這樣的對稱性,后面才能順利解碼
14.4.4.3.2. L=4,其對應的長度為3的二進制碼為100
14.4.4.3.3. 將前兩個步驟得出的編碼連接,就得到了最終的輸出110100

14.5. Elias delta編碼

14.5.1. 對整數N的出現概率P(N)等于1/[2n(lb(2n)*lb(2n))的資料集來說是理想的選擇

14.5.2. 作業原理

14.5.2.1. 將要編碼的數N用二進制表示

14.5.2.1.1. 將N=12表示為二進制1100

14.5.2.2. 數一下N的二進制位數,并將這個位數轉化為二進制,作為C

14.5.2.2.1. 12的二進制表示共有4位,將4表示為二進制,即C = 100

14.5.2.3. 去掉N的二進制表示的最左邊一位,這個值肯定是1

14.5.2.3.1. 去掉N=12的二進制表示的最左一位,得到100

14.5.2.4. 將C的二進制表示加在去掉最左邊一位后的N的二進制表示之前

14.5.2.4.1. 將C = 100加到上一步驟所得的結果之前,得到100100

14.5.2.5. 在上一步驟所得的結果前加上C的二進制位數減1個0作為最終的編碼

14.5.2.5.1. 將C的二進制位數減1,即3-1 = 2,在上一步驟所得的結果前加上2個0,由此得到12的最終編碼為00100100

15. 谷歌的Varint演算法

15.1. 最基本的概念早在1972年就提出

15.2. 2010年作為“避免壓縮整數”(escaping for compressed integers)而被重新引入

15.3. 是一種表示整數的方法,它用一個或多個位元組來表示一個整數,數值越小用的位元組數越少,數值越大用的位元組數越多

15.3.1. 結合了VLC的靈活性和現代計算機體系結構的高效率,是一種很好的混合方法

15.3.2. 既允許我們表示可變范圍內的整數,同時還對自身的資料進行了對齊以提高解碼的效率,達到了雙贏

15.4. 方法

15.4.1. 將幾個位元組連接起來表示整數

15.4.2. 并用每個位元組的MSB作為布爾標志,來判斷當前的位元組是否為該整數的最后一個位元組

15.4.3. 每個位元組的低7位則用來存盤該數的二進制補碼(two's complement representation)

15.4.4. 整數1可以用一個位元組表示,因此它的MSB不需要設定,可表示為00000001

15.5. 示例

15.5.1. 10101100 00000010

15.5.1.1. 10101100 00000010 → 0101100 0000010

15.5.1.1.1. 刪掉每個位元組的MSB
15.5.1.1.1.1. 它的作用只是判斷當前位元組是否是最后一個位元組
15.5.1.1.1.2. 第一個位元組的MSB已經設定為1,因為用Varint方法來表示,該數需要多個位元組

15.5.1.2. 0101100 0000010

15.5.1.2.1. 將剩下的兩個7二進制位的資料順序顛倒一下
15.5.1.2.1.1. 用Varint方法表示時,低位的位元組在前

15.5.1.3. 0000010 0101100

15.5.1.3.1. 將二進制表示轉換為十進制數,就得到了最終的數值300

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553875.html

標籤:其他

上一篇:OWASP移動應用安全測驗指南中文版

下一篇:返回列表

標籤雲
其他(160039) Python(38189) JavaScript(25464) Java(18161) C(15234) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7217) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4579) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1927) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 讀資料壓縮入門筆記03_VLC

    一種表示整數的方法,它用一個或多個位元組來表示一個整數,數值越小用的位元組數越少,數值越大用的位元組數越多 ......

    uj5u.com 2023-05-31 08:38:53 more
  • OWASP移動應用安全測驗指南中文版

    OWASP移動應用安全測驗指南(MASTG)是OWASP移動應用安全(MAS)旗艦專案的一部分,是一本涵蓋移動應用安全分析程序、技術和工具的綜合手冊,也是一套詳盡的測驗案例,用于驗證OWASP移動應用安全驗證標準(MASVS)中列出的要求,為完整和一致的安全測驗提供一個基線。 OWASP MASVS ......

    uj5u.com 2023-05-31 08:38:40 more
  • 最流行的AI繪圖工具Midjourney,你不得不知道的使用技巧

    Midjourney成為了最受歡迎的生成式AI工具之一。它的使用很簡單。輸入一些文本,Midjourney背后的大腦(或計算機)將自動為您繪制生動的影像。但與DALL-E等其他AI影像生成器不同,您只能通過Discord聊天應用程式訪問Midjourney。 ......

    uj5u.com 2023-05-31 08:38:21 more
  • Java 集合類詳解(一)

    ## 為什么要使用集合 存盤多個資料可以使用陣列,但由于陣列在記憶體中是連續存盤的,所以會有一些限制。比如陣列在創建時就要指定長度,即可以容納的元素個數,且指定后無法更改;陣列在創建時需要指定元素的型別,并且所有元素都必須是該型別或其子類;添加或洗掉陣列中的元素需要創建一個新陣列再進行元素復制,比較麻 ......

    uj5u.com 2023-05-31 08:38:08 more
  • Unity_Photon

    # Photon ## Photon搭建 [(2條訊息) 【Unity3D】Photon環境搭建_photon框架_little_fat_sheep的博客-CSDN博客](https://blog.csdn.net/m0_37602827/article/details/127054963?ops_ ......

    uj5u.com 2023-05-31 08:38:02 more
  • P9376 題解

    首先考慮怎么暴力。 考慮把每個數進行 $B$ 進制分解,然后我們驚奇的發現這兩個操作就是把最低位去掉和往最低位后面插入一個數。 然后我們順藤摸瓜,把每個數的分解扔到 Trie 樹上,我們發現我們要找到一個節點,使得所有單詞節點到其的距離之和最短,答案就是這個最短距離。 這里直接考慮一個 Trie 樹 ......

    uj5u.com 2023-05-31 08:37:56 more
  • AtCoder Beginner Contest 303

    ## [A - Similar String (abc303 a)](https://atcoder.jp/contests/abc303/tasks/abc303_a) ### 題目大意 給定兩個字串,問這兩個字串是否相似。 兩個字串相似,需要每個字母,要么完全相同,要么一個是`1`一個是` ......

    uj5u.com 2023-05-31 08:37:52 more
  • Kali滲透Windows服務器

    這個實驗主要讓我們學習漏洞掃描技識訓本原理,了解其在網路攻防中的作用,掌握使用Kali中的Metasploit對目標主機滲透,并根據報告做出相應的防護措施。 ......

    uj5u.com 2023-05-31 08:37:31 more
  • 輔助測驗和研發人員的一款小插件【資料安全】

    ## 一、為什么要做一款這樣的小插件 資料,一直在思考如何讓資料更安全的流轉和服務于客戶,圍繞這樣的想法,我們做過許多方面的擴展。我們落地了服務端的資料切片支持場景化的設計,實作了基于JDBC協議對SQL的攔截與切片,實作了在應用層的全鏈路資料庫審計方案和實作,實作了WEB端明暗水印和檔案水印等等, ......

    uj5u.com 2023-05-31 08:37:14 more
  • 機器學習-KNN演算法

    ##### 1. 演算法原理(K-Nearest Neighbor) - 本質是通過距離判斷兩個樣本是否相似,如果距離夠近就認為他們足夠相似屬于同一類別 - 找到離其最近的 k 個樣本,并將這些樣本稱之 為「**近鄰**」(nearest neighbor)。 - 對這 k 個近鄰,查看它們的都屬于何 ......

    uj5u.com 2023-05-31 08:37:10 more