算法分析与实践-作业13-读书笔记

《算法竞赛进阶指南》读书笔记
在学习了算法设计与分析基础这门课后,我还翻阅了《算法竞赛进阶指南》这本书,这本书根据CCF-NOI信息学奥利匹克竞赛涉及的知识体系进行编写,对计算机程序设计的基本技能——数据结构与算法进行了深入的讲解。
我觉得通过这本书,我了解到的东西还是比较丰富的。比如字典树的概念,在初学程序设计语言的时候,字符串的基本操作最令我头疼。而字典树是一种用于实现字符串快速检索的多叉树结构。下面我们来讨论一下Trie(字典树)的基本操作过程。
初始化:一颗棵空树仅包含一个根节点,该点的字符指针均指向空。
插入:当需要插入一个字符串S时,我们令一个指针P起初指向根节点。然后,依次扫描S中的每个字符c:

  1. 若P的c字符指针指向一个已经存在的节点Q,则令P=Q。
  2. 若P的c字符指针指向空,则新建一个节点Q,令P的c字符指针指向Q,然后令P=Q。
    当S中的字符扫描完毕时,在当前节点P上标记它是一个字符串的末尾。
    检索:当需要检索一个字符串S在Trie中是否存在时,
    我们令一个指针P起始指向根节点,然后依次扫描S中的每个字符c:
  3. 若P的c字符指针指向空,则说明S没有被插入过Trie,结束检索。
  4. 若P的c字符指向一个已经存在的节点Q,则令P=Q。
    当S中的字符扫描完毕时,若当前节点P被标记为一个字符串的末尾,则说明S在Trie中存在,否则说明S没有被插入过Trie。
    这里有一个例子
    在这里插入图片描述
    在这个例子中,需要插入和检索的字符串都由小写字母构成,所以Trie的每个节点具有26个字符指针,分别为a到z。上图展示了在一棵空Trie中依次插入“cab”“cos”“car”“cat”“cate”和”rain”后的Trie的形态,灰色标记了单词的末尾节点。可以看出在Trie中,字符数据都体现在数的边(指针)上,树的节点仅保存一些额外信息,例如单词结尾标记等。其空间复杂度为O(NC),其中N是节点个数,C是字符集的大小。
    利用字典树的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率更高。除此之外,我还接触到例如“剪枝”“迭代加深”等在课上没有接触到的内容,收获颇丰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值