日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《计算机科学概论》—第3章3.3节文本表示法

發(fā)布時(shí)間:2023/12/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《计算机科学概论》—第3章3.3节文本表示法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(jié)書(shū)摘來(lái)自華章出版社《計(jì)算機(jī)科學(xué)概論》一書(shū)中的第3章,第3.3節(jié)文本表示法,作者[美]內(nèi)爾·黛爾(Nell Dale)約翰·路易斯(John Lewis),更多章節(jié)內(nèi)容可以訪問(wèn)云棲社區(qū)“華章計(jì)算機(jī)”公眾號(hào)查看。

3.3 文本表示法
一個(gè)文本文檔可以被分解為段落、句子、詞和最終的單個(gè)字符。要用數(shù)字形式表示文本文檔,只需要表示每個(gè)可能出現(xiàn)的字符。文檔是連續(xù)(模擬)的實(shí)體,獨(dú)立的字符則是離散的元素,它們才是我們要表示并存儲(chǔ)在計(jì)算機(jī)內(nèi)存中的。
現(xiàn)在,我們應(yīng)該區(qū)分文本表示法的基本想法和文字處理的概念。當(dāng)用Microsoft Word這樣的字處理程序創(chuàng)建文檔時(shí),可以設(shè)置各種格式,包括字體、頁(yè)邊距、制表位、顏色等。 許多字處理程序還允許在文檔中加入自選圖形、公式和其他元素。這些額外信息與文本存儲(chǔ)在一起,以便文檔能夠正確地顯示和打印出來(lái)。但核心問(wèn)題是如何表示字符本身,因此,目前我們把重點(diǎn)放在表示字符的方法上。
要表示的字符數(shù)是有限的。一種表示字符的普通方法是列出所有字符,然后賦予每個(gè)字符一個(gè)二進(jìn)制字符串。例如,要存儲(chǔ)一個(gè)特定的字母,我們將保存它對(duì)應(yīng)的位串。
那么需要表示哪些字符呢?在英語(yǔ)中,有26個(gè)字母,但必須有區(qū)別地處理大寫(xiě)字母和小寫(xiě)字母,所以實(shí)際上有52個(gè)字母。與數(shù)字(0、1到9)一樣,各種標(biāo)點(diǎn)符號(hào)也需要表示。即使是空格,也需要有自己的表示法。那么對(duì)于非英語(yǔ)的語(yǔ)言又如何呢?一旦你考慮到這一點(diǎn),那么我們想表示的字符數(shù)就會(huì)迅速增長(zhǎng)。記住,我們?cè)诒菊碌那懊嬗懻撨^(guò),要表示的狀態(tài)數(shù)決定了需要多少位來(lái)表示一種狀態(tài)。
字符集只是字符和表示它們的代碼的清單。這些年來(lái),出現(xiàn)了多種字符集,但只有少數(shù)的幾種處于主導(dǎo)地位。在計(jì)算機(jī)制造商就關(guān)于使用哪種字符集達(dá)成一致后,文本數(shù)據(jù)的處理變得容易多了。在接下來(lái)的小節(jié)中,我們將介紹兩種字符集,即ASCII字符集和Unicode字符集。
字符集(character set):字符和表示它們的代碼的清單。

3.3.1 ASCII字符集
ASCII是美國(guó)信息交換標(biāo)準(zhǔn)代碼(American Standard Code for Information Interchange)的縮寫(xiě)。最初,ASCII字符集用7位表示每個(gè)字符,可以表示128個(gè)不同的字符。每個(gè)字節(jié)中的第八位最初被用作校驗(yàn)位,協(xié)助確保數(shù)據(jù)傳輸正確。之后,ASCII字符集進(jìn)化了,用8位表示每個(gè)字符。這個(gè)8位版本的正式名字是Latin-1擴(kuò)展ASCII字符集。該擴(kuò)展字符集可以表示256個(gè)字符,包括一些重點(diǎn)字符和幾個(gè)補(bǔ)充的特殊符號(hào)。圖3-5展示了完整的ASCII字符集。
**字符集迷宮
1960年,一篇關(guān)于ACM通信的文章報(bào)道了字符集使用的調(diào)查,描述了60個(gè)不同的字符集。僅僅IBM公司的電腦生產(chǎn)線中,就存在9個(gè)內(nèi)容和順序都不同的字符集。**[1]




