数据结构的重要性不言而喻,以下就是最好的证明:
数据结构是计算机专业的基础课程,但也是一门不太容易学好的课。曾经有人说过一个段子:如果你交给某人一个程序,你将折磨他一整天;如果你教会某人如何编写程序,你讲折磨他一辈子。同一个结果由于使用不同的算法产生不同效益。可想而知,数据结构的重要性不言而喻,以下就是最好的证明:
程序设计 = 数据结构 + 算法
这个公式也说明了数据结构 与 算法 难分难解的关系。
1、从定义说起
算法,解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
2、基本特性
输入输出:0或多个输入,1或多个输出
有穷:执行有限步骤后,自动结束而不会出现无限循环
确定:每一步骤都具有确定含义,不存在二义性
可行:每一步都在有限次数内完成
基本特性定义了一个算法的雏形,但一个“好”算法还需要具备更多的特性。就像房子建好后,要变成一个舒服的居住环境,还需要做更多的装修与装饰工作,也就是所谓的“设计”。
3、算法设计的要求
- 正确性——输入、输出、加工处理无歧义性,能正常反映问题的需求、能得到问题的正确答案。
分为四个层次:
(1) 语法无错
(2) 对合法输入能产生满足要求的输出结果
(3) 对非法输入能得出满足规格说明的结果
(4) 对精心选择的、甚至故意刁难的测试数据,都有满足要求的输出结果
一般情况下,把 层次3 作为一个算法是否正确的标准。
可读性——便于阅读、理解和交流、维护
健壮性——当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名奇妙的结果。
- 时间效率高和存储量低
4、算法效率度量方法
事后统计——利用计算机计时器对不同算法编制的程序的运行时间进行比较 。
不科学、不准确,存在较大缺陷,实际中不使用。
事前分析估算——在程序编制前,依据统计方法对算法进行估算
根据经验,程序运行时间取决于下列因素:
(1) 算法采用的策略、方法 决定算法好坏的根本
(2) 编译产生的代码质量 主要由软件来支持
(3) 问题的输入规模 实际问题决定
(4) 机器执行指令的速度 取决于硬件性能
以上分析可以看出,
一个程序的运行时间,依赖于算法的好坏和问题的输入规模。
5、算法时间复杂度
大O记法:(从小到大依次排列)
推导大O阶:
(1) 常数1取代运行时间中的所有加法常数
(2) 修改后的运行次数函数中,只保留最高阶项
(3) 如果最高阶项存在且不是1,则去除与这个项相乘的常数
比如,f(n)=3n2+2n+1
最终可以记为 O(n^2^)
理解大O推导不难,难的是分析数列的一些运算,更多的是考察你的数学知识和能力。
6、强调算法的重要性
一台老式CPU的计算机运行 O(n) 的程序和一台速度提高100倍的新式CPU运行 O(n2) 的程序。最终效率高的胜利方式却是老式CPU的计算机,原因在于算法的优劣直接决定了程序运行的效率。