05-查找

1.学习总结

1.1查找的思维导图

1.2 查找学习体会

查找内容很多,像平均查找长度,平均二叉树插入删除时的调整,还有B树,哈希表,哈希冲突等重要内容,查找的内容也与我们平时生活联系很深。
本周还学习了Map,STL的一个容器,它提供一对一的hash,很多功能直接调用函数,很方便

  • 变量声明:map<string, string> mapStudent;
  • map的所有节点元素都是pair,pair有两个成员变量first,second ,第一个first是键值key,第二个second是实值value
  • 插入元素:
    (1)用insert函數插入pair:mapStudent.insert(pair<string, string>("r000", "student_zero"));
    (2)用"array"方式插入:mapStudent["r123"] = "student_first";mapStudent["r456"] = "student_second";
  • 查找:出现时,它返回资料所在位置,如果没有,返回iter与end函数返回相同
    iter = mapStudent.find("r123");
    if(iter != mapStudent.end())
    cout<<"Find, the value is"<second<<endl;
    else
    cout<<"Do not Find"<<endl;
  • set使用方法:
    begin()返回set容器的第一个元素
    end() 返回set容器的最后一个元素
    clear() 删除set容器中的所有的元素
    empty() 判断set容器是否为空
    max_size()返回set容器可能包含的元素最大个数
    size()返回当前set容器中的元素个数
    rbegin返回的值和end()相同
    rend()返回的值和rbegin()相同
  • 判断键值是否存在:
    count() 用来查找set中某个某个键值出现的次数因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了

2.PTA实验作业

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

2.2 设计思路

建树
如果为空树则为二叉搜索树
如果无左右孩子也为二叉搜索树
如果左孩子不为空
   利用循环找到左子树最右节点
        如果该节点的值大于根节点的值,则不满足非空左子树的所有键值小于其根结点的键值,不是二叉搜索树
如果右孩子不为空
   利用循环找到左子树最左节点
        如果该节点的值小于根节点的值,则不满足非空右子树的所有键值大于其根结点的键值,不是二叉搜索树   
利用递归继续判断其他节点

2.3 代码截图

2.4 PTA提交列表说明

  • 编译错误
    bool返回类型应该是true或者false,但是判断是否为空时,我返回了NULL
  • 段错误

    调试时发现卡在BinTree P=T处,是不是再进入这条语句时,又创建了一次BinTree P,类似于程序中出现俩个同名定义变量,于是把BinTree P这一句挪到了if语句外,但是结果与测试案例不符。所以按照题目中的一条条要求又重写了一次

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

2.2 设计思路

输入指令行数
输出指令
如果命令符为“L”
       如果找不到该账号,输出ERROR: Not Exist
       如果存在该账号
              判断账户密码,如果正确,输出Login: OK,否则,输出ERROR: Wrong PW
如果命令符为“N”     
        如果找不到该账号,插入该新账号,输出New: OK
        如果找到该账号,输出ERROR: Exist         

2.3 代码截图

2.4 PTA提交列表说明


格式错误(这个没什么好说明的。。。)

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

2.2 设计思路

输入飞行记录行数N,最低里程K
循环输入N行飞行记录
       判断已有记录中是否有当前身份证号码
              如果没有,给里程值赋初值0
        如果该记录里程值小于K大于0,里程值在原先基础上累加K
         如果大于K,累加该记录里程值
循环结束     
输入整数M
循环输入M行查询人的身份证号码
       如果记录中没有该查询人,输出No Info
       如果记录中有该查询人,输出其当前的里程累积值
循环结束

2.3 代码截图

2.4 PTA提交列表说明


运行超时,一开始理解成不能满足大数据,是类型定义错误,但是改完还是错的。。。尝试了很久,实在找不出来问题,询问了炳辉大佬,他说把c++的输出输出换成c的。百度下得到的是“输入数字没有问题,如果输入非整形的话,cin流的状态会被破坏,无法继续输入,可以用cin.clear清一下流的状态,或者把输入的部分放入while循环,输入错误时退出”所以改用scanf,printf反而方便一点

3.截图本周题目集的PTA最后排名

3.1 PTA排名

3.2 我的总分:2.5

4. 阅读代码

代码链接:https://blog.csdn.net/chenhanzhun/article/details/39529425
代码链接:https://blog.csdn.net/mdl13412/article/details/6655581
这俩篇博客的注释都很详细,头文件里的东西很复杂,但是调用map.h后续功能的实现都很方便,像本章学习的查找,如果用树来实现,建树,再遍历查找,代码量很大,但是调用Map的话,利用insert()和find(),几句代码就可以实现了,具体操作不需要我们来完成,知道原理就可以了,比如find()函数,如果找到它会返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器

5. 代码Git提交记录截图





posted @ 2018-05-26 22:18  我是纪予哇  阅读(175)  评论(1编辑  收藏  举报