變長碼演算法
1. 變長演算法的VHDL建模及程序設計:按照數字圖像中變長演算法編碼規則將輸入的二進制碼流進行變長演算法編碼。
不會呀,你能不能叫別人去做呢
2. 任意變長碼的平均碼長最小
平均碼長=每個碼長*頻度。
採用只有兩種碼長的擴展操作碼,可根據14條指令所給出的使用頻度值分成兩群,讓使用頻度較高的6條指令用3位操作碼編碼表示。例如,用000~101分別表示使用頻度為0.15、0.15、0.14、0.13、0.12、0.11的指令的操作碼。
相關知識
在計算機數據處理中,霍夫曼編碼使用變長編碼表對源符號(如文件中的一個字母)進行編碼,其中變長編碼表是通過一種評估來源符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼。
這便使編碼之後的字元串的平均長度、期望值降低,從而達到無損壓縮數據的目的。
3. Unicode詳解
字元編碼的問題,每個程序員都會遇到,深入探索其背後的原理和機制,能讓我們少走很多彎路。
Unicode ( 萬國碼 、 國際碼 、 統一碼 、 單一碼 )是計算機科學領域里的一項業界標准。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。
Unicode發展由非營利機構統一碼聯盟負責,該機構致力於讓Unicode方案替換既有的字元編碼方案。因為既有的方案往往空間非常有限,亦不適用於多語環境。
統一碼聯盟在1991年首次發布了 The Unicode Standard 。
在2005年,Unicode的第十萬個字元被引入成為標准之一,該字元被用於馬拉雅拉姆語。
目前實際應用的統一碼版本對應於UCS-2,使用16位的編碼空間。也就是每個字元佔用2個位元組。這樣理論上一共最多可以表示2的16次(即65536)個字元。基本滿足各種語言的使用。實際上當前版本的統一碼並未完全使用這16位編碼,而是保留了大量空間以作為特殊使用或將來擴展。
最新(但未實際廣泛使用)的統一碼版本定義了16個輔助平面,兩者合起來至少需要佔據21位的編碼空間,比3位元組略少。但事實上輔助平面字元仍然佔用4位元組編碼空間,與UCS-4保持一致。未來版本會涵蓋UCS-4的所有字元。UCS-4是一個更大的尚未填充完全的31位字元集,加上恆為0的首位,共需占據32位,即4位元組。理論上最多能表示2的31次方個字元,完全可以涵蓋一切語言所用的符號。
通用字元集 (Universal Character Set)是由ISO制定的 ISO 10646 (或稱 ISO/IEC 10646 )標准所定義的標准字元集。
通用字元集包括了其他所有字元集。它保證了與其他字元集的雙向兼容,即,如果你將任何文本字元串翻譯到UCS格式,然後再翻譯回原編碼,你不會丟失任何信息。
UCS包含了已知語言的所有字元。除了拉丁語、希臘語、斯拉夫語、希伯來語、阿拉伯語、亞美尼亞語、喬治亞語,還包括中文、日文、韓文這樣的方塊文字,UCS還包括大量的圖形、印刷、數學、科學符號。
ISO/IEC 10646定義了一個31位的字元集。
並不是所有的系統都需要支持像組合字元這樣的的先進機制。因此ISO 10646指定了如下三種實現級別:
歷史上存在兩個獨立的嘗試創立單一字元集的組織,即:
1、國際標准化組織(ISO)於1984年創建的ISO/IEC
2、統一碼聯盟
統一碼聯盟和ISO/IEC都同意保持兩者標準的碼表兼容,並緊密地共同調整任何未來的擴展。
Unicode的實現方式不同於編碼方式。一個字元的Unicode編碼是確定的。但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對Unicode編碼的實現方式有所不同。
Unicode的實現方式稱為 Unicode轉換格式 (Unicode Transformation Format,簡稱為 UTF )。
前面說到,Unicode採用2個位元組來編碼文件,但是如果一個僅包含7位ASCII字元的Unicode文件,每個字元使用2位元組就浪費了一般的存儲空間,其第一位元組的8位始終為0,這是難以忍受。對於這種情況,可以使用UTF-8編碼,這是一種變長編碼,它將基本7位ASCII字元仍用7位編碼表示,佔用一個位元組(首位補0)。而遇到與其他Unicode字元混合的情況,將按一定演算法轉換,每個字元使用1-3個位元組編碼,並利用首位為0或1進行識別。
問題來了,UTF-8變長編碼格式的出現是為了節省存儲空間,變長導致了UTF-8的兼容性相應降低。
類似的,對未來會出現的需要4個位元組的輔助平面字元和其他UCS-4擴充字元,2位元組編碼的UTF-16也需要通過一定的演算法進行轉換。
也就是說,UTF-16是為未來准備的變長編碼格式。
還有就是,在Mac和普通PC上,對於位元組順序的理解是不一致的。這時同一位元組流可能會被解釋為不同內容,如某字元為十六進制編碼4E59,按兩個位元組拆分為4E和59,在Mac上讀取時是從低位元組開始,那麼在Mac OS會認為此4E59編碼為594E,找到的字元為「奎」,而在Windows上從高位元組開始讀取,則編碼為U+4E59的字元為「乙」。就是說在Windows下以UTF-16編碼保存一個字元「乙」,在Mac OS環境下打開會顯示成「奎」。此類情況說明UTF-16的編碼順序若不加以人為定義就可能發生混淆。
於是在UTF-16編碼實現方式中使用了 大端序 (Big-Endian,簡寫為UTF-16 BE)、 小端序 (Little-Endian,簡寫為UTF-16 LE)的概念,以及可附加的位元組順序記號解決方案,目前在PC機上的Windows系統和Linux系統對於UTF-16編碼默認使用UTF-16 LE。目前在PC機上的Windows系統和Linux系統對於UTF-16編碼默認使用UTF-16 LE。
在Windows XP附帶的記事本,「另存為」對話框可以選擇的四種編碼方式除去非Unicode編碼的ANSI(對於英文系統即ASCII編碼),中文系統則為GB2312或Big5外,其餘三種為「Unicode」(對應UTF-16 LE)、「Unicode big endian」(對應UTF-16 BE)和「UTF-8」。
UTF-8,是我們最經常看到的編碼格式之一。前面已經簡單介紹過,這是一種變長編碼格式,變長的目的是節省存儲空間。
UTF-8使用一至六個位元組為每個字元編碼(2003年11月UTF-8被RFC 3629重新規范,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多四個位元組)。
下面介紹其編碼規則:
1、128個US-ASCII字元只需一個位元組編碼(Unicode范圍由U+0000至U+007F)。
2、帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文等則需要兩個位元組編碼(Unicode范圍由U+0080至U+07FF)。
3、其他基本多文種平面(BMP)中的字元(這包含了大部分常用字,如大部分的漢字)使用三個位元組編碼(Unicode范圍由U+0800至U+FFFF)。
4、其他極少使用的Unicode 輔助平面的字元使用四至六位元組編碼。(Unicode范圍由U+10000至U+1FFFFF使用四位元組,Unicode范圍由U+200000至U+3FFFFFF使用五位元組,Unicode范圍由U+4000000至U+7FFFFFFF使用六位元組)。
對上述提及的第四種字元而言,UTF-8使用四至六個位元組來編碼似乎太耗費資源了。但UTF-8對所有常用的字元都可以用三個位元組表示,而且它的另一種選擇,UTF-16編碼,對前述的第四種字元同樣需要四個位元組來編碼,所以要決定UTF-8或UTF-16哪種編碼比較有效率,還要視所使用的字元的分布范圍而定。
下面來看看UTF-8具體怎麼編碼各種類型的字元:
1、單位元組編碼,位元組由零開始:0zzzzzzz。(z取值0或1,下同)
2、兩位元組編碼:(110yyyyy 10zzzzzz)第一個位元組由110開始,接著的位元組由10開始
3、三位元組編碼:(01110xxxx10yyyyyy 10zzzzzz)第一個位元組由1110開始,接著的位元組由10開始。
4、四位元組編碼:(11110www 10xxxxxx 10yyyyyy 10zzzzzz)將由11110開始,接著的位元組由10開始
UTF-16 是Unicode字元編碼五層次模型的第三層:字元編碼表。即把Unicode字元集的抽象碼位映射為16位長的整數,用於數據存儲或傳遞。Unicode字元的碼位,需要1個或者2個16位長的碼元來表示,因此這是一個變長表示。
Unicode的編碼空間從U+0000到+10FFFF,共有1,112,064個碼位(code point)可用來映射字元. Unicode的編碼空間可以劃分為17個平面(plane),每個平麵包含216(65,536)個碼位。17個平面的碼位可表示為從U+xx0000到U+xxFFFF,其中xx表示十六進制值從0016到1016,共計17個平面。第一個平面稱為 基本多語言平面 (Basic Multilingual Plane, BMP ),或稱第零平面(Plane 0)。其他平面稱為 輔助平面 (Supplementary Planes)。基本多語言平面內,從U+D800到U+DFFF之間的碼位區段是永久保留不映射到Unicode字元。UTF-16就利用保留下來的0xD800-0xDFFF區段的碼位來對輔助平面的字元的碼位進行編碼。
分平面來介紹UTF-16的實現方式:
1、第一個Unicode平面(碼位從U+0000至U+FFFF)包含了最常用的字元。該平面被稱為基本多語言平面,縮寫為 BMP (Basic Multilingual Plane, BMP)。UTF-16與 UCS-2 編碼這個范圍內的碼位為16比特長的單個碼元,數值等價於對應的碼位. BMP中的這些碼位是僅有的可以在UCS-2中表示的碼位.
2、輔助平面(Supplementary Planes)中的碼位,在UTF-16中被編碼為 一對 16比特長的碼元(即32bit,4Bytes),稱作 代理對 (surrogate pair),具體方法是:
演算法可理解為:輔助平面中的碼位從U+10000到U+10FFFF,共計FFFFF個,即220
=1,048,576個,需要20位來表示。如果用兩個16位長的整數組成的序列來表示,第一個整數(稱為前導代理)要容納上述20位的前10位,第二個整數(稱為後尾代理)容納上述20位的後10位。還要能根據16位整數的值直接判明屬於前導整數代理的值的范圍(210=1024),還是後尾整數代理的值的范圍(也是210
=1024)。因此,需要在基本多語言平面中保留不對應於Unicode字元的2048個碼位,就足以容納前導代理與後尾代理所需要的編碼空間。這對於基本多語言平面總計65536個碼位來說,僅佔3.125%.
3、Unicode標准規定U+D800..U+DFFF的值不對應於任何字元.
參考資料:
https://zh.wikipedia.org/wiki/Unicode
https://zh.wikipedia.org/wiki/UTF-8
https://zh.wikipedia.org/wiki/UTF-16
4. 中國鞋碼的換算公式
換算公式:多少厘米*2-10=多少碼
例如:220鞋碼是34碼;225鞋碼是35碼;230鞋碼是36碼;235鞋碼是37碼;240鞋碼是38碼;245鞋碼是39碼;250鞋碼是40碼。詳情見下表:
(4)變長碼演算法擴展閱讀:
鞋碼通常也稱鞋號,是用來衡量人類腳的形狀以便配鞋的標准單位系統。
2013年世界各國採用的鞋碼並不一致,但一般都包含長、寬兩個測量。長度是指穿者腳的長度,也可以是製造者的鞋楦長。即使在同一個國家/地區,不同人群和不同用途的鞋,例如兒童、運動鞋,也有不同的鞋碼定義。
腳長指最長腳趾頂點到腳後跟突點間的水平直線距離。 注意不要直接量腳,直接量會出現很大的誤差,而要使用白紙,把腳踩在白紙上,沿著腳用筆在白紙上畫出腳的四周,或者在腳的前端和後端分別做標記;根據所畫的腳圖測量長度,便是腳長。
腳圍指的是腳的寬度,是指拇指球到尾趾根部的垂直距離。將腳輕踩在紙上描出輪廓形狀(筆呈90度垂直),再量腳型的長與寬,對照以下的數據表一般來說都是以腳長為主來判斷尺寸。
5. 什麼叫誤碼擴散度
咨詢記錄 · 回答於2021-10-09
6. 定長編碼怎樣確定碼長
定長編碼確定碼長的方法是:通過ASCII編碼來實現的,因為定長僅表明段與段之間長度相同,但沒說明是多長。有了ASCII編碼這一基本單位,我們就可以說得更具體,如定長一位元組或者定長二位元組。
假設我們現在有個文件,內容是00000001,假如定長2位(這里的位指十進制的位)是唯一的編碼方案,用它去解碼,就會得到「hhhe」(可以對比圖上的編碼,00代表h,所以前6個0轉化成3個h,後面的01則轉化成e)。
定長多位元組方案是如何來的:其實變長多位元組方案更早出現,比如GB2312,採用變長主要為了兼容一位元組的ASCII,漢字則用兩位元組表示。隨著計算機在全世界的推廣,各種編碼方案都出來了,彼此之間的轉換也帶來了諸多的問題。
編碼的定義是:
1、固定長度的碼,碼中所有碼字的長度都相同。
2、可變長度碼,碼中的碼字長短不一就是變長碼。
奇異碼和非奇異碼:若信源符號和碼字是一一對應的,則該碼為非奇異碼。反之為奇異碼。
唯一可解碼和非唯一可解碼:唯一可解碼:任意有限長的碼元序列,只能被唯一地分割成一個個的碼字,便稱為唯一可解碼。
非即時碼:如果接收端收到一個完整的碼字後,不能立即解碼,還需等下一個碼字開始接收後才能判斷是否可以解碼。
即時碼:只要收到符號就表示該碼字已完整,可以立即解碼。
即時碼的條件:設W1=Wi1Wi2…WiL為一個碼字,對於任意的1≤j≤l,稱碼符號序列的前j個元素Wi1Wi2… Wij為碼字的前綴。
7. 哈夫曼編碼碼長怎麼算
假設用於通信的電文由字元集{a,b,c,d,e,f,g,h}中的字母構成,這8個字母在電文中出現的概率分別為{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}。
哈夫曼編碼 根據上面可得編碼表: a:1001 b:01 c:10111 d:1010 e:11 f:10110 g:00 h:1000
用三位二進行數進行的等長編碼平均長度為3,而根據哈夫曼樹編碼的平均碼長為:4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61 2.61/3=0.87=87%其平均碼長是等長碼的87%,所以平均壓縮率為13%。
因為定長編碼已經用相同的位數這個條件保證了任一個字元的編碼都不會成為其它編碼的前綴,所以這種情況只會出現在變長編碼當中,要想避免這種情況,
就必須用一個條件來制約定長編碼,這個條件就是要想成為壓縮編碼,變長編碼就必須是前綴編碼,所謂的前綴編碼就是任何一個字元的編碼都不能是另一個字元編碼的前綴。
(7)變長碼演算法擴展閱讀:
實際應用中,除採用定時清洗以消除誤差擴散和採用緩沖存儲以解決速率匹配以外,主要問題是解決小符號集合的統計匹配,
例如黑(1)、白(0)傳真信源的統計匹配,採用0和1不同長度遊程組成擴大的符號集合信源。遊程,指相同碼元的長度(如二進碼中連續的一串0或一串1的長度或個數)。按照CCITT標准,需要統計2×1728種遊程(長度),
這樣,實現時的存儲量太大。事實上長遊程的概率很小,故CCITT還規定:若l表示遊程長度,則l=64q+r。其中q稱主碼,r為基碼。編碼時,不小於64的遊程長度由主碼和基碼組成。而當l為64的整數倍時,只用主碼的代碼,已不存在基碼的代碼。
8. 哈夫曼編碼碼長怎麼算
設某信源產生有五種符號u1、u2、u3、u4和u5,對應概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。
霍夫曼編碼是變長編碼,思路:對概率大的編的碼字短,概率小的編的碼字長,這樣一來所編的總碼長就小,這樣編碼效率就高。上面那樣求是不對的,除非你這6個碼字是等概率的,各佔1/6。應該用對應的概率*其對應得碼長,再求和。
實際應用中
除採用定時清洗以消除誤差擴散和採用緩沖存儲以解決速率匹配以外,主要問題是解決小符號集合的統計匹配,例如黑(1)、白(0)傳真信源的統計匹配,採用0和1不同長度遊程組成擴大的符號集合信源。遊程,指相同碼元的長度(如二進碼中連續的一串0或一串1的長度或個數)。
按照CCITT標准,需要統計2×1728種遊程(長度),這樣,實現時的存儲量太大。事實上長遊程的概率很小,故CCITT還規定:若l表示遊程長度,則l=64q+r。
9. Unicode字元集的UTF-32、UTF-16和UTF-8編碼
什麼是Unicode字元集?簡單地說,它就是把全世界人類發明和使用的現有的所有字元進行了集中收集和逐一編碼,這個過程就像把上學時老師把班裡學生都叫到一起,統計總數後給每個學生分配一個唯一的學號一樣。Unicode字元集里收錄的字元可以是文字(如:『α』、『魍』等),也可以是符號(如:『@』、『$』),還可以是圖形(如'☺'等)。
那它有什麼用呢?它有兩個重要的用途:
一是解決了人們和機器之間的字元交互問題。每個字元不再是一個個抽象的文字、符號或圖形,而是變成了一個個的數字,每個數字對應一個唯一的字元,而每個字元也有一個唯一的數字,兩者之間是一一對應關系,而且不同字元和不同數字都各不相同,避免了「重名重姓」問題。這里,提到的表示字元的數字,我們也稱之為 碼點 ,後面我們還會詳細介紹。
二是解決了不用語言國家字元集編碼不統一的問題,提供了一個統一的編碼方式,避免「各自為政,政出多門」的問題,方便相互之間的數據交流。
有了基本概念,那麼我們看看Unicode字元集是如何實現對所有字元編碼的。根據官網公布的Unicode 最新版本(9.0)介紹,Unicode字元集現在共包括 128,172 個字元,可查看 http://www.unicode.org/versions/Unicode9.0.0/ 。如此大量的字元,該如何編碼?最笨的辦法就是把所有字元列出來,然後一個一個編個號,但這樣不利於查找,也不利於分類,更不利於進行存儲空間優化編碼(後面會介紹一些優化編碼方案)。
那Unicode字元集怎麼解決這個編碼問題呢?它採用的是「分塊編碼」。按照國籍、地區、用途、功能等不同屬性,把字元先進行分類,然後再根據每個小字元類的字元個數,確定一個個大小不同的 碼塊 ,下面節選了幾種字元及其對應的 碼點 。
(節選)
0000..007F; Basic Latin(基本拉丁字母)
4E00..9FFF; CJK Unified Ideographs(CJK統一表意文字)
1D100..1D1FF; Musical Symbols(音樂符號)
100000..10FFFF; Supplementary Private Use Area-B(補充專用區域-B)
注意,「0000」、「007F」、「1D100」以及「100000」等,都是十六進制,這是每個字元在Unicode字元集中的編號,也就是相當於每個字元的「學號」。
可以看出,要表示一個字元,最長需要6位十六進制數,換算一下就是24位二進制數;而短的,比如基本拉丁字母,前面的「0」省去,只要2位十六進制(8位二進制數)就行了。
有了字元集,下面就要談談如何表示和使用這些字元(碼點)了。畢竟,誰也不會閑了沒事把字元編個號就為了練自己認字和數數的能力。 最重要的當然是為了讓不同信息受體間交換信息 。
於是,就出現了UTF。所謂UTF是Unicode Transformation Format的縮寫,意為Unicode轉換格式。UTF具體分為3類,分別是UTF-32,UTF-16和UTF-8。
先看UTF-32。UTF-32是 定長編碼 ,也就是說每個字元的編碼長度都是固定的,『32『是其所使用的二進制編碼的位數,即: 32位 。但通常以位元組數進行量化,所以32位對應的位元組數為 4位元組 。
我們的Unicode字元集每個字元的碼點最長也就是24位,相當於3個位元組,而UTF-32給了4個位元組(32位)來表示,給了字元集非常大的擴展空間(有興趣的童鞋可以算算32位二進制數最大可以表示多大的數,這個數基本就對應了可以表示多少字元)。
沒這時間計算這些的童鞋你就簡單理解為,UTF-32就是一個「運超大箱」的快遞公司,不管你寄什麼,它都統一拿裝冰箱的盒子寄(覺得不夠大的,自行腦補一個),保證能一次裝下你要寄的東西。
它的優點是被表示的Unicode字元都是固定長度的,易於查找和解碼;但缺點是表示常用字元時內存佔用太大,本地存儲利用率或傳輸效率太低。
UTF-16是 變長編碼 ,也就是說每個字元的編碼長度是變化的,不是一成不變的。它的編碼演算法為:
在UTF-16中,2位元組是字元的基本表示單元,低碼點的用 2位元組 表示,高碼點的拆開後用 2個2位元組 表示。
還是拿快遞公司的例子類比,UTF-16是家提供了一種「運中等箱子」的快遞公司,中等箱子能裝下的就直接寄,裝不下的,做個標記,分兩個箱子寄,收件人需要特別注意下標記,如果沒有標記,直接就用,如果有,就把兩個箱子東西取出來拼起來後再用。
UTF-8也是 變長編碼 ,它的編碼演算法與UTF-16並無本質區別,都是對Unicode進行分段,然後加上標識碼,唯一的區別是分段更多。其演算法如下:
在UTF-8中,1位元組是字元的基本表示單元,最低的碼點( 000000-0000FF )用1位元組表示,高的碼點( 000080-10FFFF )進一步分段,分別拆開為2個、3個和4個1位元組。
可見,相比較而言,UTF-8是家只能「運小箱子」的快遞公司,少數能裝下的就用1個箱子運,不能裝下的就拿2個、3個甚至4個來運。作為收件人,會非常辛苦的進行逐一判別,基本上都是需要拆箱組裝後才能使用的(下面講到也會有特例)。
當然,UTF-8在對於拉丁語系國家或者字元為主的信息傳遞和數據處理時,效率是非常高的,因為剛才Unicode字元集節選中提到的基本拉丁語范圍剛好是 0000..007F ,在UTF-8中只要1個位元組就夠了。但是,對於中日韓(CJK,China-Japan-Korea)語系或字元為主的信息傳遞和數據處理時,效率就不那麼好了,因為剛才節選的中日韓表意文字范圍是 4E00..9FFF ,那在UTF-8中進行編解碼時必須按照上面UTF-8演算法的 第3條 進行處理,也就是要用 3個位元組 來表示(還不如UTF-16的 2位元組 ),所以國內很多中文數據較多的網站一般也不會採用UTF-8來進行編碼,但作為程序猿還是比較喜歡用這種的編碼方式。
完。
10. 什麼是變字長最佳編碼原理
哈夫曼編碼(Huffman Coding),又稱霍夫曼編碼
最佳編碼定理:在變字長碼中,對於出現概率大的信息符號編以短字長的碼;對於出現概率小的信息符號編以長字長的碼,如果碼字長度嚴格按照符號概率的大小的相反順序排列,則平均碼字長度一定小於按任何其他符號順序排列方式得到的碼字長度。
Huffman編碼步驟:
概率統計,得到n個不同概率的信號;
將n個信源信息符號的n個概率,按概率大小排序;
將最後兩個小概率相加,概率個數減為n-1;
將n-1個概率重新排序;
再將最後兩個小概率相加,概率個數減為n-2;
如此反復n-2次,得到只剩兩個概率序列;
以二進制碼元(0,1)賦值,構成Huffman碼字。