object(stdClass)#31 (2) { ["docs"]=> array(0) { } ["count"]=> int(0) } 读书笔记:《大话数据结构》第二章算法 - 爱码网

算法

1.算法定义
算法是针对特定问题求解步骤的描述,在计算机上表现为指令的有限序列,并且每个指令表示一个或者多个操作。
2.算法特性
输入:0个输入或者大于0个输入,带参数和不带参数的问题。
输出:至少有一个输出。
确定性:算法每个步骤含义确定,无二义性。
可行性:每个步骤能在有限次内完成。
有穷性:算法有终止条件,并且执行算法的每个步骤都是在可接受的时间里完成 。
3.好算法的标准(算法设计的要求)
正确性:好的算法起码得满足算法的五个特性。
可读性:便于计算机或者是别人理解与阅读。
健壮性:不仅对合法的输入有正确的处理,对于不合法的输入有应该有相应的处理,而不是直接报错或者产生莫名其妙的结果。
高效率与低存储需求:既要马儿跑得好,又要马儿少吃草。花最少的钱、最短的时间、办最大的事。
4.算法效率的度量方法
定义:算法效率大多是指算法执行的时间。
度量方法:

  1. 事后统计法:根据算法设计程序,用数据测试程序进行运行时间统计。
    缺点:
    编程需要时间和精力,有可能运行程序后才发现算法很差。
    时间的比较依赖计算机软硬件,评估结果不能客观反映算法好坏。
    程序运行时间和测试数据规模有较大关系。
    所以,一般不用此方法。
  2. 事前分析估算法:编程前通过统计方法进行估算。
    程序运行时间依赖于算法的好坏和问题输入规模(输入量的多少)。
    该方法的关键是在分析程序运行时间时,把程序看成是独立与程序设计语言的算法或者一系列步骤。
    因此,在分析一个算法时间时,最重要的是把基本操作的数量和输入规模关联起来,即基本操作数量必须表示成输入规模的函数。如下图所示。

读书笔记:《大话数据结构》第二章算法

5.函数的渐进增长
定义:给定两个函数f(n)和g(n),如果存在一个整数N,使得对所有的n>N,f(n)总是大于g(n)的,则说f(n)的增长渐近快于g(n)。可以得出的结论:判断一个算法的好坏,只通过少量的数据是不能做出准确的判断的;还可以分析出:某个算法,随着n的增大,它会越来越优于另一个算法,或者是越来越差于另一个算法。
判断一个算法的效率时,函数中常数项和其它次要项常常可以忽略,而应该关注其最高次项的次数。
6.算法的时间复杂度
定义:算法的时间复杂度(算法的渐近时间复杂度),也就是算法的时间量度,记作:T(n)=O(f(n)),此记法叫作大O记法。其中T(n)是语句执行总次数关于问题规模n的函数,f(n)是问题规模n的某个函数,f(n)是通过大O阶推倒方法得到的最终结果。
推导大O阶的方法步骤如下:
1.用常数1取代运行时间(运行次数函数表达式)中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。
4.得到结果为大O阶。
非官方分类有:
常数阶:O(1)
线性阶:O(n)
对数阶:O(longn)
平方阶:O(n*n)
。。。
7.常见的时间复杂度
常见的时间复杂度如下表。
读书笔记:《大话数据结构》第二章算法
常用的时间复杂度所耗费的时间从小到大依次是:
读书笔记:《大话数据结构》第二章算法
7.最坏情况与平均情况
最坏情况:最坏情况运行时间是一种保证,那就是运行时间不会再坏了。在实际应用中,这是一种最重要的需求,通常,除非特指,所提到的运行时间都是最坏情况下的运行时间。
平均情况:平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。
计算所有情况的平均值,这种时间复杂度的计算方法叫作平均时间复杂度。
计算最坏请情况下的时间复杂度,此方法称作最坏时间复杂度。
一般在没有特殊说明的情况下,都是指最坏时间复杂度。
8.算法空间复杂度
算法的空间复杂度通过计算算法所需要的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题规模,f(n)为语句关于n所占存储空间的函数。
9.重点学习内容
算法时间复杂度的概念及其估算方法。

相关文章: