数据结构
1.1什么是数据结构
Q1如何摆放图书----取决于所给条件
乱放-好放难找,顺序-难放可二分查找,分类加顺序-如何分类,开辟多大内存
Q2printn函数
循环快,写繁琐;递归慢,写简洁;
Q3多项式函数–关于秦九韶公式的两种实现,本质是看出可以使用秦九韶公式
C语言提供一个函数叫clock(),捕捉从程序开始运行到clock()被调用时所耗费的时间,这个时间单位是clock tick,即时钟打点----常数CLK_TCK机器时钟每秒所走的时钟打点数,不同机器不一样
注意调用time.h头文件,注意除以常数CLK_TLK
跑太快了导致两个钟点都是0
解决方法:重复调用这个函数
所以解决问题方法的效率与算法的巧妙程度有关
Q4所以到底什么是数据结构?–线(单行书架) 树(分类书架) 图(书和人的大数据关系网)
那么物理存储结构就是数组,或是链表
数据对象集就是处理对象----书;数据集
相关联的操作----放书取书,C语言中彼此独立而类似C++/java的面向对象语言中存在类这种概念可将其收束
Q5矩阵matrix的抽象数据类型定义
抽象在何处?例如a的数据类型我们不关心,返回值也不限定;矩阵如何存二维数组一维数组十字链表;add先按行加先按列加用什么语言……统统不限
有什么好处?----普适性,不局限于类型限制不能实现
1.2什么是算法
不同于程序,算法必须在有限步骤后终止;因为程序例如操作系统可以持续运行没有终止;
回顾:为什么叫伪码–类似C语言而中间核心语句是用自然语言描述的;什么是选择排序法?
空间爆掉----非正常退出
系统每次调用函数都需要一块空间来存储目前函数的所有状态,而一个循环所占用的空间不变所以不会爆掉
时间复杂度:分析函数运行效率:函数中只有加减乘除,机器加减法太快忽略不计,其实是——
一般就是数该函数中做了几次乘除法(所谓数乘号)–>讲的没有理解,看链接所示
C是常数,每个机器不同
一般情况下研究最坏情况复杂度,因为什么是平均很难确定
我们关心是数据增大复杂度如何增长-----到底做了多少次运算(数乘法)不是我们所关心的主要内容,所以我们不对算法做非常精细的分析,了解粗略的增长趋势-----复杂度的渐进表示法
注意 复杂度的上界和下界不是唯一的;一般取能找的最大的下界和最小的上界#### 注意 log n的底看上去是2,实际上其底的具体值并不重要,不同的底只是差一个常数而已 另,千万不要设计n!的算法
专业行为:见n²算法思考是否能换为nlogn算法
链接前往复杂度详解 <–看这个(建议从3开始)和小窍门结合就够了 陈老师讲的有理有据但运用有困难
链接中同样提到的基本操作重复次数≈=课程中的乘法次数---->在实操中发现这个基本操作不只是所讲的乘除法,例如最大子列问题中的j的循环体内是一个加法、分治法中的一次扫描是一个加法;
---->看过更多的例子我明白了重点不是乘除法加法而是将某一个多次进行的操作作为计数单元****链接中关于O(n)的定义缺少小于的关系,但特别地有一个大O阶计算法则可以详尽依靠同时说明了这一特点;
链接中同样介绍主要研究最坏情况;
链接中特别提到内循环中int j=i时的复杂度仍是平方阶的证明;
-
应用实例:最大子列和问题
1、O(n³)----对于同一个i的每一个不同j都要从i再加一遍所以乘了第三个n
2、O(n²)----对于同一个i的每一个不同j只在前一个j的基础上再加一项
3、运用前学的见n²就改进为nlogn分而治之