zoukankan      html  css  js  c++  java
  • 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,这两种容器在查找个别数据时会显得非常方便
    在加上这些容器中有自带的查找函数,根本不用自己打代码,不仅节省时间而且也减少了出错率。

  • 相关阅读:
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    使用Jasmine和karma对传统js进行单元测试
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    nginx 基于IP的多虚拟主机配置
    Shiro 框架的MD5加密算法实现原理
    项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)
    实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  • 原文地址:https://www.cnblogs.com/porphyra/p/10993948.html
Copyright © 2011-2022 走看看