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

本节书摘来自华章出版社《计算机科学概论》一书中的第3章,第3.3节文本表示法,作者[美]内尔·黛尔(Nell Dale)约翰·路易斯(John Lewis),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 文本表示法
一个文本文档可以被分解为段落、句子、词和最终的单个字符。要用数字形式表示文本文档,只需要表示每个可能出现的字符。文档是连续(模拟)的实体,独立的字符则是离散的元素,它们才是我们要表示并存储在计算机内存中的。
现在,我们应该区分文本表示法的基本想法和文字处理的概念。当用Microsoft Word这样的字处理程序创建文档时,可以设置各种格式,包括字体、页边距、制表位、颜色等。 许多字处理程序还允许在文档中加入自选图形、公式和其他元素。这些额外信息与文本存储在一起,以便文档能够正确地显示和打印出来。但核心问题是如何表示字符本身,因此,目前我们把重点放在表示字符的方法上。
要表示的字符数是有限的。一种表示字符的普通方法是列出所有字符,然后赋予每个字符一个二进制字符串。例如,要存储一个特定的字母,我们将保存它对应的位串。
那么需要表示哪些字符呢?在英语中,有26个字母,但必须有区别地处理大写字母和小写字母,所以实际上有52个字母。与数字(0、1到9)一样,各种标点符号也需要表示。即使是空格,也需要有自己的表示法。那么对于非英语的语言又如何呢?一旦你考虑到这一点,那么我们想表示的字符数就会迅速增长。记住,我们在本章的前面讨论过,要表示的状态数决定了需要多少位来表示一种状态。
字符集只是字符和表示它们的代码的清单。这些年来,出现了多种字符集,但只有少数的几种处于主导地位。在计算机制造商就关于使用哪种字符集达成一致后,文本数据的处理变得容易多了。在接下来的小节中,我们将介绍两种字符集,即ASCII字符集和Unicode字符集。
字符集(character set):字符和表示它们的代码的清单。

3.3.1 ASCII字符集
ASCII是美国信息交换标准代码(American Standard Code for Information Interchange)的缩写。最初,ASCII字符集用7位表示每个字符,可以表示128个不同的字符。每个字节中的第八位最初被用作校验位,协助确保数据传输正确。之后,ASCII字符集进化了,用8位表示每个字符。这个8位版本的正式名字是Latin-1扩展ASCII字符集。该扩展字符集可以表示256个字符,包括一些重点字符和几个补充的特殊符号。图3-5展示了完整的ASCII字符集。
**字符集迷宫
1960年,一篇关于ACM通信的文章报道了字符集使用的调查,描述了60个不同的字符集。仅仅IBM公司的电脑生产线中,就存在9个内容和顺序都不同的字符集。**[1]


d7c1a0d8a928d3e86229538db26c7af9ffe9b519

