- 算法是解决特定问题的步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
- 算法有助于理解数据结构,且程序设计 = 数据结构 + 算法
- 算法的特性:输入、输出、有穷性、确定性和可行性。
- 输入、输出:
- 算法具有零个或多个输入
- 算法至少有一个或多个输出
- 算法具有零个或多个输入
- 有穷性:指算法在执行有限的步骤后可以自动结束,而不会出现无限循环。并且每一个步骤都在可接受的时间内完成。
- 确定性:算法的每一步都有具体、确定的含义,不会出现二义性。
- 可行性:算法的每一步都能够通过执行有限的次数完成。可转换为程序上机运行,并得到正确的结果。
- 输入、输出:
- 算法的设计要求:正确性、可读性、健壮性和高效性。
- 正确性:指算法应该至少具有输入、输出、无歧义的处理过程,能正确地反映需求,得到问题的正确答案。具体的:
- 1.程序没有语法错误。
- 2.对合法输入能产生满足要求的输出。
- 3.对非法输入能产生对应说明的结果。
- 4.对于极端测试数据能产生满足要求的输出。
- 以上难度逐级递增,一般情况下将层次3作为判断一个算法是否正确的标准。
- 1.程序没有语法错误。
- 可读性:便于阅读、理解和交流。
- 健壮性:输入非法时,算法能做出相关处理,而不是产生异常或者直接崩掉。
- 高效性:时间效率高、存储量低。
- 正确性:指算法应该至少具有输入、输出、无歧义的处理过程,能正确地反映需求,得到问题的正确答案。具体的:
- 算法效率的度量方法:
- 事后统计法:针对设计好的测试程序或数据,通过计算机运行对比耗时,从而确定算法效率高低。有很大缺陷:
- 1.必须依据算法事先写好程序。
- 2.依赖硬件、软件等环境。
- 3.测试数据设计困难。测试数据规模大小有可能影响算法的表现。
- 1.必须依据算法事先写好程序。
- 事前分析估算方法:在编写程序前,依据统计方法对算法进行估算。
- 明确:分析程序的运行时间时不关心程序由什么语言编写,不关心跑在什么硬件上,只关心实现它的算法。
- 依据算法时间复杂度估算算法时间效率:
- 影响程序运行消耗时间因素一般为:
- 1.算法采用的策略及代码质量。
- 2.编译后的代码质量。
- 3.输入数据的规模。
- 4.计算机执行速度。
- 其中2、4分别为软件、硬件影响。抛开软硬件因素,一般关注算法的好坏和输入的规模。
- 1.算法采用的策略及代码质量。
- 函数的渐近增长:
- 定义:规定,在输入规模n没有限制的情况下,如果存在一个整数N,使得对于所有的n>N,函数f(n)总比函数g(n)大,则我们说f(n)的增长渐近快于g(n)。
- 判断一个算法的效率时,函数中除最高阶项外,其他次要项常常可被忽略。由上图也可看出,判断算法的好坏,只通过少量数据是无法做出准确判断的。
- 定义:规定,在输入规模n没有限制的情况下,如果存在一个整数N,使得对于所有的n>N,函数f(n)总比函数g(n)大,则我们说f(n)的增长渐近快于g(n)。
- 算法时间复杂度(算法的时间度量)
- 定义:在进行算法分析时,语句的总执行次数T(n)是关于问题规模n的函数,通过分析T(n)随n的变化情况可确定T(n)的数量级,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和问题相关函数f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。该记法:O(f(n))称为大O记法。
- 推导大O阶方法应遵循:
- 1.用常数1取代运行时间为常数的结果。即若执行次数的大小与n值变化无关,执行时间恒定,我们称之为具有O(1)的时间复杂度,又叫常数阶。
- 2.只保留最高阶项。
- 3.最高阶项系数若不为1,按1处理。
- 1.用常数1取代运行时间为常数的结果。即若执行次数的大小与n值变化无关,执行时间恒定,我们称之为具有O(1)的时间复杂度,又叫常数阶。
- 定义:在进行算法分析时,语句的总执行次数T(n)是关于问题规模n的函数,通过分析T(n)随n的变化情况可确定T(n)的数量级,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和问题相关函数f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。该记法:O(f(n))称为大O记法。
- 影响程序运行消耗时间因素一般为:
- 明确:分析程序的运行时间时不关心程序由什么语言编写,不关心跑在什么硬件上,只关心实现它的算法。
- 事后统计法:针对设计好的测试程序或数据,通过计算机运行对比耗时,从而确定算法效率高低。有很大缺陷: