DS博客作业07--查找

1.本周学习总结

1.1思维导图

1.2.谈谈你对查找运算的认识及学习体会

这几周学习了查找,像对一个系统之类的进行操作都是增删改,这些步骤不可缺少的就是需要查找
在这章的学习里,有比较熟悉的线性表查找,这和C的内容差不多,比较好理解,就是遍历查找,只是需要遍历的次数的算法的改进
数表查找运用了上章学习的树结构,树的查找理解起来还行,就是代码不大会打
二叉排序树的查找和树形有关,可以将其调整为平衡二叉树,根据失衡点,进行LL,RR,LR,RL调整
B+,B-树是用于外查找的,好吧,显然我不是很懂什么是内外查找,对于B+,B-树只是掌握了怎么增加结点以及删除结点
哈希表查找,上学期就有提过哈希数组,一种以空间换时间的算法,可以使查找达到O(1),但是也有哈希冲突的问题,所以就有相对应的解决冲突的方法
我觉得哈希表查找只要哈希函数构建得好,以及哈希冲突处理的好,应该是这几种算法里最快的了

2.PTA实验作业

2.1.题目1:是否二叉搜索树

2.1.1设计思路

一开始的思路是根据题目中给的二叉搜索树的定义,一个一个进行判断,这样的代码比较复杂
后来想起二叉搜索树的特点,中序遍历是升序的,只要将中序遍历得到的数存入数组,再判断是否是升序的就可以了
对二叉树进行中序遍历,将得到的数存进a数组中
for int j=1 to i
    if a[j-1]>=a[j]//如果中序遍历不是升序的,就不是二叉搜索树
        return 0;
end for
return 1;

2.1.2代码截图

2.1.3本题PTA提交列表说明

A1:第一个提交是用了定义一个一个判断,第二个提交是用来上述的方法,代码量也少了很多

2.2 题目2:QQ帐户的申请与登陆

2.2.1设计思路

一开始的想法是弄两个辅助数组来存放,并且看是否存在该账号或者密码是否正确,然后我发现像这样做要考虑很多东西很有可能陨石超时,于是改成了用C++的map来做
定义结构体Order
定义常量N,以及结构体类型数组,长度为N,定义map容器
for int i=0 to N do
    输入命令,帐号,密码
    如果输入的命令是登录
        判断是否已存在该帐号
            不是的话,提示错误
            是的话,判断密码是否正确//这个时候就可以利用map进行判断,因为注册时将帐号和密码绑定到了一起
    如果输入的命令是申请
        判断是否存在该账号
            是的话,提示错误
            不是的话,完成注册,并且将账号和密码用map关联起来//即QQ[order[i].user ]==order[i].password
end for

2.2.2代码截图


2.2.3本题PTA提交列表说明

Q1:编译错误,emmmm又是没改编译器,多种错误就是我按上述的一开始的想法去做的,有答案错误,也有段错误,告辞
A1:于是改用了map去做,将QQ[order[i].user ]==order[i].password关联到一起,查找账号是否存在,用QQ.find(order[i].user )==QQ.end() 即可,不用再构造另一个数组存放再去一一比较,不过也要遍历一遍就对了,在匹配密码是否正确时,也比较简单,用QQ[order[i].user ]!=order[i].password 判断一下即可

2.3 题目3:航空公司VIP客户查询

2.3.1设计思路

定义结构体Customer
定义常量N,K,M,定义结构体变量customer,定义map容器massage
输入N,K
for int i=0 to N do
    输入客户身份证号码以及里程的长度
    如果里程小于k值
        直接让它等于k值
    如果用户不存在重复,就直接等于里程值
    否则进行累加
end for
输入M
for int i=0 to M do
    输入查询的身份证号码
    定义result=massage[customer[i].code];//用result代替,减少搜索次数
    如果result=0//即用户不存在
        输出提示错误信息
    否则输出result

2.3.2代码截图


2.3.3本题PTA提交列表说明

Q1:一开始看题目,和上一题一样嘛还是用map做,很快咻咻咻就打完代码了,然后愉快的按了提交,部分正确??有两个测试运行超时了
A1:于是偷偷看了大佬的博客,用了一个语句ios::sync_with_stdio(false);//解除与stdio的绑定,虽然不懂,但是偷过来用用
Q2:于是有了17分,过了一个测试点,但是还有一个还是过不了
A2:还是乖乖的去请教大佬吧,大佬建议用hash_map试一下,因为hash_map的查找效率是O(1),但是显然改了半天发现连编译都不过,我还是用map吧,开始疯狂试探,越改分越低
A3:还是继续问大佬吧,显然大佬就是大佬,他发现了我代码里的问题,附上之前的代码,在这个代码里要查找了两遍,第一遍查找是否存在,如果存在到了else语句里还是要再查找一遍。于是用一个result代替massage[customer[i].code],不存在时只要判断是否为0就可以了,不用再查找一遍,输出的话,也直接输出result就可以了,然后提交就答案正确了
Q3:但是问题又来了,当我打好注释再次提交后,发现又错了??难道我哪里不小心改到了??我就把之前的正确代码复制过来重新提交发现还是错的??发生了啥,难道对的机会是可遇不可求??改不动了,就这样吧,起码它对过

3.阅读代码

3.1 题目:查找和替换模式

3.2 解题思路

这题的解题思路是构造一个hashmap,遍历每一个字符串,将该字符串中的每一个字符都和pattern中的每一个字符进行一一对应,例如,第一个"abc",则遍历之后,a对应pattern中的a;第二个"b"遍历后对应pattern中的第而个"b";但是第三个"c"和pattern中的"b"不对应,所以该字符不能压入list中。所以hashmap以pattern中的每个字符为key,以字符串中的每个字符为value,进行遍历。但是这里需要特别注意的地方是凡是pattern中不一样的字符,所对应的字符串中的每一个字符必须不一样,哪怕对应到字符串中的字符没有在hashmap中出现过,这需要单独判断

3.3 代码截图


3.4 学习体会

这题是力扣上的题,它是用hashmap来做,灵活的将模式串和字符串连在一起,判断模式是否一样的话,用hashmap也可以判断模式里是否有重复值,这样,没有重复值的就可以很快判断出来了
posted @ 2019-06-16 18:35  Hyjjing  阅读(100)  评论(0编辑  收藏  举报