查找
1.学习总结
1.1查找的思维导图
1.2 查找学习体会
通过本章的学习我认识到了多种查找方法,对于每种查找方法的深入探讨又让我了解到了每种查找的优缺点以及对于不同查找方法,其时间复杂的其实是不同的,因此我们在解题时应结合题意尽可能的找到最优方法解题。起初我比较困惑的是不同查找方法的ASL成功与不成功该如何计算,多种查找方法一并学习使我对其计算方法更加云里雾里,尤其是求哈希表的ASL不成功,对这个概念比较模糊,不过在经过多次练习后自己总结也总结了计算方法,现在已经清楚了许多。再有就是在做pta题目的过程中认识到了STL容器,对于其中的map算法加以了解并尝试运用map算法解题,也正在继续找课外资料学习STL容器。目前还存在的一个问题是写代码还是不太熟练,就此给自己安排的目标是平时还是要多练习打代码,照书敲完代码后需要自己独立思考再敲一遍。
2.PTA实验作业
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路(伪代码或流程图)
bool IsBST( BinTree T ) { if T是空树或T无左子树与右子树 返回 true; if 左子树最右边的节点数据>T节点数据 返回 false; if 右子树最左边的节点数据<T节点数据 返回 false; 递归调用T的左子树及右子树 }
2.3 代码截图
2.4 PTA提交列表说明
本题提交没有出现错误。
2.1 题目2:二叉搜索树中的最近公共祖先
2.2 设计思路(伪代码或流程图)
int LCA( Tree T, int u, int v )//寻找u,v的共同祖先 { 定义变量P用于记录祖先节点,初始为T 若树为空或者u或v不在该树中 ERROR; while p为真{ if u,v都小于p->key p变为该节点指向的左子树根节点 else if u,v都大于p->key p变为该节点指向的右子树根节点 else 退出循环 } 返回p节点数据 }
2.3 代码截图
2.4 PTA提交列表说明
一开始出现多种错误是因为在遍历查找u,v是否在该树中时没有增添break语句,导致运行超时,加上break语句后可解决超时限制。出现部分错误是因为判断条件没有写清楚,错误部分如下:
在33行if之间补上else即可解决该错误。
2.1 题目3:QQ账户的申请与登陆
2.2 设计思路(伪代码或流程图)
for(i=0 to n-1){ 输入命令符,QQ号码a,密码b; 判断命令符: 如果是新帐户申请 if(iter!=mymap.end()) 已经存在该用户; 输出ERROR: Exist else 存入新信息; 输出New: OK 老用户登录 if(iter==mymap.end()) 不存在该用户; 输出ERROR: Not Exist else if(iter->second != b) 密码错误; 输出ERROR: Wrong PW else 密码正确 输出Login: OK; }
end
2.3 代码截图
2.4 PTA提交列表说明
第一次提交编译错误是因为选择错编译器,用map算法应选取c++编译器,部分正确的错误点在登录成功输出Login: OK这个部分,错误段代码如下:
出现错误的原因是没有搞清楚以上一段代码实现的功能,以上代码的功能是判断map容器中是否已有本次输入的QQ账号信息,若存在,则输出ERROR: Wrong PW,不符题意。改正代码如下:
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:145分
4. 阅读代码
题目:7-2 航空公司VIP客户查询(25 分)
不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务。现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分的功能。
网络上代码:
这一题起初我使用的办法是map算法,用这一算法可以运行可是在pta里面提交会显示运行超时,只拿到了部分分数。阅读以上哈希表做法后尝试使用哈希表解此题,Dev中运行正确可是还是出现答案错误,后来对照以上代码改进之后提交正确,猜想可能是没有扩大航程的范围导致,我在改进代码前后最大的差别就是将原来的"%d"改成"%lld"。
以上代码注意点:注意hash函数的选取,选择后五位,选四位可能会超时,尽量让Hash函数取值接近数据最大值,这样能减少很多冲突。
函数功能:Init():初始化哈希表;
Insert():将客户信息插入哈希表;
Find():查找哈希表中相对应的身份证号;
NextPrim():求哈希表长度。