//===================================================//
// //
// 基本概念 //
// //
//===================================================//
一. 进阶高手的大门
(1)理解程序的本质
程序是为了实际的问题而存在的,从本质上而言,程序是解决问题的步骤描述。
(实际问题==>深入分析问题==>解决问题的步骤==>将解决步骤翻译成程序)
首先理解实际问题:
1.确认问题类型,如:数值计算,求最小值个数
2.确认求解的步骤
解决方案的对比:
1.用尽量少的内存空间解决问题
2.用尽量少的解决问题的步骤
二. 数据的艺术
(1)数据结构起源
计算机从解决数值计算问题到解决生活中的问题
现实生活中的问题涉及不同个体间的复杂联系
需要在计算机程序中描述生活中个体间的联系
数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系。
数据:程序的操作对象,用于描述客观事物。
数据特点:可以输入到计算机;可以被计算机程序处理。
数据元素:组成数据的基本单位
数据项:一个数据元素由若干数据项组成
数据对象:性质相同的数据元素的集合
数据元素:
数据元素之间不是独立的,存在特定的关系,这些关系就是结构。
数据结构指数据对象中数据元素之间的关系。
(2)逻辑结构
1.集合结构
数据元素之间没有特别的关系,仅属于相同集合。
2.线性结构
数据元素之间是一对一的关系。
3.树形结构
数据元素之间存在一对多的层次关系。
4.图形结构
数据元素之间是多对多的关系。
(3)物理结构
逻辑结构在计算机中的存储形式。
1. 顺序存储结构
将数据存储在地址连续的存储单元里。
2. 链式存储结构
将数据存储在任意的存储单元里,通过保存地址的方式找到相关联的数据元素。
三. 程序的灵魂--算法
(1)数据结构与算法
数据结构只是静态的描述了数据元素之间的关系
高效的程序需要在数据结构的基础上设计和选择算法。
高效的程序 = 恰当的数据结构 + 合适的算法
(2)算法的定义
算法是特定问题求解步骤的描述,在计算机中表现为指令的有限序列
算法是独立存在的一种解决问题的方法和思想。
对于算法而言,语言并不重要,重要的是思想。
算法的特性:
1.输入 算法具有0个或者多个输出
2.输出 算法至少有1个或者多个输出
3.有穷性 算法在有限的步骤之后会自动结束而不会无限循环
4.确定性 算法中的每一步都有确定的含义,不会出现二义性
5.可行性 算法的每一步都是可行的
算法设计的准则:
1.正确性
算法对于合法数据能够得到满足要求的结果
算法能够处理非法输入,并得到合理的结果
算法对于边界数据和压力数据都能得到满足要求的结果
(注:正确性是算法最需要满足的基本的准则,但是作为计算机程序,不可能无限制的满足这条准则。)
2.可读性 算法要方便阅读、理解、交流 (决不可忽视)
3.健壮性 算法不应该产生莫名其妙的结果
4.高性价比 利用最少的时间和资源得到满足要求的结果
四. 审判程序的而灵魂
(1)算法效率的度量
1.事后统计法
比较不同的算发对同一组输入数据的运行处理时间
缺陷:
为了获得不同算法的运行时间必须编写相应程序
运行时间严重依赖硬件以及运行时的环境因素
算法的测试数据的选取相当困难
2.事前分析估算法
依据统计的方法对算法效率进行估算
影响算法效率的额主要因素:
算法采用的策略和方法
问题的输入规模
编译器所产生的代码
计算机执行的速度
3.大O表示法
算法效率严重依赖与操作数量
在判断时首先关注操作数量的最高次项
操作数量的估算可以作为时间复杂度的估算
O(5)=O(1) 常数阶
O(2n+1)=O(n) 线性阶
O(n^2+n+1)=O(n^2) 平方阶
O(3n^3+1)=O(n^3) 立方阶
关系:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
时间复杂度:在没有特殊说明时,我们分析的算法时间复杂度都是指最坏时间复杂度。
空间复杂度:算法的空间复杂度通过计算算法的存储空间实现
S(n) = O(f(n))
其中,n为问题规模,f(n)为在问题规模为n时多占用存储空间的函数。
大O表示法同样适用于空间复杂度。
(2)空间与时间的策略
多数情况下,算法执行时所使用的时间更令人关注
如果有必要,可以通过增加空间复杂度来降低时间复杂度
同理,也可以通过增加石家复杂度来降低空间复杂度