這個(gè)圖表中的代碼是用十進(jìn)制數(shù)表示的,但計(jì)算機(jī)存儲(chǔ)這些代碼時(shí),將把它們轉(zhuǎn)換成相應(yīng)的二進(jìn)制數(shù)。注意,每個(gè)ASCII字符都有自己的順序,這是由存儲(chǔ)它們所用的代碼決定的。每個(gè)字符都有一個(gè)相對(duì)于其他字符的位置(在其他字符之前或之后)。這個(gè)屬性在許多方面都很有用。例如,可以利用字符代碼對(duì)一組單詞按照字母順序排序。
這個(gè)圖表中的前32個(gè)ASCII字符沒(méi)有簡(jiǎn)單的字符表示法,不能輸出到屏幕上。這些字符是為特殊用途保留的,如回車(chē)符和制表符,處理數(shù)據(jù)的程序會(huì)用特定的方式解釋它們。
3.3.2 Unicode字符集
ASCII字符集的擴(kuò)展版本提供了256個(gè)字符,雖然足夠表示英語(yǔ),但是卻無(wú)法滿足國(guó)際需要。這種局限性導(dǎo)致了Unicode字符集的出現(xiàn),這種字符集具有更強(qiáng)大的國(guó)際影響。
Unicode的創(chuàng)建者的目標(biāo)是表示世界上使用的所有語(yǔ)言中的所有字符,包括亞洲的表意符號(hào)。此外,它還表示了許多補(bǔ)充的專(zhuān)用字符,如科學(xué)符號(hào)。
現(xiàn)在,Unicode字符集被許多程序設(shè)計(jì)語(yǔ)言和計(jì)算機(jī)系統(tǒng)采用。一般情況下,每個(gè)字符的編碼都為16位,但也是十分靈活的,如果需要的話每個(gè)字符可以使用更多空間,以便表示額外的字符。Unicode字符集的一個(gè)方便之處就是它把ASCII字符集作為了一個(gè)子集。圖3-6展示了Unicode字符集中非ASCII部分的幾個(gè)字符。
為了保持一致,Unicode字符集被設(shè)計(jì)為ASCII的超集。也就是說(shuō),Unicode字符集中的前256個(gè)字符與擴(kuò)展ASCII字符集中的完全一樣,表示這些字符的代碼也一樣。因此,即使底層系統(tǒng)采用的是Unicode字符集,采用ASCII值的程序也不會(huì)受到
影響。
3.3.3 文本壓縮
字母信息(文本)是一種基本數(shù)據(jù)類(lèi)型。因此,找到存儲(chǔ)這種信息以及有效地在兩臺(tái)計(jì)算機(jī)之間傳遞它們的方法是很重要的。下面的小節(jié)將分析三種文本壓縮類(lèi)型:
  • 關(guān)鍵字編碼
  • 行程長(zhǎng)度編碼
  • 赫夫曼編碼



    在本章后面的小節(jié)中我們還會(huì)談到,這些文本壓縮方法的基本思想也適用于其他類(lèi)型的數(shù)據(jù)。
    關(guān)鍵字編碼
    想想你在英語(yǔ)中使用“the”“and”“which”“that”和“what”的頻率。如果這些單詞占用更少的空間(即用更少的字符表示),文檔就會(huì)減小。即使每個(gè)單詞節(jié)省的空間都很少,但因它們?cè)诘湫偷奈臋n中太常用,所以節(jié)省出的總空間還是很可觀的。
    一種相當(dāng)直接的文本壓縮方法是關(guān)鍵字編碼,它用單個(gè)字符代替了常用的單詞。要解壓這種文檔,需要采用壓縮的逆過(guò)程,即用相應(yīng)的完整單詞替換單個(gè)字符。
    關(guān)鍵字編碼(keyword encoding):用單個(gè)字符代替常用的單詞。
    例如,假設(shè)我們用下列圖表對(duì)幾個(gè)單詞編碼:
    單 詞 符 號(hào) 單 詞 符 號(hào)
    as ^ must &
    the ~ well %
    and + these #
    that $



    讓我們對(duì)下列段落編碼:
    The human body is composed of many independent systems, such as the circulatory system, the respiratory system, and the reproductive system. Not only must all systems work independently, but they must interact and cooperate as well. Overall health is a function of the well-being of separate systems, as well as how these separate systems work in concert.
    編碼后的段落如下:
    The human body is composed of many independent systems, such ^ ~ circulatory system, ~
    respiratory system, + ~ reproductive system. Not only & each system work independently, but they & interact + cooperate ^ %. Overall health is a function of ~ %-being of separate systems, ^ % ^ how # separate systems work in concert.
    原始段落總共有352個(gè)字符,包括空格和標(biāo)點(diǎn)。編碼后的段落包括317個(gè)字符,節(jié)省了35個(gè)字符。這個(gè)例子的壓縮率是317/352,或約為0.9。
    關(guān)鍵字編碼有幾點(diǎn)局限性。首先,用來(lái)對(duì)關(guān)鍵字編碼的字符不能出現(xiàn)在原始文本中。例如,如果原始段落中包括“$”,那么生成的編碼就會(huì)有歧義。我們不知道“$”表示的是單詞“that”還是真正的美元符號(hào)。這限制了能夠編碼的單詞數(shù)和要編碼的文本的特性。
    **昂貴的一晚
    如果你曾入住假日酒店、假日快捷酒店或者皇冠假日酒店并在2002年10月24日到10月26日之間結(jié)賬離開(kāi),那么你就很可能是被多收100倍價(jià)錢(qián)的26?000人中的一個(gè),有些地方收費(fèi)達(dá)到了每晚6500到21?000美元,小數(shù)點(diǎn)的刪除導(dǎo)致了信用卡處理的錯(cuò)誤。**
    此外,示例中的單詞“The”沒(méi)有被編碼為字符“~”,因?yàn)椤癟he”與“the”不是同一個(gè)單詞。記住,在計(jì)算機(jī)上存儲(chǔ)的字母的大寫(xiě)版本和小寫(xiě)版本是不同的字符。如果想對(duì)“The”編碼,就必須使用另一個(gè)符號(hào),或者采用更加復(fù)雜的替換模式。
    最后,不要對(duì)“a”和“I”這樣的單詞編碼,因?yàn)槟遣贿^(guò)是用一個(gè)字符替換另一個(gè)字符。單詞越長(zhǎng),每個(gè)單詞的壓縮率就越高。遺憾的是,常用的單詞通常都比較短。另一方面,有些文檔使用某些單詞比使用其他單詞頻繁,這是由文檔的主題決定的。例如,在我們的示例中,如果對(duì)單詞“system”編碼,將節(jié)省很多空間,但在通常情況下,并不值得對(duì)它編碼。
    關(guān)鍵字編碼的一種擴(kuò)展是用特殊字符替換文本中的特定模式。被編碼的模式通常不是完整的單詞,而是單詞的一部分,如通用的前綴和后綴“ex”“ing”和“tion”。這種方法的一個(gè)優(yōu)點(diǎn)是被編碼的模式通常比整個(gè)單詞出現(xiàn)的頻率更高,但缺點(diǎn)同前,即被編碼的通常是比較短的模式,對(duì)每個(gè)單詞來(lái)說(shuō),替換它們節(jié)省的空間比較少。
    行程長(zhǎng)度編碼
    在某些情況下,一個(gè)字符可能在一個(gè)長(zhǎng)序列中反復(fù)出現(xiàn)。在英語(yǔ)文本中,這種重復(fù)不常見(jiàn),但在大的數(shù)據(jù)流(如DNA序列)中,這種情況則經(jīng)常出現(xiàn)。一種名為行程長(zhǎng)度編碼的文本壓縮技術(shù)利用了這種情況。行程長(zhǎng)度編碼有時(shí)又稱(chēng)為迭代編碼。
    在行程長(zhǎng)度編碼中,重復(fù)字符的序列將被替換為標(biāo)志字符,后面加重復(fù)字符和說(shuō)明字符重復(fù)次數(shù)的數(shù)字。例如,下面的字符串由7個(gè)A構(gòu)成:
    AAAAAAA
    如果用*作為標(biāo)志字符,這個(gè)字符串可以被編碼為:
    *A7
    行程長(zhǎng)度編碼(run-length encoding):把一系列重復(fù)字符替換為它們重復(fù)出現(xiàn)的次數(shù)。
    標(biāo)志字符說(shuō)明這三個(gè)字符的序列應(yīng)該被解碼為相應(yīng)的重復(fù)字符串,其他文本則按照常規(guī)處理。因此,下面的編碼字符串
    n5x9ccch6 some other text k8eee
    將被解碼為如下的原始文本:
    nnnnnxxxxxxxxxccchhhhhh some other text kkkkkkkkeee
    原始文本包括51個(gè)字符,編碼串包括35個(gè)字符,所以這個(gè)示例的壓縮率為35/51,或約為0.68。
    注意,這個(gè)例子中有三個(gè)重復(fù)的c和三個(gè)重復(fù)的e都沒(méi)有編碼。因?yàn)樾枰萌齻€(gè)字符對(duì)這樣的重復(fù)序列編碼,所以對(duì)長(zhǎng)度為2或3的字符串進(jìn)行編碼是不值得的。事實(shí)上,如果對(duì)長(zhǎng)度為2的重復(fù)字符串編碼,反而會(huì)使結(jié)果串更長(zhǎng)。
    因?yàn)槲覀冇靡粋€(gè)字符記錄重復(fù)的次數(shù),所以看來(lái)不能對(duì)重復(fù)次數(shù)大于9的序列編碼。但是,在某些字符集中,一個(gè)字符是由多個(gè)位表示的。例如,字符“5”在ASCII字符集中表示為53,這是一個(gè)八位的二進(jìn)制字符串00110101。因此,我們將次數(shù)字符解釋為一個(gè)二進(jìn)制數(shù),而不是解釋為一個(gè)ASCII數(shù)字。這樣一來(lái),能夠編碼的重復(fù)字符的重復(fù)次數(shù)可以是0到255的任何數(shù),甚至可以是4到259的任何數(shù),因?yàn)殚L(zhǎng)度為2或3的序列不會(huì)被
    編碼。
    赫夫曼編碼
    另一種文本壓縮技術(shù)是赫夫曼編碼,以它的創(chuàng)建者David Huffman博士的名字命名。文本中很少使用字母“X”,那么為什么要讓它占用的位數(shù)與常用空格字符一樣呢?赫夫曼編碼使用不同長(zhǎng)度的位串表示每個(gè)字符,從而解決了這個(gè)問(wèn)題。也就是說(shuō),一些字符由5位編碼表示,一些字符由6位編碼表示,還有一些字符由7位編碼表示,等等。這種方法與字符集的概念相反,在字符集中,每個(gè)字符都由定長(zhǎng)(如8位或16位)的位串表示。
    這種方法的基本思想是用較少的位表示經(jīng)常出現(xiàn)的字符,而將較長(zhǎng)的位串留給不經(jīng)常出現(xiàn)的字符,這樣表示的文檔的整體大小將比較小。
    赫夫曼編碼(Huffman encoding):用變長(zhǎng)的二進(jìn)制串表示字符,使常用的字符具有較短的編碼。
    例如,假設(shè)用下列赫夫曼編碼來(lái)表示一些字符:



    那么單詞DOORBELL的二進(jìn)制編碼如下:
    1011110110111101001100100
    如果使用定長(zhǎng)位串(如8位)表示每個(gè)字符,那么原始字符串的二進(jìn)制形式應(yīng)該是8個(gè)字符×8位= 64位。而這個(gè)字符串的赫夫曼編碼的長(zhǎng)度是25位,從而壓縮率為25/64,或約為0.39。
    那么解碼過(guò)程是怎樣的呢?在使用字符集時(shí),只要把二進(jìn)制串分割成8位或16位的片段,然后查看每個(gè)片段表示的字符即可。在赫夫曼編碼中,由于編碼是變長(zhǎng)的,我們不知道每個(gè)字符對(duì)應(yīng)多少位編碼,所以看似很難將一個(gè)字符串解碼。其實(shí),創(chuàng)建編碼的方式已經(jīng)消除了這種潛在的困惑。
    赫夫曼編碼的一個(gè)重要特征是用于表示一個(gè)字符的位串不會(huì)是表示另一個(gè)字符的位串的前綴。因此,在從左到右掃描一個(gè)位串時(shí),每當(dāng)發(fā)現(xiàn)一個(gè)位串對(duì)應(yīng)于一個(gè)字符,那么這個(gè)位串就一定表示這個(gè)字符,該位串不可能是更長(zhǎng)位串的前綴。
    例如,如果下列位串是用上面的表創(chuàng)建的:
    1010110001111011
    那么它只會(huì)被解碼為單詞BOARD,沒(méi)有其他的可能性。
    那么,赫夫曼編碼是如何創(chuàng)建的呢?雖然創(chuàng)建赫夫曼編碼的詳細(xì)過(guò)程不屬于本書(shū)的介紹范圍,但是我們可以討論一下要點(diǎn)。由于赫夫曼編碼用最短的位串表示最常用的字符,所以首先需要列出要編碼的字符的出現(xiàn)頻率。出現(xiàn)頻率可以是字符在某個(gè)特定文檔中出現(xiàn)的次數(shù)(如352個(gè)E、248個(gè)S等),也可以是字符在來(lái)自特定領(lǐng)域的示例文本中出現(xiàn)的次數(shù)。頻率表則列出了字母在一種特定語(yǔ)言(如英語(yǔ))中出現(xiàn)的頻率。使用這些頻率,可以構(gòu)建一種二進(jìn)制代碼的結(jié)構(gòu)。創(chuàng)建這種結(jié)構(gòu)的方法確保了最常用的字符對(duì)應(yīng)于最短的位串。

總結(jié)

以上是生活随笔為你收集整理的《计算机科学概论》—第3章3.3节文本表示法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。