zoukankan      html  css  js  c++  java
  • 20182330《程序设计与设计结构》 第九周学习总结

    20182330《程序设计与设计结构》 第九周学习总结

    教材学习内容总结

    周一:查找

    一、线性查找

    • ASL平均查找长度:用平均比较次数估计算法优劣
      ASL=累加:查到某个的概率查到所用的次数(次数之和1/n)查到1:n
      查到n:1 查到i:n-i+1
    • 查找失败:n+1
    • 总数等于(i+n)n/2
    • ASL=(1+n)/2 时间复杂度为O(n)
    • 优化算法:放一个哨兵,不用比较,从后往前找
    data[0]=target;
    for(index = data.length-1;data[index].equals(target);
    --index))
    { return index == 0 ? false:true;}
    
    哨兵 21 32 32 34 56 78 98
    0 1 2 3 4 5 6 7
    • 也就是说,一定会找到。若返回的index=0,则找到的是哨兵,故未查找到。

    二、二分查找(折半,必须有序)

    • 从1开始
      15/2=7
      时间复杂度:O(log2 n)

    特点:
    1.效率高
    2.有序
    3.只适用顺序存储

    三、分块查找 :索引+顺序表(可以先折半再线性,ASL在折半线性之间)

    • 分块有序
      1-5 6-10分块
      分别找最大值
      20 (最大值)1(1-5)|40 6 |78 11

    四、哈希表

    • 不依赖于比较,用关键字查找
    • %
    • 冲突解决
      1.开放定址法 除留余数法冲突就加: 线性探测再散列+1+2+3 。 H(k)=k%11.。。
      二次探测再散列1^2 -12,22……(左右找)
      伪随机探测再散列:生成伪随机数
      2.链地址法

    周五:排序

    内部排序:插入 选择 交换 归并 基数

    • 基本操作:比较、移动
    • 衡量好坏:时间效率、空间效率、稳定性(两个相同数AB顺序保持不变)
    插入排序
    • 直接插入:大于等于前面的,所以是稳定的
    • 最好情况:每个关键字比较一次,n-1次
    • 最坏情况:完全是逆排序,(n+2)(n-1)/2---------就相当于n+1的前n项和-1

    注意!多了一个哨兵,而且第一次不用比
    折半,减少比较次数

    • 折半插入排序
    • 2-路插入

    选两个数一个放头一个放尾,大于49的从左开始,小于38的从右开始

    • 希尔排序:分组交换排序,最后一组可能三个数排序
      d增量每次都/2
    交换排序
    • 冒泡排序
    • 快速排序
      枢轴
    • 选择排序

    选择排序

    • 简单选择
      最好,正序排列 0次
      最坏,(n-1)次

    归并排序

    多关键字排序
    3.2堆排序

    教材学习中的问题和解决过程

    • 问题1:设置哨兵的算法应该如何实现?
    • 问题1解决方案:在线性查找时我们用到了哨兵,,将a[0]设置成监视哨则可以避免每次比较元素后都需要判断下标。
        /*带哨兵的直接顺序查找*/
    int sequential_search(int a[],int n,int key)  //n为数组元素个数,key为待查找元素
    {
        int i=n;
        a[0]=key;   //a[0]是监视哨
    
        while(a[i]!=key)  //若数组中无key,则一定会得到a[0]=key
            i--;
    
        return i;     //查找失败返回0
    }
    
    • 问题2:插入排序的最坏情况为什么是(n+2)(n-1)/2?
    • 问题2解决方案:按常规思路应该是n(1+n)/2,为什么到了这里变成(n+2)(n-1)/2。反复推敲发现这种计算方法把哨兵也算为一个元素,按照这样即为算的时候只需要元素个数假装加一即可。

    • 问题3:根节点到子节点的路径以及根节点到叶子节点的所有路径梳理
    • 问题3解决方案:
    1. 当用前序遍历的方式访问到某一个节点的时候,我们把该节点添加到路径中。
    2. 如果该节点的值和我们要找的值相等,则打印路径,如果不相等,则继续访问它的子节点。
    3. 当前节点访问结束之后,递归函数将自动回到它的父节点。因此我们在函数退出之前要在路径上删除当前节点,以确保返回父节点时路径刚好是从根节点到父节点的路径。
    4. 如果我们需要保存每条路径,那就需要一个额外的vector< vector < int > >用于保存每一条路径

    代码调试中的问题和解决过程

    • 问题1:在网上看到代码@SuppressWarnings("unchecked")是什么意思
    • 问题1解决方案:
      作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
      使用:
      @SuppressWarnings(“”)
      @SuppressWarnings({})
      @SuppressWarnings(value={})
      示例:
      @SuppressWarnings("unchecked")

    告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。

    @SuppressWarnings("serial")

    如果编译器出现这样的警告信息:The serializable class WmailCalendar does notdeclare a static final serialVersionUID field of type long 使用这个注释将警告信息去掉。

    代码托管

    • pp16.6
    • pp17.1
      前几周忘了截图,这是截止第十周之前的代码,以后会记得按时截图,以下统计代码量按照总增量/3计算。

    上周考试错题总结

    • 错题1

    • 分析:二叉搜索树是一种具有附加属性的二叉树,即左边的子树小于右边的子树。看错了。

    • 错题2

    • 分析:树的一个用途是提供其他集合的更简单的实现。个人的理解是并不是更简单,而是精简算法

    • 错题3

    • 分析:因为我们需要在插入之后遍历树,所以堆中的节点必须存储指向它们的子树。

    • 错题4

    • 分析:同上题,一错错两道。

    • 错题5

    • 分析:当一种类型的对象包含到另一种类型的对象的链接时,有时会调用该对象。即自引用。

    • 错题6

    • 分析:堆栈可以使用链接结构或基于数组的结构来实现

    • 错题7

    • 分析:可以使用链接结构或基于数组的结构来实现队列。

    结对及互评

    点评过的同学博客和代码

    • 本周结对学习情况

      • 20182314
      • 点评:知识点总结的较为详细,错题总结深入。但是代码的问题理解不深。
        基于评分标准,我给本博客打分:14分。得分情况如下:
        感想,体会不假大空的加1分
        排版精美的加一分
        结对学习情况真实可信的加1分
        正确使用Markdown语法
        模板中的要素齐全(加1分)
        错题学习深入的加1分
        点评认真,能指出博客和代码中的问题的加1分
        教材学习中的问题和解决过程, 加5分
        代码调试中的问题和解决过程,加2分
    • 上周博客互评情况

    其他(感悟、思考等,可选)

    第九周主要学习了查找和排序的相关知识,信息量很大,值得认真思考。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 42/42 2/2 20/20
    第三周 394/471 2/4 25/45
    第四周 394/471 2/4 25/45
    第五周 1668/2139 2/6 35/80
    第六周 2388/4527 1/7 30/110
    第七周 1660 /6187 2/9 25/135
    第八周 1660/7847 2/11 20/130
    第九周 1660/9507 2/13 25/155
    • 计划学习时间:25小时

    • 实际学习时间:25小时

    • 改进情况:希望提高效率

    参考资料

  • 相关阅读:
    How to change hostname on SLE
    How to install starDIct on suse OS?
    python logging usage
    How to reset password for unknow root
    How to use wget ?
    How to only capute sub-matched character by grep
    How to inspect who is caller of func and who is the class of instance
    How to use groovy script on jenkins
    Vim ide for shell development
    linux高性能服务器编程 (二) --IP协议详解
  • 原文地址:https://www.cnblogs.com/weiii/p/11889818.html
Copyright © 2011-2022 走看看