博客作业05--查找
1.学习总结
1.1查找的思维导图
1.2 查找学习体会
本章查找算法主要分为线性表查找、树表查找和哈希表查找,其中线性表查找算法较为简单,树表的知识点较多,容易遗忘,需要时常复习,哈希表主要分析平均查找长度,对计算不成功的平均查找长度还不熟练。然后对于查找、插入、删除等算法程序基本上不能独立写出。
2.PTA实验作业
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路(伪代码或流程图)
bool IsBST ( BinTree T ){ //判断是否为二叉树 定义变量p用于遍历二叉树,max保存左子树中的最大值,min保存右子树的最小值。 空树返回true if T的左孩子为真 { p=T->left max保存根节点数据 遍历找出最大值更新max if(max>根节点数据) 返回false } else if T的右孩子为真 同上
递归调用T的左子树及右子树 }
2.3 代码截图
2.4 PTA提交列表说明。
之前一直以为判断二叉树只要左孩子小于其父节点,右孩子大于其父节点就可,忽略了左子树中右孩子大于其大于其父节点但可能也大于其祖先节点的情况,同样右子树中左孩子小于其父节点且要大于其祖先节点。
2.1 题目2:6-3 二叉搜索树中的最近公共祖先
2.2 设计思路(伪代码或流程图)
int LCA( Tree T, int u, int v ){ //找出最近公共祖先 定义变量p,q用于两个节点的遍历,f1,f2作为找到该节点的标志,t保存祖先节点数据 if(T不为空) t保存T的数据 while p或q为真 { if p为真 { 比较u与p的数据大小决定p为其左子树或右子树 if 相等 f1=1 } if q为真 同上 if q,p存在且数据相等 t保存数据 if f1,f2都为1 return t; if p为空且f1为0或q为空且f2为0 return ERROR; } p、q都找不到return ERROR; }
2.3 代码截图
2.4 PTA提交列表说明。
刚开始是一些语法错误,字符写错了之类。之后是因为在循环里通过多次条件判断一个节点的数据时,没有加上else,
导致一个节点多次符合条件,而另一个节点只符合一次条件的情况,出现错误。
2.1 题目3:7-1 QQ帐户的申请与登陆
2.2 设计思路(伪代码或流程图)
定义变量I,n,id,pass,x(命令符),y(账号),z(密码) 输入n for(I=0 to n-1) { 输入x,y,z if x为N { //新用户注册 if 账号已存在 输出ERROR: Exist else 插入并输出New: OK } else { //老账户登陆 if 账号不存在 输出ERROR: Not Exist else{ if 账户密码不一致 输出ERROR: Wrong PW else 输出Login: OK } } } end
2.3 代码截图
2.4 PTA提交列表说明。
做这道题需要用到C++的语法知识和map函数的用法,刚开始不知道map函数中的string是一个数据类型,误把它定义成了字符数组类型的数据。
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:130
4. 阅读代码
这是pta上的航空公司VIP客户查询,我自己用的是map容器的写法,但是有两个测试点运行超时,这是构建哈希表的写法。
这是用链表法构建哈希表,Hash函数取身份证的后5位通过除留余数法构造哈希函数确定哈希地址,不过我不太明白为什么要取身份证的后5位。
NextPrim函数用于确定哈希表的长度,表长基本上小于n/2,同样也不清楚为什么表长要这样确定,可能是为了节省空间?
Init函数即初始化哈希表,主要给表头节点和数据节点申请空间,调用NextPrim函数确定哈希表长度。
Find函数用于查找哈希表中的对应id值,它首先通过Hash函数来确定id所在的哈希地址,即表头节点,再在此链表中查找id。
Insert函数把新增id插入到哈希表中,也是先确定地址,若表中无此id则插入,这边插入用的是头插法的插入方法。