目录
- 1.本周学习总结
- 1.1思维导图
- 1.2谈谈你对查找运算的认识及学习体会
- 2.PTA实验作业
- 2.1.题目1:6-3 二叉搜索树中的最近公共祖先
- 2.1.1设计思路
- 2.1.2代码截图
- 2.1.3本题PTA提交列表说明
- 2.2.题目2:6-2 是否二叉搜索树
- 2.2.1设计思路
- 2.2.2代码截图
- 2.2.3本题PTA提交列表说明
- 2.3.题目3:7-2 航空公司VIP客户查询
- 2.3.1设计思路
- 2.3.2代码截图
- 2.3.3本题PTA提交列表说明
- 2.1.题目1:6-3 二叉搜索树中的最近公共祖先
- 3.阅读代码
- 3.1 题目
- 3.2 解题思路
- 3.3 代码截图
- 3.4 学习体会
1.本周学习总结
1.1思维导图
1.2谈谈你对查找运算的认识及学习体会
查找是我们日常生活中经常要用到的,搜索引擎就是一个非常好的例子,如果搜索速度不够快,那么当用户模糊搜索时,可能就会面临一个惨无人道的体验。之前大一上用的基本上都是顺序搜索,很显然这一种搜索算法的速度已经不能满足我们的需要了,这就有必要去深入研究查找数据的方法,减少等待时间。也是经历了这一个章节我们才了解到树的强大之处,不断减小搜索区间,使得原本浩大的工程变得容易。而哈希表则以空间换取时间,使得零等待变成可能。这些都是非常强大的算法,值得为我们去学习和使用。
2.PTA实验作业
2.1.题目1:6-3 二叉搜索树中的最近公共祖先
Description:
在一棵树T中两个结点u和v的最近公共祖先(LCA),是树中以u和v为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。函数LCA须返回树T中两个结点u和v的最近公共祖先结点的键值。若u或v不在树中,则应返回ERROR。
Input:
Output:
LCA = 6
2.1.1设计思路
对于这道题目,要抓住两个点,一个是最近的祖先节点满足的条件,对于最近的祖先节点来说,u和v必定在这个节点的两侧。还有一个要注意的是u和v必须存在于这个查找树里面,这个过程可以只做一次,因此我们可以利用static的特性,让某一代码片段在函数中只执行一次。这个代码片段就是我们确认uv存在的代码。然后就是对树的遍历,如果uv都小于当前节点,说明我们要找的祖先节点在左树,反之在右树。
static int flag = 0
if flag == 0:
在T中查找u,v
if 不存在:
返回ERROR
flag=1
int Max=max(u,v)
int Min=min(u,v)
if Min < T->data < max:
找到了
else if Min,Max < T->data:
在左子树中继续查找
else if Min,Max > T->data:
在右子树中继续查找
2.1.2代码截图
2.1.3本题PTA提交列表说明
这一个错误是因为我忘了考虑最近祖先就是uv其中一个的情况,只要将判断uv是否在两侧的开区间改为闭区间就好啦
2.2.题目2:6-2 是否二叉搜索树
Description:
本题要求实现函数,判断给定二叉树是否二叉搜索树。
函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树:
定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质:
非空左子树的所有键值小于其根结点的键值。
非空右子树的所有键值大于其根结点的键值。
左、右子树都是二叉搜索树。
如果T是二叉搜索树,则函数返回true,否则返回false。
Input:
Output:
Yes
2.2.1设计思路
思路一:
第一个方法要抓住二叉搜索树的特点,中序遍历为递增序列,设立一个static变量记录上一个节点,毕竟是函数题。然后在中间的时候判断一下是否大于上一个节点。这样就可以达到判断二叉搜索树的目的了
//中序遍历其实也不用贴伪代码了,大家都明白,代码过于简单导致伪代码都像是复制过来的一样
static int last = -111111
IsBST(T->left)
if last < T->data: last = T->data
else: return false
IsBST(T->left)
思路二:
第二种思路较为逊色,同样抓住二叉搜索树的特点,左子树的最大值小于根节点,右子树的最小值大于根节点,这样子将每一个节点都判断一遍就能知道对不对了,这种方法的时间复杂度较高,因为同一个节点可能要访问多次,而第一种方法每个节点只要访问一次就好了
if 左子树存在:
left=左子树最大
if left > T->data: 返回false
if 右子树存在:
right=右子树最小
if right < T->fata: 返回false
return IsBST(T->left)&&IsBST(T->right)
2.2.2代码截图
2.2.3本题PTA提交列表说明
关于这道题目我测试了很多遍,有几次是预采用静态声明的变量忘记用static了,但是竟然还过了四个点,还有就是将左子树的代码套用到右子树时忘记改大小于号了
2.3.题目3:7-2 航空公司VIP客户查询
Description:
不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务。现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分的功能。输入首先给出两个正整数N和K。其中K是最低里程,即为照顾乘坐短程航班的会员,航空公司还会将航程低于K公里的航班也按K公里累积。随后N行,每行给出一条飞行记录。飞行记录的输入格式为:18位身份证号码(空格)飞行里程。其中身份证号码由17位数字加最后一位校验码组成,校验码的取值范围为0~9和x共11个符号;飞行里程单位为公里,是(0, 15 000]区间内的整数。然后给出一个正整数M,随后给出M行查询人的身份证号码。
Input:
4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x
Output:
800
15000
1000
No Info
2.3.1设计思路
对身份证的校验码进行分组,使用map容器很容易就可以做出来了,后面我再拿哈希试试
map account[11]
cin >> T
while T--:
根据校验码读入用户信息到account
cin >> T
while T--:
根据输入输出相应内容
2.3.2代码截图
2.3.3本题PTA提交列表说明
前面几次错误都是因为最后的大数据导致超时,后面对stdio解除绑定就快起来啦
3.阅读代码
3.1 题目
这次看选做题感觉实在想不到没什么方便的思路,就直接来看选做题吧
Description:
实现一种简单原始的文件相似度计算,即以两文件的公共词汇占总词汇的比例来定义相似度。为简化问题,这里不考虑中文(因为分词太难了),只考虑长度不小于3、且不超过10的英文单词,长度超过10的只考虑前10个字母。
Input:
3
Aaa Bbb Ccc
#
Bbb Ccc Ddd
#
Aaa2 ccc Eee
is at Ddd@Fff
#
2
1 2
1 3
Output:
50.0%
33.3%
3.2 解题思路
整体的思路就是将输入的数据转化成一个个的英文字母然后存入到set容器当中,比较的时候就直接对一个set进行遍历,看是不是在另外一个容器里面也有,统计相同个数
3.3 代码截图
3.4 学习体会
其实没写出来的主要原因还是之前对STL不了解,不知道怎么遍历STL容器,知道了这一个其他的就非常简单了,对数据进行处理,存储。STL上课的时候只是粗略讲,课后还是应该自己去多学一点的。非常有用。。