• 20182307 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结


    20182307 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结

    教材学习内容总结

    第13章 查找与排序 主要介绍了查找和排序的概念,通过举出不同的例子来具体说明。查找部分以线性查找和二分查找为例,比较了二者的优劣与各自特性;排序部分以选择排序、插入排序、冒泡排序、快速排序、归并排序为例,详细介绍了每一种排序方法的思想与运作机制,比较了各算法之间的时间复杂度。

    学习笔记:

    • 查找
      • 查找是指在一组数据项中找到指定的目标元素
      • 线性查找
        • 扫描整个表,依次将每个值与目标元素进行比较,退出情况为找到目标或扫描至表尾。
        • 1
      • 二分查找
        • 首先,二分查找可应用的数据项必须是有序的
        • 每次查找从中间开始,每次与所选值进行比较后可以减少查找池中一半的元素。
        • 2
      • 比较分析:一般情况下,二分查找比线性查找更有效,但二分查找只可应用于有序的表。
    • 排序
      • 排序是按某种标准将一列数据项按确定的次序重排的过程
      • 选择排序
        • 扫描整个表,分别将每个值放到排好序的最终位置,从而完成一组值的排序
        • 循环中的判断语句条件的更改,可决定排序的形式:升序或降序
      • 插入排序
        • 重复地将一个具体的值插入到表中已有序的子序列中
      • 冒泡排序
        • 扫描整个表,重复地比较表中的相邻元素,如果呈逆序就交换
        • 3
      • 快速排序
        • 先选择表中的一个元素作为划分元素,小于划分元素的所有元素放到划分元素左侧,大于划分元素的所有元素放到它的右侧
        • 当扫描过程在划分点相遇时,划分完成
      • 归并排序
        • 归并排序递归地将表平分为两部分,直到每个子表中只含有一个元素,然后将这些子表归并为有序表,从而完成排序
      • 比较分析:选择排序、插入排序、冒泡排序都有着相近的效率,时间复杂度皆为O(n^2),但是插入排序的最优情形依赖于初始数据的情况,可以为O(n)。

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

    • 问题1:快速排序的稳定性?
      • 个人理解:算法的稳定性,主要考虑的是元素在排序之后次序是否发生变化,这种情况一般发生在遇到相同元素时。例如数列3 3 4 9,标记第一个3为3,如果采用某种排序后3的位置排在了3后,则称这个算法是不稳定的。快速排序时就需要考虑这样的问题,即遇到相同元素时是否需要进行交换,交换就可能导致不稳定,因为次序改变了,所以快速排序并不是一个稳定的算法。
    • 问题2:如何更好的理解快速排序的过程?
      • 网上资料:快速排序|菜鸟教程
      • 个人理解:一个方便简洁的理解方式是“挖坑填坑”思想。比如取表中第一项为划分元素,就认为取出后第一位的位置空缺了,需要别的元素进行填补。因为遵从从小到大的排序方式,从表尾往前扫描,第一个比划分元素小的填入空缺,此时又可以认为该元素的位置空缺了,需要填补,以此类推,直到最后一个元素填入了合适的位置,再将最开始时取出的首位元素即划分元素填入。
      • 4
    • 问题3:递归实现二分查找时怎么确定基本情形?
      • 书本内容:二分查找每次比较都将可行候选者的范围缩小一半,直到最后找到目标元素。
      • 个人理解:二分查找的基本思路是先从一个有序表的中间开始,如果目标大于此中间数,就从表中后一半的数据中开始查找,以此类推。所以若要让递归的二分查找成功运行到基本情形,中间数的记录是至关重要的。如果中间数最终与查找范围的最大或最小重合,则达成基本情形,结束递归。
      • 5

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

    • 问题1:二分查找时,无法处理查找池中数据项为偶数数量的情况
      • 原因分析:二分查找的特点是从中间开始,但偶数的中间数是两个,所以需要在算法中添加对于中间数的定义,比如向下取整的方式。
      • 解决方案:添加mid = (min+max)以定义中间数
      • 6
    • 问题2:线性探查法消除冲突情况时,列表中的10和79无法存入
      • 7
      • 原因分析:消除冲突的循环算法中,j=i+1代码会在i走到过大的值后,导致跳过了可储存的空位。比如空位在第10位,但j过早的加到了11,这样就无法将数存储入空位了
      • 解决方案:让j从较小的、固定的常量2开始循环
      • 8
    • 问题3:编写二叉排序树代码时遇到了困难

    代码托管

    10

    上周考试错题总结

    上周无考试

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 10000行 30篇 400小时
    第一周 209/209 2/2 9/9
    第二、三周 290/499 2/4 18/28
    第四周 516/1015 2/6 22/50
    第五周 2981/3996 2/8 32/82
    第六周 1498/5494 2/10 20/102
    第七周 1519/7013 2/12 51/153
    第八周 1641/8654 2/14 21/174

    点评过的同学博客和代码

    • 本周结对学习情况

    • 结对学习内容
      - 查找算法的学习
      - 排序算法的学习
      - 二分查找的递归实现
      - 算法的最优最坏情形分析

    • 上周博客互评情况

  • 相关阅读:
    ES6 Symbol类型 附带:Proxy和Set
    why updating the Real DOM is slow, what is Virtaul DOM, and how updating Virtual DOM increase the performance?
    React高级指南
    池(Pool)
    计算机网络Intro
    React基础
    CommonJS 与 ES6 的依赖操作方法(require、import)
    webpack初识(biaoyansu)
    关于时间安排贪心算法正确性的证明
    DP总结
  • 原文地址:https://www.cnblogs.com/algerlu/p/11785461.html
Copyright © 2020-2023  润新知