这个图表中的代码是用十进制数表示的,但计算机存储这些代码时,将把它们转换成相应的二进制数。注意,每个ASCII字符都有自己的顺序,这是由存储它们所用的代码决定的。每个字符都有一个相对于其他字符的位置(在其他字符之前或之后)。这个属性在许多方面都很有用。例如,可以利用字符代码对一组单词按照字母顺序排序。
这个图表中的前32个ASCII字符没有简单的字符表示法,不能输出到屏幕上。这些字符是为特殊用途保留的,如回车符和制表符,处理数据的程序会用特定的方式解释它们。
3.3.2 Unicode字符集
ASCII字符集的扩展版本提供了256个字符,虽然足够表示英语,但是却无法满足国际需要。这种局限性导致了Unicode字符集的出现,这种字符集具有更强大的国际影响。
Unicode的创建者的目标是表示世界上使用的所有语言中的所有字符,包括亚洲的表意符号。此外,它还表示了许多补充的专用字符,如科学符号。
现在,Unicode字符集被许多程序设计语言和计算机系统采用。一般情况下,每个字符的编码都为16位,但也是十分灵活的,如果需要的话每个字符可以使用更多空间,以便表示额外的字符。Unicode字符集的一个方便之处就是它把ASCII字符集作为了一个子集。图3-6展示了Unicode字符集中非ASCII部分的几个字符。
为了保持一致,Unicode字符集被设计为ASCII的超集。也就是说,Unicode字符集中的前256个字符与扩展ASCII字符集中的完全一样,表示这些字符的代码也一样。因此,即使底层系统采用的是Unicode字符集,采用ASCII值的程序也不会受到
影响。
3.3.3 文本压缩
字母信息(文本)是一种基本数据类型。因此,找到存储这种信息以及有效地在两台计算机之间传递它们的方法是很重要的。下面的小节将分析三种文本压缩类型:
  • 关键字编码
  • 行程长度编码
  • 赫夫曼编码

    b83fdd20aa86cd5673323141b95d92ffd397ed89


    在本章后面的小节中我们还会谈到,这些文本压缩方法的基本思想也适用于其他类型的数据。
    关键字编码
    想想你在英语中使用“the”“and”“which”“that”和“what”的频率。如果这些单词占用更少的空间(即用更少的字符表示),文档就会减小。即使每个单词节省的空间都很少,但因它们在典型的文档中太常用,所以节省出的总空间还是很可观的。
    一种相当直接的文本压缩方法是关键字编码,它用单个字符代替了常用的单词。要解压这种文档,需要采用压缩的逆过程,即用相应的完整单词替换单个字符。
    关键字编码(keyword encoding):用单个字符代替常用的单词。
    例如,假设我们用下列图表对几个单词编码:
    单 词 符 号 单 词 符 号
    as ^ must &
    the ~ well %
    and + these #
    that $

    53e8e06eb59523a94e72728baa499c1bef945d32

    让我们对下列段落编码:
    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个字符,包括空格和标点。编码后的段落包括317个字符,节省了35个字符。这个例子的压缩率是317/352,或约为0.9。
    关键字编码有几点局限性。首先,用来对关键字编码的字符不能出现在原始文本中。例如,如果原始段落中包括“$”,那么生成的编码就会有歧义。我们不知道“$”表示的是单词“that”还是真正的美元符号。这限制了能够编码的单词数和要编码的文本的特性。
    **昂贵的一晚
    如果你曾入住假日酒店、假日快捷酒店或者皇冠假日酒店并在2002年10月24日到10月26日之间结账离开,那么你就很可能是被多收100倍价钱的26?000人中的一个,有些地方收费达到了每晚6500到21?000美元,小数点的删除导致了信用卡处理的错误。**
    此外,示例中的单词“The”没有被编码为字符“~”,因为“The”与“the”不是同一个单词。记住,在计算机上存储的字母的大写版本和小写版本是不同的字符。如果想对“The”编码,就必须使用另一个符号,或者采用更加复杂的替换模式。
    最后,不要对“a”和“I”这样的单词编码,因为那不过是用一个字符替换另一个字符。单词越长,每个单词的压缩率就越高。遗憾的是,常用的单词通常都比较短。另一方面,有些文档使用某些单词比使用其他单词频繁,这是由文档的主题决定的。例如,在我们的示例中,如果对单词“system”编码,将节省很多空间,但在通常情况下,并不值得对它编码。
    关键字编码的一种扩展是用特殊字符替换文本中的特定模式。被编码的模式通常不是完整的单词,而是单词的一部分,如通用的前缀和后缀“ex”“ing”和“tion”。这种方法的一个优点是被编码的模式通常比整个单词出现的频率更高,但缺点同前,即被编码的通常是比较短的模式,对每个单词来说,替换它们节省的空间比较少。
    行程长度编码
    在某些情况下,一个字符可能在一个长序列中反复出现。在英语文本中,这种重复不常见,但在大的数据流(如DNA序列)中,这种情况则经常出现。一种名为行程长度编码的文本压缩技术利用了这种情况。行程长度编码有时又称为迭代编码。
    在行程长度编码中,重复字符的序列将被替换为标志字符,后面加重复字符和说明字符重复次数的数字。例如,下面的字符串由7个A构成:
    AAAAAAA
    如果用*作为标志字符,这个字符串可以被编码为:
    *A7
    行程长度编码(run-length encoding):把一系列重复字符替换为它们重复出现的次数。
    标志字符说明这三个字符的序列应该被解码为相应的重复字符串,其他文本则按照常规处理。因此,下面的编码字符串
    n5x9ccch6 some other text k8eee
    将被解码为如下的原始文本:
    nnnnnxxxxxxxxxccchhhhhh some other text kkkkkkkkeee
    原始文本包括51个字符,编码串包括35个字符,所以这个示例的压缩率为35/51,或约为0.68。
    注意,这个例子中有三个重复的c和三个重复的e都没有编码。因为需要用三个字符对这样的重复序列编码,所以对长度为2或3的字符串进行编码是不值得的。事实上,如果对长度为2的重复字符串编码,反而会使结果串更长。
    因为我们用一个字符记录重复的次数,所以看来不能对重复次数大于9的序列编码。但是,在某些字符集中,一个字符是由多个位表示的。例如,字符“5”在ASCII字符集中表示为53,这是一个八位的二进制字符串00110101。因此,我们将次数字符解释为一个二进制数,而不是解释为一个ASCII数字。这样一来,能够编码的重复字符的重复次数可以是0到255的任何数,甚至可以是4到259的任何数,因为长度为2或3的序列不会被
    编码。
    赫夫曼编码
    另一种文本压缩技术是赫夫曼编码,以它的创建者David Huffman博士的名字命名。文本中很少使用字母“X”,那么为什么要让它占用的位数与常用空格字符一样呢?赫夫曼编码使用不同长度的位串表示每个字符,从而解决了这个问题。也就是说,一些字符由5位编码表示,一些字符由6位编码表示,还有一些字符由7位编码表示,等等。这种方法与字符集的概念相反,在字符集中,每个字符都由定长(如8位或16位)的位串表示。
    这种方法的基本思想是用较少的位表示经常出现的字符,而将较长的位串留给不经常出现的字符,这样表示的文档的整体大小将比较小。
    赫夫曼编码(Huffman encoding):用变长的二进制串表示字符,使常用的字符具有较短的编码。
    例如,假设用下列赫夫曼编码来表示一些字符:

    be7dcff6ed9b61f00d7b7d7250dea3b2144c6338

    那么单词DOORBELL的二进制编码如下:
    1011110110111101001100100
    如果使用定长位串(如8位)表示每个字符,那么原始字符串的二进制形式应该是8个字符×8位= 64位。而这个字符串的赫夫曼编码的长度是25位,从而压缩率为25/64,或约为0.39。
    那么解码过程是怎样的呢?在使用字符集时,只要把二进制串分割成8位或16位的片段,然后查看每个片段表示的字符即可。在赫夫曼编码中,由于编码是变长的,我们不知道每个字符对应多少位编码,所以看似很难将一个字符串解码。其实,创建编码的方式已经消除了这种潜在的困惑。
    赫夫曼编码的一个重要特征是用于表示一个字符的位串不会是表示另一个字符的位串的前缀。因此,在从左到右扫描一个位串时,每当发现一个位串对应于一个字符,那么这个位串就一定表示这个字符,该位串不可能是更长位串的前缀。
    例如,如果下列位串是用上面的表创建的:
    1010110001111011
    那么它只会被解码为单词BOARD,没有其他的可能性。
    那么,赫夫曼编码是如何创建的呢?虽然创建赫夫曼编码的详细过程不属于本书的介绍范围,但是我们可以讨论一下要点。由于赫夫曼编码用最短的位串表示最常用的字符,所以首先需要列出要编码的字符的出现频率。出现频率可以是字符在某个特定文档中出现的次数(如352个E、248个S等),也可以是字符在来自特定领域的示例文本中出现的次数。频率表则列出了字母在一种特定语言(如英语)中出现的频率。使用这些频率,可以构建一种二进制代码的结构。创建这种结构的方法确保了最常用的字符对应于最短的位串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

