DS博客作业07--查找

1.本周学习总结

1.思维导图

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

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

2.PTA实验作业

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

2.1.1设计思路(伪代码)

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

2.1.2代码截图


2.1.3本题PTA提交列表说明。


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 for
for i=0 to n then
      对hash表赋值,并使用线性探测的解决冲突
end for
查找hash表函数
if(ha[num].key == k) 
    return num      //第一次查找就找到对应数值
else
    while(1)
        依次往下查找,直到找到对应数值或找到为空的单位
     end while
end if

2.2.2代码截图



2.2.3本题PTA提交列表说明


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

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

2.3.1设计思路(伪代码)

p1=根节点T
while(p1!=NULL)
     查找树中是否存在值为u的结点
end while
p1=T
while (p1!=NULL)
     查找树中是否存在值为v的结点
end while
p1=T
while(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 if
end while

2.3.2代码截图




2.3.3本题PTA提交列表说明。


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

3、阅读代码

3.1 题目

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

3.2 解题思路

先判断当前这个树是否个位数的平方和为1,若是的话直接返回1,否则就判断set中的头尾是否相等,若不相等则这个树
就不可能是个快乐数返回false,没有返回false的话则将当前数的各位平方和插入到set中继续下一轮循环。

3.3 代码截图

3.4 学习体会

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

posted @ 2019-06-16 14:20  porphrya  阅读(259)  评论(0编辑  收藏  举报