• DS博客作业07--查找


    1.本周学习总结

    1.1思维导图

    1.2学习体会

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

    2.PTA实验作业

    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代码截图

    2.1.3本题PTA提交列表说明。

    说明:
    • 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<T->key
                        return LCA(T->Left,u,v);
    

    2.2.2代码截图

    2.2.3本题PTA提交列表说明。

    说明:
    • 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代码截图

    2.3.3本题PTA提交列表说明。

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

    3阅读代码

    3.1题目:监控二叉树

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

    节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
    计算监控树的所有节点所需的最小摄像头数量。

    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 代码截图

    3.4学习体会

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


  • 相关阅读:
    论文解析 -- TiDB: A Raftbased HTAP Database
    人生资产负债表
    Hadoop、Hive、Spark 之间关系
    在 Python3 中,bytes 和 str 的互相转换方式是
    json中load和loads区别
    springboot——修改html实时生效,不用重启tomca(idea版)
    ThinkPHP6 利用crontab+think make:command执行定时任务 tp6默认不可以用命令行访问控制器
    Whoops, GitLab is taking too much time to respond.解决
    phpmyadmin导入csv文件 #1366
    pipenv --python 'python/path' install 报错原因
  • 原文地址:https://www.cnblogs.com/victory0917/p/11031929.html
Copyright © 2020-2023  润新知