程序 = 数据结构 + 算法
一、基本数据单位
定义:
数据:程序的操作对象,用于描述客观事物 数据的特点:- 1.可以输入到计算机;
- 2.可以被计算机处理。
数据的相关基本概念:
数据对象:性质相同的数据元素的集合(如:数组);数据元素:组成数据对象的基本单位;数据项:一个数据元素由若干数据项组成.
数据对象有一个或多个数据元素,数据元素又由一系列数据项组成。以结构体为例:
用结构体Teacher定义一个
数据元素t,t有数据项char *类型的name、char *类型的title和int类型的age。再定义若干个结构体Teacher的数据元素t1,t2...tn,把这些t1,t2...tn数据元素放到数组tArray中,则tArray称为数据对象。
数据、数据对象、数据元素、数据项之间的关系如下:
二、数据结构
数据结构包括逻辑结构和物理结构(存储结构),描述的是数据之间的关系和数据存储在内存中的方式。
1.逻辑结构
(1)线性结构
线性结构的特点:
- 存在唯一的
第一个元素和最后一个元素;- 除了第一个元素和最后一个元素外,其它元素前后都有一个元素,称之为
前驱和后继;- 第一个元素只有
后续,最后一个元素只有前驱。
常见的线性结构有:
- 线性表
- 栈和队列
- 数组和字符串
结构如下图所示:
(2)非线性结构
除了线性结构以外的数据结构称为非线性结构
- 集合结构:所有的数据元素都包含于某个集合,数据元素之间
不存在直接的关系
- 树结构:所有的数据元素同属于一个树状结构的数据集合中,数据元素的关系是
一对一或一对多的
- 图结构:所有的数据元素同属于一个集合中,数据元素的关系是
多对多的
2.存储结构
- 顺序存储结构:开辟一段
连续的内存空间来存储数据
- 链式存储结构:分别为某个数据元素申请一块内存来存储该数据元素,数据元素之间的内存是
不连续的,但可以通过当前数据元素找到前一个数据元素和后一个数据元素的内存地址
三、算法
1.定义
算法就是解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每个指令表示一个或多个操作。
2.特性
输入和输出:算法必须要有输入和输出,没有输出的算法是没有意义的;有穷性:算法的执行必须在有限的步骤内完成,所占用的资源也是有限的;确定性:对于确定的输入,一定有确定的输出;可行性:算法是可行的。
3.评价标准
正确性:算法最重要的是正确的,能满足需求;可读性:算法要简单明了,思路清晰,能看得懂;健壮性:算法要健壮,不能有bug,更不能crash;高效性:算法的执行效率要高,消耗资源要少。
4.效率度量
效率问题一直是衡量一个算法优劣的重要指标,一般从时间复杂度和空间复杂度两个方面来衡量一个算法。
一般用大O表示法来描述一个算法的复杂度,规则如下:
- 1.用常数1取代运行时间中所有的常数,一个算法的代码执行次数或占用资源的大小只要是一个
确定的常数,它的复杂都是O(1);- 2.在描述算法复杂度时,只
保留最高阶项的复杂度,如n^3 + n^2 + 9,用大O表示法的复杂度为O(n^3);- 3.在描述算法复杂度时,如果在最高阶有常数项相乘,用大O表示法表示复杂度时
去除这个常数,如3n^2表示为O(n^2)。
(1)时间复杂度
时间复杂度是指完成一个算法需要指行指令的次数,有如下几种大O表示法的复杂度:
- 常数阶O(1)
- 线性阶O(n)
- 平方阶O(n^2)
- 对数阶O(logN)
- 立方阶O(n^3)
- NlogN阶O(NlogN)
- 指数阶(不考虑) O(2^n)或者O(n!) 除非是非常小的n,否则会造成噩梦般的时间消耗. 这是一种不切实际的算法时间复杂度. 一般不考虑!
(2)空间复杂度
程序空间复杂度的计算因素有:
- 寄存本身的指令
- 常数
- 变量
- 输入
- 对数据进行操作的辅助空间
在考量算法的空间复杂度时,主要考虑算法执行时所需要的辅助空间,如数组逆序的两种算法的空间复杂度:
- 算法一:常数阶O(1)
上面的算法只用到了一个辅助空间temp,所以它的空间复杂度是O(1)
- 算法二:线性阶O(n)
以上算法先开辟了和a数组相同大小的内存空间的数组b,将a中的数据逆序赋值给b后,再把b顺序赋值给a,需要申请的内存空间由a的大小决定,所以以上算法的空间复杂度是O(n)