查找
1.学习总结
1.1查找的思维导图
1.2查找学习体会
本章查找算法主要分为线性表查找、树表查找、哈希表查找。其中线性表查找比较简单,运用的思路为我们传统的数组思路。而树表查找对我开说较为困难,因为它比起线性表的串联更像是一种一对多的关系,在这种一对多的关系中,将算法的时间和空间复杂度大大降低,这种进阶的思想尤为重要。最后是哈希表,哈希表,也叫散列表,它可以直接找到关键字所在位置,可以将算法的时间复杂度降得更低,又是另一种进阶算法。我现在并没有熟练的掌握这些算法,我需要进一步的学习来巩固自己。
2.pta实验作业
2.1题目1:6-2 是否为二叉搜索树
2.2 设计思路(伪代码)
2.3代码截图
2.4 PTA提交列表说明
之前我的思考方向是从定义出发,先判断左子树情况,再判断右子树情况,但由于我对遍历思想不够熟悉,写起代码来会差许多,打不出来,所以就换了一种思考方向。如果将树中序排列后,他将变成一个有顺序的数组,再遍历一遍数组,如果顺序不对,出现了重复等,这颗树就不会是二叉搜索树了。
2.1 题目2:6-3 二叉搜索树中的最近公共祖先
2.2 设计思路(伪代码)
2.3 代码截图
2.4 PTA提交列表说明。
刚开始的思路不够清晰,有一些情况没有考虑到,比如说当u,v两个结点离得较远的时候,显然不能直接让他们直接找到他们其中一个的父节点,而是应该再度往上寻找。刚开始写的find函数主要用来寻找u,v是否存在,总体思路分为三部分:一、uv不存在,则返回错误。二、当前寻找到的结点已经是最近公共祖先节点(一个接下来在右子树中,一个在左子树),则返回当前结点的键值。三、当前寻找到的结点并不是最近公共祖先节点,(都在左子树或右子树中),则继续寻找。
2.1 题目3:QQ账户的申请与登陆
2.2 设计思路(伪代码)
2.3 代码截图
2.4 PTA提交列表说明
这题的总体思路并不难(如果会用map的话),但是由于我对map算得上是一无所知,所以写起来难度异常的大。这题最后还是通过百度之后才出来的。
抛开map先不说,其他代码较为简单,我第一次得了7分是我在用map的时候不够细心,没有真正的懂得map<>的意思,在判断p[],和pp[]的时候,只写出了对老账号的输入,而新账号的不存在我以为也是0(其实人家是反过来的),这才写错。
总体来说,这题代码我还不太会,主要是在map的运用上和c++的使用上不够熟悉,希望能再接再厉。
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2我的总分:145
4. 阅读代码
#include <map>
map
是使用红黑树实现的,访问、查找和删除操作的复杂度都是O(log2n),插入会比较慢。
map,顾名思义就是地图。其实就是key,value的对应。
当你需要快速的获取对应key的value的时候,就可以使用map了。例如一个人是有名字,但是这个人还有其他的属性,例如年龄,性别等等。这个人就会被封装为一个对象。如果有很多个人,我们需要快速的根据一个人的名字获取对应名字的对象,这个时候map就有用了。如果采用数组,我们需要遍历整个数组,才可以根据名字找到这个人。如果是map(以名字为key,以人的对象为value),就可以直接根据名字得到这个对象,就不需要遍历操作了。
Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!
1. map最基本的构造函数;
map<string , int >mapstring; map<int ,string >mapint; //这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.
map<sring, char>mapstring; map< char ,string>mapchar;
map<char ,int>mapchar; map<int ,char >mapint;
2. map添加数据;
map<int ,string> maplive;
1.maplive.insert(pair<int,string>(102,"aclive"));
2.maplive.insert(map<int,string>::value_type(321,"hai"));
3, maplive[112]="April";//map中最简单最常用的插入添加!
3,map中元素的查找:
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
map<int ,string >::iterator l_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"we do not find 112"<<endl;
else cout<<"wo find 112"<<endl;
4,map中元素的删除:
如果删除112;
map<int ,string >::iterator l_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"we do not find 112"<<endl;
else maplive.erase(l_it); //delete 112;