《大话数据结构》读书笔记(二) -- 算法
一、算法的定义
-
算法这个单词最早出现在波斯数学家阿勒·花刺子密在公元825年(相当于中国的唐朝时期)所写的《印度数字算术》中。
-
如今普遍认可的对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
二、算法的特性
- 五个基本特性
- 输入:具有零个或多个输入
- 输出:至少有一个或多个输出
- 有穷性:指在算法在执行有限的步骤后自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成
- 确定性:每一步骤都具有确定的含义,不会出现二义性
- 可行性:每一步都必须可行的,也就是说,每一步都能够通过执行有限次数完成
三、算法设计的要求
- 正确性
- 可读性
- 健壮性
- 时间效率高和存储量低
四、算法效率的度量方法
-
事后统计方法(不推荐):通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。但这种方法显然是有很大的缺陷的:
- 必须依据算法事先编制好程序,这通常需要花费大量的时间和精力。如果编制出来发现它根本是很糟糕的算法,不是竹篮打水一场空吗?
- 时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣
- 算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。
-
事前分析估算方法(推荐):在计算机程序编制前,依据统计方法对算法进行估算。经过分析,一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
1.算法采用的策略、方法
2.编译产生的代码质量
3.问题的输入规模
4.机器执行指令的速度第1条当然是算法好坏的根本,第2条要由软件来支持,第4条要看硬件性能。也就是说,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。
最终,在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤。
五、函数的渐进增长
六、算法时间复杂度
-
定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
-
这样用大O()来体现算法时间复杂度的记法,我们称之为大O记法。
- 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
-
推导大O阶方法
1.用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数,得到的结果就是大O阶。 -
常见的时间复杂度
七、最坏情况与平均情况
八、算法空间复杂度
九、结尾语
希望大家在今后的学习中,好好利用算法分析的工具,改进自己的代码,让计算机轻松一点,这样你就更加胜人一筹。
参考:《大话数据结构》
程杰 著