算法与复杂度

1 算法定义

算法定义为一个用于实现某个特定任务的有穷指令集,这些指令规定了一个运算序列。

算法特性

  1. 输入性:一个算法必须具有零个或多个输入量
  2. 输出型:一个算法应有一个或多个输出量,输出量是算法计算的结果
  3. 确定性:算法中每一条指令应含义明确、无歧义,即对每一种情况、需要执行的动作都应严格地、清晰地规定
  4. 有穷性:算法的指令执行序列是有穷的
  5. 有效性:每条指令必须是足够基本的。也就是说,他们原则上都能精确到可用笔和纸来模拟实现其指令过程

程序和算法是有区别的,程序可以不满足特性4,可以无穷的执行下去。

算法描述

记录算法中的解题步骤叫算法描述。常用的算法描述的方式有自然语言、流程图和程序设计语言。

自然语言描述算法的优点是使用者不必对描述工具本身花时间来学习,直接用语言描述算法。缺点是容易出现二义性,一些分支及循环结构不能够清晰的被描述出来。

流程图使用图形、直向线和文字说明来描述算法。优点是直观、清晰、易懂,便于检查、修改和交流,其缺陷是严谨性不如程序设计语言,灵活性不及自然语言;此外,对于大型的算法描述有困难。

程序设计语言描述算法清晰、明了,写出的算法一步到位,能由计算机处理。缺点是抽象性差了一点,可能会使写算法的人拘泥于计算步骤描述的细节,而忽略算法的实质。

2 算法性能标准

在面向对象的程序中,通过类来实现数据结构,还要实现类中的各个服务的算法。一旦确定了类的数据结构,就必须描述这些算法的设计和实现。

设计标准

  1. 正确性
  2. 可用性:算法应能方便使用。因此需要算法有良好的界面和完备的用户文档
  3. 可读性
  4. 效率:主要指算法执行时存储单元的开销和运行时间的耗费。
  5. 健壮性

3 算法复杂度

算法的执行效率因算法的运行环境不同而不同,因此算法复杂度的评估需要采用与运行环境和编译系统无关的方式。

时间复杂度

算法的时间复杂度与具体的机器以及运行环境无关,与求解问题的规模有关,它是问题规模的函数。

算法的时间效率分析通常采用O(f(n))表示法。其定义可描述为T(n)=O(f(n))当且仅当存在正常数c和n0,使得对所有的n,当n>=n0时,都满足T(n)<=cf(n)。换句话说,O(f(n))给出了函数T(n)的上界。

T(n)=O(f(n))表示:随同问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,剪成时间复杂度。或者说,两者具有相同的数量级。

空间复杂度

空间复杂度作为算法所需存储空间的度量,记作S(n)=O(f(n))

这里所说的存储空间不是指程序本身、常数和指针所需要的存储空间,也不是指输入数据所占用的存储空间,而是指解题过程所需要的辅助空间。

参考:

数据结构 c++实现 缪淮扣 科学出版社

猜你喜欢

转载自blog.csdn.net/jdbdh/article/details/82109155