习题

# -*- coding: utf-8 -*- # Time : 2019/08/08 17:38 # Author : Liu # File : zuoye.py# 一、 # 将此功能定义成一个函数, # 电脑随机生成1~100随机数,用户输入一个数字,电脑提示用户大或者小,猜错,继续提示&a…

经典技术面试指南

目录计算机基础知识数据结构算法操作系统计算机网络数据库海量数据处理C语言基础Java基础Java高级Java Web设计模式知识的综合能力工具使用项目相关技术热情表达能力思考方式其他推荐阅读 目录 最近看到一份不错的面试总结,也是每位程序猿都应该掌握的基础&#x…

Linux 共享内存详解一

共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除。只有当所有进程都调用shmdt,这个临时…

python 魔术方法

python 魔术方法 常用魔术方法 魔术方法就是一个类的特殊方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法由系统自动调用。 1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发&#xf…

Storm ack和fail机制再论

之前对这个的理解有些问题,今天用到有仔细梳理了一遍,记录一下 首先开启storm tracker机制的前提是, 1. 在spout emit tuple的时候,要加上第3个参数messageid 2. 在配置中acker数目至少为1 3. 在bolt emit的时候,要加…

Storm编程模型总结

目录前言:1、Storm编程模型2、对应的的WordCount案例总结: 目录 前言: 对于Storm的编程模型有必要做一个详细的介绍(配合WC案例来介绍) 1、Storm编程模型 上图中组件的解释: DataSource:外…

13_观察者模式

【观察者模式】 也叫作发布/订阅模式,使用较为频繁。 定义了对象间一种一对多的依赖关系,当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新。 观察者模式由以下几个角色组成: * Subject 被观察者 定义被观察者…

