ADT 抽象数据类型名 Data 数据元素之间逻辑关系的定义 Operation 操作1 初始条件 操作结果描述 操作2 .... 操作n .... endADT
二、算法基础 1.什么是算法? 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示i一个或多个操作。具体的说,为了解决某个或某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每个操作都完成特定的功能,这就是算法了。 2.算法有哪些特性? (1)输入输出:算法具有零个或多个输入;至少有一个或多个输出。 (2)有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可以接受的时间内完成。 (3)确定性:算法的每一步骤都具有确定的含义,不会出现二义性。 (4)可行性:算法的每一步都必须是可行的 3.算法的设计要求有哪些? (1)正确性 (2)可读性 (3)健壮性:指当输入数据不合法时,算法也能作出相关处理,而不是产生异常或莫名奇妙的结果 (4)时间效率高和存储量低 4.算法效率的度量方法 (1)事后统计方法:这种方法主要是通过设计好测试程序的数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较。 (2)事前分析估算方法:一个用高级程序编写的程序在计算机上运行的所消耗的时间取决于:算法采用的策略和方法(算法好坏的根本);编译产生的代码质量(软件环境决定);问题的输入规模;机器指令执行的速度(硬件决定)。 注意:测定运行时间最可靠的方法就是计算对运行时间有消耗的基本操作的执行次数,运行时间与这个计数成正比。 某个算法,随着n的增大,它会越来越优于另一算法,或者越来越差于另一算法。 三、算法时间复杂度 1.定义:在进行算法分析时,语句的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))---它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。 其中,O()来体现算法时间复杂度的记法(大O记法)。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。 2.推到大O阶方法:分析一个算法的时间复杂度,其原则具体表现如下:
原则一:用常数1取代运行时间中的所有加法常数-------------------举例:f(n)=3,则根据大O阶方法时间复杂度为O(1) 原则二:在修改后的运行次数函数中,只保留最高阶项--------------举例:f(n)=3n+1 原则三:如果最高阶项存在且不是1,则去除与这个相乘的常数。-----举例:---------则根据大O阶方法时间复杂度为O(n)0
3.常见时间复杂度:根据程序语句执行的次数,可以求得算法的时间复杂度 (1)常数阶 源码:int sum=0,n=100; /*执行一次*/ sum=(1+n)*n/2; /*执行一次*/ printf("%d",sum); /*执行一次*/ 程序执行次数为3次,根据原则一可知,时间复杂度为O(1)。 (2)线性阶 源码: int i; for(i=0;i
4.最坏情况和平均情况 (1)最坏情况:最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求。通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。 (2)平均情况:平均运行时间是所有情况中最有意义的,因为他是期望的运行时间。 四、算法空间复杂度
算法的控件复杂度通过计算算法所需的存储空间实现,算法控件复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占