博客作业05--查找
1.学习总结(2分)
1.1查找的思维导图
1.2 查找学习体会
本章学习了多种查找的方法及各查找算法的性能分析,即平均查找长度(ASL)分为ASL成功和ASL不成功。
线性表查找不同查找有不同时间复杂度。如顺序查找的时间复杂度为O(n),折半查找的时间复杂度为O(log2n).
树表查找是较难掌握的一部分,要分清排序树,平衡树各自的构造。对B-和B+树还未完全掌握
哈希表是除顺序表存储结构、链表存储结构和索引存储结构外又一种存储线性表的存储结构,可以根据关键字直接计算该关键字的地址,这个地址就是哈希函数。
2.PTA实验作业
2.1 题目1:是否二叉搜索树
2.2 设计思路(伪代码或流程图)
主函数:bool IsBST ( BinTree T )
伪代码描述:
判断树为空或左子树或右子树为空的情况
用递归算法判断根结点下的左右子树,若有其一不存在,则返回false
分别在左右子树下,判断是否非空左子树的所有键值小于其根结点的键值及是否非空右子树的所有键值大于其根结点的键值
2.3 代码截图
2.4 PTA提交列表说明
在判断左右子树的时候,没有弄清&&符号,导致编译错误
解决:明确思路,改正判断条件
2.1 题目2:二叉搜索树中的最近公共祖先
2.2 设计思路(伪代码或流程图)
find函数
先判断是否有树结点,无则返回0,有则将结点的键值与输入的结点键值比较,大于往左孩子找,小于往右孩子找,等于返回1
LCA函数
先判断是否有树结点,u结点,v结点是否在树中,不在则返回ERROR
若u结点,v结点存在且满足条件,则返回共同祖先键值
若与当前结点键值不符,则用递归往左右孩子找
2.3 代码截图
2.4 PTA提交列表说明
问题:判断条件错误,需u结点和v结点键值均与T的键值相等,才符合题意
解决:判断条件改为 u==T->Key||v==T->Key
问题:if判断条件漏写了=号
2.1 题目3:QQ帐户的申请与登陆
2.2 设计思路(伪代码或流程图)
利用map函数
n为要输入的指令条数,num为QQ账户,m为密码
分两种情况,一种老账户,一种新账户
若为老账户,当此号码不存在,输出“ERROR: Not Exist”
当号码存在,判断密码是否相同,相同输出Login: OK,不同输出ERROR: Wrong PW
若为新账户,判断这个账号,可以申请,则输入密码,输出New: OK
不可以申请,则输出ERROR: Wrong PW
2.3 代码截图
2.4 PTA提交列表说明
部分正确代码截图:
问题:忘记判断新账号已存在的情况
解决:补上else判断若新账号已存在,需输出ERROR: Wrong PW
3.截图本周题目集的PTA最后排名
4. 阅读代码
本题用哈希表查找字符串中第一次仅出现一次的字母,HashFunction函数用于判断并返回字符的值;MapHashTable函数用于存储字母出现的次数,HashSearch函数为哈希查找函数,在哈希表中查到第一次仅出现一次的字母的对应位置
- #include <string.h>
- #include <ctype.h>
- //哈希函数 返回索引地址
- int HashFunction(char ch)
- {
- if(islower(ch))
- return ch-'a';
- else
- if(isupper(ch))
- return 26+ch-'A';
- }
- void MapHashTable(char HashTable[],char a[],int len)
- {
- int pos;
- for(int i=0;i<len;i++)
- {
- pos=HashFunction(a[i]);
- //if(HashTable[pos]==0) //表明未被赋值
- ++HashTable[pos];
- }
- }
- char HashSearch(char HashTable[],char a[],int len)
- {
- int pos;
- for(int i=0;i<len;i++)
- {
- pos=HashFunction(a[i]);
- if(1==HashTable[pos])
- {
- if( 26<=pos && pos<=51)
- return pos-26+'A';
- else
- return pos+'a';
- }
- }
- return -1; //未找到符合题意
- }
- int main()
- {
- char str[]="aacddcBvghhAgii";
- int len=strlen(str);
- printf("源字符串为:%s\n",str);
- char HashTable[52]; //哈希表 用于存储次数
- memset(HashTable,0,sizeof(HashTable)/sizeof(char));
- MapHashTable(HashTable,str,len);
- char ch=HashSearch(HashTable,str,len);
- if(ch!=-1)
- printf("第一次只出现一次的字符为:%c\n",ch);
- }