【python】内建异常类的层次

内建异常类的层次 BaseException-- SystemExit-- KeyboardInterrupt-- GeneratorExit-- Exception-- StopIteration-- StopAsyncIteration-- ArithmeticError| -- FloatingPointError| -- OverflowError| -- ZeroDivisionError-- AssertionError-- AttributeError-- …

《黑客秘笈——渗透测试实用指南》—第2章2.3节 外部或内部的主动式信息收集...

本节书摘来自异步社区《黑客秘笈——渗透测试实用指南》一书中的第2章2.3节 外部或内部的主动式信息收集,作者【美】Peter Kim(彼得 基姆),更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.3 外部或内部的主动式信息收集黑客秘笈——…

Storm集群的安装及简单使用

目录前言:1、集群部署的基本流程2、Storm常用操作命令(了解)3、Storm集群的进程及日志熟悉(知道对应的日志的位置出了问题知道去哪找原因)4、Storm源码目录分析(重要)总结: 目录 前…

【python】错误、异常和文件---复习笔记

错误、异常和文件 1. 异常处理 错误指的是代码有语法问题,无法解释运行,必须改正后才能运行 如果代码没有语法问题,可以运行,但会出运行时的错误,例如除零错误,下标越界等问题,这种在运行期间…

关于使用百度ueditor时的一些问题

本来这些问题直接在百度贴吧里回答不就完事了,可是好死不死的,百度贴吧里老出现 未知错误&#xff0c;错误号&#xff1a;230274 看来还是算了,自己做一个随笔记录一下好了 关于我们获取里面的内容时,老是会有一个<p>来包着,而且还老是多出来一个<br/> 这边是这么处…

Storm的通信机制

目录前言&#xff1a;1、Worker进程间通信原理2、Worker进程间技术(Netty、ZeroMQ)3、Worker 内部通信技术(Disruptor)总结&#xff1a; 目录 前言&#xff1a; 这篇文章&#xff0c;博客主要介绍下Storm中Worker进程间和进程内部通信的原理和技术。整篇内容仅供了解&#x…

《Windows PowerShell实战指南(第2版)》——1.4 搭建自己的实验环境

本节书摘来自异步社区《Windows PowerShell实战指南&#xff08;第2版&#xff09;》一书中的第1章&#xff0c;第1.4节&#xff0c;作者&#xff1a;【美】Don Jones&#xff08;道琼斯&#xff09; , Jeffery Hicks&#xff08;杰弗瑞希克斯&#xff09;著&#xff0c;更多章…

已解决]求问not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9为什么不等于0呢???

not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9 ----> (not 1&#xff09;)or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9) ----> 0 or 0 or 4 or 6 or 9 ----> 0 or 4 or 6 or 9 ----> 4 or 6 or 9 4

C#外围工具资源

1、MATH.NET数学库:可以用于 矩阵计算方程求根插值拟合。。。2、转载于:https://www.cnblogs.com/liq07lzucn/p/6227443.html

Storm程序的并发机制原理总结

文章目录目录前言&#xff1a;1、概念2、配置并行度总结&#xff1a;目录 前言&#xff1a; 为了在以后的实践中提高Storm程序执行的效率&#xff0c;我们还是有必要了解下对应的Storm程序的并发机制。&#xff08;哈哈&#xff0c;虽然以博主小菜鸟的水平还没有接触到这种提…

《无线网络:理解和应对互联网环境下网络互连所带来的挑战》——第2章 无线生态系统 2.1无线标准化过程...

本节书摘来自华章出版社《无线网络&#xff1a;理解和应对互联网环境下网络互连所带来的挑战》一书中的第2章&#xff0c;第2.1节&#xff0c;作者&#xff1a;&#xff08;美&#xff09;杰克L.伯班克&#xff08;Jack L. Burbank&#xff09;等著&#xff0c;更多章节内容可以…

Flask模板01

模板 在前面的示例中&#xff0c;视图函数的主要作用是生成请求的响应&#xff0c;这是最简单的请求。实际上&#xff0c;视图函数有两个作用&#xff1a;处理业务逻辑和返回响应内容。在大型应用中&#xff0c;把业务逻辑和表现内容放在一起&#xff0c;会增加代码的复杂度和…

★数学上最大的数是多少?

数学上最大的数是多少&#xff1f; 怪罗科普 收藏(282)| 阅读(117678)人类已经使用数长达千年之久。普遍认为&#xff0c;数的概念最先源于史前人类开始使用手指进行计数。这最终演变成符号语言&#xff0c;然后在沙子、墙壁和木头等物体上作标记。 我们已经向前发展了一大步&…