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

  • 相关阅读:
    洛古模拟赛--星空
    bzoj4476 [Jsoi2015]送礼物
    矩阵乘法总结
    bzoj 3167 SAO
    codeforces 671D
    10.28
    noip前集训
    10.2晚 模拟继续
    10.2 考试
    10.1 国庆 考试
  • 原文地址:https://www.cnblogs.com/porphyra/p/10993948.html
Copyright © 2011-2022 走看看