热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20182323201920201《数据结构与面向对象程序设计》第7周学习总结

目录[toc]学号201823232019-2020-1《数据结构与面向对象程序设计》第7周学习总结教材学习内容总结第12章算法分析什么叫做算法:是对特定问题求解方法,或者说是步骤

目录

[toc]


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

教材学习内容总结


第12章



  • 算法分析



  1. 什么叫做算法:是对特定问题求解方法,或者说是步骤的一种描述。



  2. 什么叫做好算法(具有以下标准):



    1. 正确性

    2. 可读性

    3. 健壮性

    4. 通用性

    5. 效率与储存空间需求



  3. 冰与火之歌:【时间】与【空间】复杂度





  • 时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。



  • 算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进复杂度,简称为时间复杂度。



  • 其中f(n)是问题规模n的某个函数。这样用大写 O() 来体现算法时间复杂度的记法,我们称为大O记法





  1. 常见的时间复杂度如下图所示:



  2. 每个复杂度的时间比如下图所示:




第14章






  1. 什么是栈:栈是一个有序集合,其中添加和删除元素都是发生在同一端,通常称作发生操作的这一端为顶部,对应的端为底部。(先进后出)



  2. 栈的操作:



  3. 利用栈完成后缀表达式的计算:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出来。



  4. 实现队列的两种编程方法:



    1. 链表实现

    2. 数组实现




第15章



  • 队列



  1. 什么是队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。(先进先出)

  2. 实现队列

    1. 与栈类似:

      1. 数组每次被填满后,加入下一个元素时,把数组拓展成现有数组的两倍大小。

      2. 每次移除元素时,检测数组空余空间有多少。当数组里的元素个数只有整个数组大小的四分之一时,数组减半。



    2. 不同之处在于:

      1. 由于是先进先出,移除是从队列的最前端开始的。所以当我们移除数个数据后,队列数据是存储在数组的中间部分的。令队列数据的尾端数据ID为Num,首端数据ID为HeadIndex,则Num - HeadIndex为队列数据元素个数。

      2. 当队列数据元素个数为整个数组空间的四分之一时,数组减半,且队列数据左移至数组最左端。即Num-=HeadIndex;HeadIndex=0;





图中,HeadIndex=2;Num=5;


  1. 实现队列的两种编程方法:

    1. 链表实现

    2. 数组实现




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



  • 问题1:在用数组实现队列时,为什么环形数组较其他数组较好?



  • 问题1解决方案:



    1. 环形数组的优点:

      可以有效的利用资源。用数组实现队列时,如果不移动,随着数据的不断读写,会出现假满队列的情况。即尾数组已满但头数组还是空的;循环队列也是一种数组,只是它在逻辑上把数组的头和尾相连,形成循环队列,当数组尾满的时候,要判断数组头是否为空,不为空继续存放数据。



    2. 但是呢,环形数组还是有缺点的:

      循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件frOnt==rear来判别队列是"空"是"满"。



    3. 拓展知识:

      为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环(环形)队列。





  • 问题2:链表和数组的优缺点



  • 问题2解决方案:





  1. 不同点:



    1. 链表是链式的存储结构;数组是顺序的存储结构。

    2. 链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。

    3. 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。



  2. 相同点:

    两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。




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



  • 问题1:编程练习的时候,排序时第一个位置并不参与



  • 解决过程:

    关键代码



public void SelectionSortList(){
int min;
SelectionSortNode a = null;
SelectionSortNode b = null;
for (a=list.next;a!=null;a=a.next){
for (b=a.next;b!=null;b=b.next){
if (a.num>b.num){
min = b.num;
b.num = a.num;
a.num = min;
}
}
}
}

经检查后发现,a=list.next导致跳过了节点的头,所以第一个节点被跳过了,因此它并没有参与排序;

修改后的代码:

public void SelectionSortList(){
int min;
SelectionSortNode a = null;
SelectionSortNode b = null;
for (a=list;a!=null;a=a.next){
for (b=a.next;b!=null;b=b.next){
if (a.num>b.num){
min = b.num;
b.num = a.num;
a.num = min;
}
}
}
}

输入a=list,重新运行。


代码托管


结对及互评


点评模板:



  • 博客中值得学习的或问题:



    • 随着学习内容难度增加,问题分析更加深刻

    • 不断查阅资料,努力解决出现的问题



  • 代码中值得学习的或问题:



    • 代码的逻辑性有待提高

    • 代码中适当加入注释会更好



  • 基于评分标准,我给本博客打分:12分。得分情况如下:





  1. 正确使用Markdown语法(加1分):



    • 不使用Markdown不加分

    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)

    • 排版混乱的不加分



  2. 模板中的要素齐全(加1分)



    • 缺少“教材学习中的问题和解决过程”的不加分

    • 缺少“代码调试中的问题和解决过程”的不加分

    • 代码托管不能打开的不加分

    • 缺少“结对及互评”的不能打开的不加分

    • 缺少“上周考试错题总结”的不能加分

    • 缺少“进度条”的不能加分

    • 缺少“参考资料”的不能加分



  3. 教材学习中的问题和解决过程(2分)



  4. 代码调试中的问题和解决过程(2分)



  5. 本周有效代码超过300分行的(加0分)



  6. 其他加分:



    • 周五前发博客的加1分

    • 感想,体会不假大空的加1分

    • 进度条中记录学习时间与改进情况的加1分

    • 有动手写新代码的加1分

    • 错题学习深入的加1分

    • 点评认真,能指出博客和代码中的问题的加1分

    • 结对学习情况真实可信的加1分





  • 参考示例


点评过的同学博客和代码



  • 本周结对学习情况

    • 结对同学学号20182315

    • 结对照片

    • 结对学习内容

      • 算法分析,栈,队列






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



  • 这两周学习任务有点重,学习的东西更加难了,加油加油。

  • 课外的知识汲取很有必要,没事可以多看看别人的博客,交流经验


学习进度条































































代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标10000行30篇400小时
第一周77/772/215/15
第三周424/5013/530/30
第四周393/8942/730/30
第五周320/12141/830/30
第六周904/21182/1030/30
第7周1350/34683/1330/30


  • 计划学习时间:25小时



  • 实际学习时间:20小时



  • 改进情况:




参考资料



推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
mobiledu2502874233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有