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

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

1.本周学习总结 1474783-20190421232435110-321622555.jpg

1.1思维导图

1474783-20190623004459253-1240533684.png

1.2学习体会

  • 学习内容:关于线性表的查找不是太陌生,顺序查找和二分查找,在C语言中广泛运用,较为容易掌握;哈希表的话之前只是接触过哈希数组,现在这章学习之后觉得哈希更好用了,要掌握的不仅是代码的编写,还有就是对于哈希查找的过程的了解,计算ASL;这章右接触到一种特殊的树——二叉排序树,不仅要熟练相关代码算法,更是对于树的删除、插入会画图,平衡二叉树调整我觉得很有意思叭,需要判断是否平衡,然后再判断是RL或RR或LL或LR调整,仔细一点就很容易掌握。让我觉得难度最大的还是B-,B+树辽,删除对我来说真的是需要再熟悉一下了,不管是画图还是代码都是让我最头疼的部分,这一块不管在代码还是课堂派作业上,都很薄弱,要重点观察辽!老师还额外补充了map相关的知识和应用
  • 学习体会:这一章对比前几章,我感觉更注重知道查找的过程,会画二叉排序树,会调整二叉树,了解哈希查找的过程(之前上课的时候就是这个看书的时候理解错辽意思,上黑板还或错了,好的吧)重点关注对象!B-树的删除我还需要再熟悉一下方法滴,这一章好像每一节都有用到ASL的计算,一定要仔细(因为i真的超级简单),可能因为这章课堂派作业比较多(其实是因为莫得上机考。。。),碰上期末周就忽略了pta,代码真的一拖再拖,导致博客园压力很大辽。

2.PTA实验作业 1474783-20190421232505428-249952903.jpg

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

本题要求实现函数,判断给定二叉树是否二叉搜索树。

2.1.1设计思路

【思路——判断中序遍历是否是递增的】    - 建立数组s[100]存放中序序列    - 中序遍历二叉树            递归左子树            s[i++]= T->data            递归右子树     - 判断中序序列是否递增            for j=0 to i                if s[j-1] >= s[j]                    return 0            return 1

2.1.2代码截图

1474783-20190623012536847-1929593895.png

2.1.3本题PTA提交列表说明。

1474783-20190623012644542-187821427.png

说明:
  • bug1:刚开始的时候没注意函数名,自己取了一个名字,也是二到爆炸了,查错还查了很久,这些小错误真的应该去编译器查一遍,不能直接再pta上写;
  • bug2:刚开始写的时候想把中序序列存到队列里面,没有注意到是C语言编程环境,写完之后才发现,导致编译错误;
  • bug3:把中序遍历单独用一个函数写,好像不太能行得通;
  • 总结:还是得仔细,看清题目,尤其是函数题,得先看清楚编程环境再下手啊。

2.2 题目2:二叉树的最近公共祖先

在一棵树T中两个结点u和v的最近公共祖先(LCA),是树中以u和v为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。

2.2.1设计思路

【思路——递归】     #####before查找祖先            - 查找结点x是否存在                      if  T->key == x                            return 0;                      if  T->key > x                            Find(T->Left);                      if  T->key < x                            Find(T->Right);     #####when查找祖先             - 空树或者找不到结点时                    return error            - 找到共同祖先                    返回祖先            - 不在范围之内                    return T->key            - u>T->key                    return LCA(T->Righrt,u,v);            - u
key return LCA(T->Left,u,v);

2.2.2代码截图

1474783-20190623014906306-33647485.png

2.2.3本题PTA提交列表说明。

1474783-20190623015007202-1409199520.png

说明:
  • bug:在考虑的时候没有考虑超出范围这个条件,不够周全!
  • 总结:这种情况较为复杂的时候,应该读清楚题目,罗列所有状况,一个都不能忽略!
    ***

2.3 题目3:QQ帐户的申请与登陆

实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
  • 输入格式:输入首先给出一个正整数N(≤10^5​​ ),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

  • 输出格式:

    针对每条指令,给出相应的信息:

1)若新申请帐户成功,则输出“New: OK”;

2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。

2.3.1设计思路

【思路——map容器】    - 定义变量c存储命令符L or N                     numb存储账号                     str存储密码     - 定义一个map容器配对账号和密码    - 遍历n个操作            输入命令、账号、密码            if 注册                if map.find(numb)!=map.end()                        输出ERROR:Wrong PW;                else                        输出“New: OK”;                        map[numb]=str;            if 登陆                if 账号在map里找不到                         输出“ERROR: Not Exist”;                else                           输出“Login: OK”;

2.3.2代码截图

1474783-20190623020550879-1607727191.png

1474783-20190623020555204-1109363940.png

2.3.3本题PTA提交列表说明。

1474783-20190623020723998-1154008112.png

说明:
  • bug1:编程环境又没注意
    这道题并不难,主要是了解map的格式,发现map真的超级好用,记得之前课设的时候有要求注册和登陆时对于账户密码的匹配操作,我都是存文件然后判断是否相等这样比较麻烦的操作,但是用map就直接可以解决,很方便,这边记录一下,加深印象,方便以后这方面代码的编写!

3阅读代码 1474783-20190421232538440-1956441842.jpg

3.1题目:监控二叉树

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

1474783-20190623023434127-2015631878.png

3.2解题思路

【函数一 dfs判断结点类型】        if   树空            return 1        if   dfs(node->left) == 2 或者 dfs(node->right)==2             ans++;             return 0;        else if   dfs(node->left) == 0 或者 dfs(node->right)==0             return 1         else                return 2;   【函数二 计算最小摄像头数量ans】          if 空树                return 0          if dfs(root) == 2                ans++;

3.3 代码截图

1474783-20190623024359151-637735114.png

3.4学习体会

经过几次阅读代码,感觉力扣上面的题目,大多是给出许多书上没有的概念,比较陌生的东西,但是大体跟书上的代码思路几乎差不多,大量运用递归的算法,这道题开始看到摄像头这个说法会觉得很陌生很奇怪,但是阅读了评论区的代码之后发现其实还是不难的,要计算摄像头的数量,需要先对于给出的树的结点进行分类,分为三种:有监视器的结点,没有监视器但可观的结点和不可观的结点;分清楚之后,再进行统计即可完成,所以在面对陌生的知识块的时候不要害怕,仔细想一想其实还是依据最基本的知识点,在树的应用上,应该最优先想到递归算法,不仅代码量少,效率也比较可观,容易编写,但是也要注意容易出错,要仔细一些。


转载于:https://www.cnblogs.com/victory0917/p/11031929.html

你可能感兴趣的文章
团队站立会议08
查看>>
软件自动化测试学习步骤
查看>>
vector 简单使用
查看>>
20139216网络攻防技术第七次作业
查看>>
Sublime Text 配置
查看>>
【杂谈】需要mark的一些东西
查看>>
P2731 骑马修栅栏 欧拉函数
查看>>
sort函数
查看>>
CentOS-6.3安装配置Nginx
查看>>
女陔说"你不懂我", 到底什么意思
查看>>
uva11149
查看>>
S/4HANA中的销售计划管理
查看>>
【图灵学院09】RPC底层通讯原理之Netty线程模型源码分析
查看>>
非常的好的协同过滤入门文章(ZZ)
查看>>
数据结构:哈希表
查看>>
markdown 基本语法
查看>>
tensorflow之tf.slice()
查看>>
Python高阶函数-闭包
查看>>
Windows下安装Redis
查看>>
Ubuntu 12.04 部署 PostGIS 2.1
查看>>