博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DS博客作业07--查找
阅读量:4561 次
发布时间:2019-06-08

本文共 2169 字,大约阅读时间需要 7 分钟。

1.本周学习总结

1.思维导图

1475599-20190621215012041-549070823.png

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

对于查找这一章,这章跟之前的章节相比,没有了一个具体的数据结构,像队列、栈、树、图之类的结构,感觉像是学了几种算法,这几种算法

在时间复杂度上跟我们现在用的算法有着明显的优势,以前一般都是用一些很普通的算法来查找一个值,一般时间复杂度也比较高,可能是因为
在PTA上做题不用那么考虑时间复杂度的问题,答案对了就行代码没问题的话一般也不会超时,在写代码的时候也很少会想起来要用较优的算法
来减少时间复杂度。查找这一块内容在写任何程序的时候还是经常用到的,特别是对线性表的查找,以后写代码也不用像最开始学习编程一样查
找都是从头到尾按顺序查找,而是可以参考书上的算法、

2.PTA实验作业

2.1.题目1:7-2 航空公司VIP客户查询

2.1.1设计思路(伪代码)

int map
vipfor i=0 to n then 对vip赋值end forfor i=0 to m then 输入要查找的账户,并输出账户中的积分信息,不存在则输出"No Info"end for

2.1.2代码截图

1475599-20190621211758311-1614864909.png

1475599-20190621211811136-486682403.png

2.1.3本题PTA提交列表说明。

1475599-20190609164216433-1753406596.png

Q1:超时问题
A1:ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
在主函数的开头加上这串代码就可以减少程序运行的时间
Q2:初始对map赋值
A2:在开头对map赋值时,最初的代码有一个查找的操作判断有无会员信息,然后再考虑里程是直接赋值还是要和之前的相加,
后来发现不用查找,所有的map中的值全都都相加并没有关系

2.2.题目1:6-4 jmu-ds-哈希表操作集

2.2.1设计思路(伪代码)

创建hash表函数for i=0 to m then     初始化hash表end forfor i=0 to n then      对hash表赋值,并使用线性探测的解决冲突end for查找hash表函数if(ha[num].key == k)     return num      //第一次查找就找到对应数值else    while(1)        依次往下查找,直到找到对应数值或找到为空的单位     end whileend if

2.2.2代码截图

1475599-20190621211313288-1159722881.png

1475599-20190621211328154-21714395.png
1475599-20190621211340349-2055031710.png

2.2.3本题PTA提交列表说明

1475599-20190609164551398-239735346.png

Q1:部分正确
A1: 1、在建立哈希表的时候条件判断语句条件错误,应该是在哈希表为空的时候进行赋值,而不是在哈希表不为空的时候赋值,==写成!=
2、uns_count没有加上最后一次的次数,导致不成功的查找次数少1
3、在查找时,若k%p的位置上不是当前查找的元素,进行循环时没有对长度num+j进行取余,导致哈希表越界

2.3.题目3:6-3 二叉搜索树中的最近公共祖先

2.3.1设计思路(伪代码)

p1=根节点Twhile(p1!=NULL)     查找树中是否存在值为u的结点end whilep1=Twhile (p1!=NULL)     查找树中是否存在值为v的结点end whilep1=Twhile(p1!=NULL)      if(v和u分别大于和小于当前结点或u或v中有一个等于当前结点的值)            return T->key      end if      if(u和v都小于当前结点的值)            T= T->Left       end if      if(u和v都大与当前结点的值)            T=T->Right       end ifend while

2.3.2代码截图

1475599-20190621212255279-1453292434.png

1475599-20190621212304657-1269893477.png
1475599-20190621212317088-1422513672.png
1475599-20190621212327482-1482541332.png

2.3.3本题PTA提交列表说明。

1475599-20190621212348624-1102471076.png

Q1:运行超时
A1:超时问题刚开始还以为是算法问题,以为是算法太复杂了导致的超时,后来发现是没有考虑到几种情况导致查找
找不到一个结果,这几种情况就是当输入的结点之一就是他们最近的公共祖先时,这是函数就没有出口而是一直查找
下去

3、阅读代码

3.1 题目

编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
来源:力扣(LeetCode)

3.2 解题思路

先判断当前这个树是否个位数的平方和为1,若是的话直接返回1,否则就判断set中的头尾是否相等,若不相等则这个树

就不可能是个快乐数返回false,没有返回false的话则将当前数的各位平方和插入到set中继续下一轮循环。

3.3 代码截图

1475599-20190621220326311-936336930.png

3.4 学习体会

在查找这一章中,不仅学会了一些查找的算法和数据结构,像二分查找、分块查找、树表的查找和哈希表的查找等等,

在学习这些的过程中同时也学到了两种c++中的容器的使用,set和map,这两种容器在查找个别数据时会显得非常方便
在加上这些容器中有自带的查找函数,根本不用自己打代码,不仅节省时间而且也减少了出错率。

转载于:https://www.cnblogs.com/porphyra/p/10993948.html

你可能感兴趣的文章
不变模式
查看>>
20181227 新的目标
查看>>
androidtab
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
C# Enum Name String Description之间的相互转换
查看>>
PHP wamp server问题
查看>>
Spring Data Redis学习
查看>>
js闭包理解案例-解决for循环为元素注册事件的问题
查看>>
2015.04.23,外语,读书笔记-《Word Power Made Easy》 12 “如何奉承朋友” SESSION 33
查看>>
Spring+SpringMVC+JDBC实现登录
查看>>
生与死之间
查看>>
NEFU 109
查看>>
HDU 5435
查看>>
git从已有分支拉新分支开发
查看>>
滚动条隐藏兼容写法
查看>>