日期: 2022-09-20 15:11:05 浏览数:10

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
承德微信公众号开发【承德网络推广】承德建站、承德网站维护、承德网页制作、承德微信小程序代运营公司
承德,河北省地级市,河北省政府批复确定的河北国际旅游城市、连接京津辽蒙的区域性中心城市 [1] 。截至2019年,全市下辖3个区、4个县、代管1个县级市和3个自治县,总面积39519平方公里,常住人口347.32万人,城镇人口180.85万人,城镇化率52.07%。 [2]
承德地处中国东北地区、河北省东北部,南邻京津,北接赤峰和锡林郭勒,东西与朝阳、秦皇岛、唐山、张家口相邻,距省会石家庄435公里,距北京225公里。 [3] 是连接京津冀辽蒙的重要节点,具有“一市连五省”的独特区位优势,是国家甲类开放城市,中国普通话标准音采集地、中国摄影之乡、中国剪纸之乡。 [4]
承德是首批国家历史文化名城,1703年清康熙修建避暑山庄,成为清王朝的第二个政治中心;1723年设热河厅;1733年雍正取“承受先祖德泽”之义;赐字“皇承天德”释义先皇秉承天地化育万物的恩德; [5] 设承德直隶州,始称“承德”;民国和解放初期为原热河省省会;1955年,热河省建制撤销,承德划归河北省,为省辖市。承德的避暑山庄及其周围寺庙是中国十大风景名胜、旅游胜地四十佳、国家重点风景名胜区,被联合国教科文组织批准为世界文化遗产,也是国家首批世界文化遗产。 [4]
2012年,承德被评为中国“十大特色休闲城市”。2016年11月,承德市被中华人民共和国国家旅游局评为第二批国家全域旅游示范区。2017年10月,承德市入选国家森林城市。 [6] 2017年12月,获得“厕所革命优秀城市奖”。
表示树的最简单方式之一就是为每个节点使用一个由表示节点标号的字段组成的结构体,后面再跟上指向该节点子节点的指针组成的数组。图5-6就表示了这样的结构。常量bf 是该指针数组的大小,它表示节点可以具有的最大子节点数,这个量就是分支系数(branching factor)。某节点对应数组的第i 个位置含有指向该节点第i 个子节点的指针,不存在的子节点可用NULL指针表示。

图 5-6 用指针数组表示的节点
在C语言中,该数据结构可以用如下类型声明来表示。
typedef struct NODE *pNODE;struct NODE {
int info;
pNODE children[BF];};复制代码在这里,字段info表示构成节点标号的信息,而BF则表示分支系数的常量。在本章中我们还将看到该声明的多个变种。
在这种表示树的数据结构和多数表示树的数据结构中,都将树表示为指向根节点的指针。因此,pNODE还是树的类型。其实,可以在pNODE的位置使用类型TREE,而且在5.6节开始介绍二叉树时,我们将采纳这一约定。不过,现在还是要使用pNODE这个名称代表“指向节点的指针”类型,因为在某些数据结构中,指向节点的指针除了表示树之外还用于其他用途。
指针数组表示使我们能在O(1)的时间内访问任意节点的第i 个子节点。然而,当树中只有少量节点有很多子节点时,这种表示会非常浪费空间。在这种情况下,数组中的多数指针都是NULL。
试着记住trie
术语trie(单词查找树)来源于单词retrieval(检索)的中间部分。它本来被人们读作tree,好在现在常见读法已经将其读为发音有区别的try了。
树可以用来表示一系列单词,其表示方式可以使检查给定字符序列是否为存在的单词变得非常有效率。在这类称为单词查找树的树中,除了根节点之外,每个节点都有与之相关联的字母。由某个节点n 表示的字符串,就是从根节点到n 的路径上的字母序列。给定一组单词,单词查找树的节点就是那些表示该集合中某个单词的前缀的字符串。节点的标号是由表示该节点的字母,以及表明从根节点到该节点的字母串能否构成完整单词的布尔值组成的。如果能,就用布尔值1表示,如果不能,就用0表示。1
1在5.2节中,介绍过的标号都只有一个值。不过,值可以是任意类型的,而且标号可以是由两个或多个字段组成的结构体。在本例中,标号有一个字段是个字母,而第二个字段则是一个值要么为0要么为1的整数。
例如,假设我们的“字典”是由4个单词he、hers、his和she组成的。这些单词的单词查找树如图5-7所示。要确定单词he是否在集合中,可以从根节点n1开始,移动到标号为h的子节点n2,再从节点n2移动到标号为e的子节点n4。因为这些节点都出现在树中,而且n4的标号中还有1,所以可以得出he在该集合中的结论。

图 5-7 单词he、hers、his和she的单词查找树
再举一个例子,假设想要确定him是否在该集合中。可以从根节点开始沿着路径移动到n2,再移动到n5,这是表示前缀hi的。不过在节点n5处找不到对应字母m的子节点。所以可以得出him不在该集合中的结论。最后,如果查找单词her,那么可以找出从根节点到节点n7的路径。该节点存在,但标号不含1。因此可以得出her不在该集合中的结论,虽然以它为真前缀的单词hers在该集合中。
单词查找树中众节点的分支系数就等于构成这些单词的字母表中不同字符的数目。例如,如果不区分大小写字母,而且单词中不含撇号这样的特殊字符,那么分支系数就等于26。包含两个标号字段的节点的类型可以按照图5-8中所示的方式定义。在数组children中,可以假设字母a是用下标0表示的,而下标1表示字母b,以此类推。
typedef struct NODE *pNODE;struct NODE {
char letter;
int isWord;
pNODE children[BF];};复制代码图 5-8 字母单词查找树的定义
图5-7中抽象形式的单词查找树可以用图5-9所示的数据结构表示。通过展示前两个字段letter和isWord,以及数组children中那些具有非NULL指针的元素,从而表示节点。在children数组中,对每个非NULL的元素,标记该数组的字母是由指向子节点的指针上方的项表示的,不过该字母实际上没有出现在该结构中。请注意,根节点的letter字段是无关紧要的。

图 5-9 图5-7中所示单词查找树的数据结构
使用指针数组表示节点的空间利用率可能很低,因为通常情况下,绝大多数指针都会是NULL。图5-9显然就是这种情况,其中没有哪个节点有两个以上非NULL指针。事实上,如果想想这种情况,就会发现,在任何基于26个字母的字母表的单词查找树中,指针的数量都会是表示节点的指针的数量的26倍。因为没有哪个节点会有两个父节点,而且根节点是没有父节点的,所以N个节点中只有N-1个非NULL的指针,也就是说,每26个指针中只有不到1个是有用的。
要克服树的指针数组表示空间利用率低的问题,方法之一就是使用链表来表示节点的子节点。节点对应链表所占据的空间是与该节点子节点的数量成正比的。不过,这种表示方式在时间上要付出代价,访问第i 个子节点所需时间为O(i ),因为在到达第i 个节点之前必须遍历长度为i-1的链表。与之相比,使用指针数组表示子节点的话,就可以在O(1)时间内到达第i 个子节点,跟i 完全没有关系。
在树的这种最左子节点右兄弟节点(leftmost-child-right-sibling)表示中,要为每个节点放入一个指向其最左子节点的指针,而节点没有指向它其他子节点的指针。要找到节点n 的第二个及后续的子节点,可以为这些节点创建一个链表,其中每个子节点c 都指向n 的子节点中紧挨在c 右侧的那个,该节点称为c 的右兄弟节点。
承德微信公众号开发【承德网络推广】承德建站、承德网站维护、承德网页制作、承德微信小程序代运营公司
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)