第12章
算法分析前端
什么叫作算法:是对特定问题求解方法,或者说是步骤的一种描述。node
什么叫作好算法(具备如下标准):git
1.正确性程序员
2.可读性算法
3.健壮性后端
4.通用性数组
5.效率与储存空间需求数据结构
冰与火之歌:【时间】与【空间】复杂度函数
时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化状况并肯定T(n)的数量级。学习
算法的时间复杂度,也就是算法的时间量度,记做:T(n)= O(f(n))。它表示随问题规模的增大,算法执行时间的增加率和f(n)的增加率相同,称为算法的渐进复杂度,简称为时间复杂度。
其中f(n)是问题规模n的某个函数。这样用大写 O() 来体现算法时间复杂度的记法,咱们称为大O记法
第14章
1、栈
栈是一个线性集合,其元素的添加及删除都在一端进行。栈的处理数据方式为后进先出,最后入栈的元素最早移出栈,使用栈处理问题听从反序。
2、链式结构
在计算机中用一组任意的存储单元存储线性表的数据元素,利用指针能够对链中的各类元素进行添加删除等操做,比较方便。
3、利用数组实现栈
首先了解数组的几个关键特性:存储在数组中的元素的下标为0到n-1,其中n是数组总的单元数。一个数组是一个对象,应该分别对其中所保存的对象进行实例化。设计栈的数组时,栈底总位于数组下标为0的位置,栈中的元素按序连续保存在数组中。在这个类中定义pop、push、peek、isEmpty等操做。
4、使用链实现栈
使用链表来实现栈,仅须要一个引用指向表的第一个结点,并了解表中的元素个数count,基于栈只容许在一端添加或删除元素这个属性,因此只须要在链表的一端进行操做。在这个类中也一样定义push、pop、peek等操做。
第15章
队列
什么是队列:队列是一种特殊的线性表,特殊之处在于它只容许在表的前端进行删除操做,而在表的后端进行插入操做,和栈同样,队列是一种操做受限制的线性表。(先进先出)
实现队列
与栈相似:
数组每次被填满后,加入下一个元素时,把数组拓展成现有数组的两倍大小。
每次移除元素时,检测数组空余空间有多少。当数组里的元素个数只有整个数组大小的四分之一时,数组减半。
不一样之处在于:
因为是先进先出,移除是从队列的最前端开始的。因此当咱们移除数个数据后,队列数据是存储在数组的中间部分的。令队列数据的尾端数据ID为Num,首端数据ID为HeadIndex,则Num - HeadIndex为队列数据元素个数。
当队列数据元素个数为整个数组空间的四分之一时,数组减半,且队列数据左移至数组最左端。即Num-=HeadIndex;HeadIndex=0;
问题1:什么是时间复杂度和空间复杂度?
书本内容:增加函数代表问题大小(n)与但愿优化的值之间的关系。
我的理解:书上并无详细介绍时间复杂度与空间复杂度的概念,因此我去查阅了相关资料。时间复杂度是指执行这个算法所须要的计算工做量;而空间复杂度是指执行这个算法所须要的内存空间。通俗讲,时间复杂度考虑的就是算法运行的时间,而这是与算法的效率与设计息息相关的。举例来讲,若是有一个多重循环且必须执行到底的算法,那它的时间复杂度必定很高。空间复杂度则顾名思义,考虑的是算法须要占用的空间、须要占用计算机资源的多少。
问题2:什么是泛型?
书本内容:泛型可用于定义一个类,它保存、操做并管理直到实例化时才肯定类型的对象
我的理解:泛型是程序设计语言的一种特性。容许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须做出指明。各类程序设计语言和其编译器、运行环境对泛型的支持均不同。
问题3:管理链表中,哨兵结点的存在能够去掉处理第一个结点的特殊情形,哨兵结点的用法是怎么样的?
问题3解决方案:我在网上找到了一段介绍哨兵结点的文字:“哨兵节点(sentinel)是一个哑元节点(dummy node),能够简化边界条件。是一个附加的链表节点,该节点做为第一个节点,它的值域中并不存储任何东西,只是为了操做的方便而引入的。若是一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点。
不少状况下,须要处理当前节点的前驱节点,若是是没有哨兵节点的链表,对第一个节点,即头节点,没有前驱节点。若是不做特殊处理,就可能出错;若是对它特别对待,就会增长代码复杂性,还会下降程序效率。而若是有哨兵节点的话, 线性表的每一个位置的节点都有前驱节点,所以能够统一处理。
当链表为空时,没有哨兵节点的链表的头节点为NULL,处理起来也和其余状况不一样。带哨兵节点的链表,当其为一个空链表时,仅含哨兵节点,哨兵节点的指针域为空,和其余状况的表尾是同样的。”我仍是更倾向于叫他虚位结点,它做为一个假的首结点,里面为空,真正链中第一个元素在第二个节点中,对链表中首位元素的插入和删除就能够在第一个结点和第二个结点之间进行,避免对第一个结点的特殊操做,提升效率。
问题1:不清楚LinkedStack中的pop方法。
T result = top.getElement();
top = top.getNext();
count-;
问题1解决方案:结合LinearNode代码理解,先将top中的元素获取并赋值给result,返回result,再用LinearNode中的getNext方法获取下一个元素到top中,这样实现了弹出元素的操做。
https://gitee.com/li_jinquan/ljq/tree/master/
上周无考试
本周结对学习状况
20182311
本周事情比较多,学习时间不足,须要及时调整,花更多时间和精力去调整。继续加油。
《Java程序设计与数据结构教程(第二版)》
《Java程序设计与数据结构教程(第二版)》学习指导