《计算机科学概论》—第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,一经查实,立即删除!

相关文章

经典技术面试指南

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

Linux 共享内存详解一

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

Storm编程模型总结

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

13_观察者模式

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

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

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

Storm集群的安装及简单使用

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

Storm的通信机制

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

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

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

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

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

Storm任务提交过程及目录树介绍

目录前言:1、Storm 任务提交的过程2、Storm相关的目录树总结: 目录 前言: 对于任何一个组件来说,了解它相关的任务提交的过程是非常有必要的(毕竟生产中遇到一些Bug时,你如果知道内部执行的过程&#xf…

《Adobe InDesign CS6中文版经典教程》—第1课1.5节修改文档的缩放比例

本节书摘来自异步社区《Adobe InDesign CS6中文版经典教程》一书中的第1课1.5节修改文档的缩放比例,作者【美】Adobe公司,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 修改文档的缩放比例Adobe InDesign CS6中文版经典教程InDesign中的控件让用户能…

大数据之Kafka入门简介

目录前言:1、Kafka是什么2、JMS是什么3、Kafka核心组件(重点)总结: 目录 前言: 作为流式计算中的一个组件,对于它的组成以及运行的原理,学习者也需要相关的了解。以下主要简单介绍了kafka是什…

oracle的安装与plsql的环境配置

1,首先得有oracle的安装包和plsql的安装包,安装包地址可见百度云 http://pan.baidu.com/s/1miTqhmg 2.解压下来进入0817账套,找到set.exe文件,双击安装即可 注意的是安装的时候有两个目录是要自己创建的,否则安装不成功…

如何在Docker容器中运行GUI程序

如何在Docker容器中运行GUI程序 各位,今天我们将学习如何在Docker之中运行GUI程序。我们可以轻易地在Docker容器中运行大多数GUI程序且不出错。Docker是一个开源项目,提供了一个打包、分发和运行任意程序的轻量级容器的开放平台。它没有语言支持、框架或…

【python】Get与Post的区别?(面试官最想听到的答案)

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出…

大数据之Kafka内部原理详细介绍

目录前言:1、Kafka整体结构2、Consumer与topic关系3、Kafka消息的分发4、Consumer的负载均衡5、kafka文件存储机制总结: 目录 前言: 本篇文章所介绍的内容还是以了解为主,主要目的还是为了对Kafka有一个更深入的理解。主要介绍…

JS与APP原生控件交互

“热更新”、“热部署”相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显得重要,不可能每次发布一个活动,都要发布一个现版本&a…

《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销

本节书摘来异步社区《脱颖而出——成功网店经营之道》一书中的第2章,第2.6节,作者: 何小健 责编: 赵轩, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 连横:返利模式的应用及分销 脱颖而出——成功网店…

大数据之Spark集群安装及简单使用

目录1、Spark集群安装1.1. 安装 2、启动Spark Shell2.1、启动spark shell2.2、在spark shell中编写WordCount程序 目录 1、Spark集群安装 1.1. 安装 1.1.1. 机器部署 准备两台以上Linux服务器,安装好JDK1.7 1.1.2. 下载Spark安装包 下载地址:ht…

大数据之Spark简介及RDD说明

目录前言:1、Spark概述1.1、什么是Spark(官网:http://spark.apache.org)1.2、为什么要学Spark1.3、Spark特点 2、RDD概述2.1、什么是RDD2.2、RDD的属性2.3、创建RDD的两种方式2.4、RDD编程API2.5、RDD的依赖关系2.6、RDD的缓存2.7…