数据结构(抽象数据类型及算法概念)
自然语言、伪代码描述、流程图、源代码描述(算法给人看,程序给计算机)算法:是为了解决一个或一类问题而规定的一个确定、有限长的操作序列。简单地说,算法就是对问题求解过程的一种描述。定义抽象数据类型复数。...
目录
抽象数据类型:
基本数据对象
相关运算
对象之间的结构关系
例:
定义抽象数据类型复数
ADT Complex{
数据对象:D={e1,e2}//实部和虚部
数据关系:R={<e1,e2>|e1是实部}//<>顺序规定
基本操作:
}ADT Complex

算法和算法分析:
算法:
是为了解决一个或一类问题而规定的一个确定、有限长的操作序列。
简单地说,算法就是对问题求解过程的一种描述。
算法的描述方法:
自然语言、伪代码描述、流程图、源代码描述(算法给人看,程序给计算机)


算法设计的要求:
正确性:
算法的正确性是指算法至少应该具有输入、输出和加工处理无奇异性,能正确反映问题的要求,能够得到问题的正确答案
可读性:
算法设计的另一个目的是为了便于阅读、理解和交流
健壮性:
当输入数据不合法是,算法也能做出相关处理,而不是产生异常和莫名其妙的结果
时间效率和存储量低
算法效率的度量方法
事后统计法:
这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低(这种算法显然与普很大的缺陷:1.必须依据算法事先编制好程序2.比较以来计算机硬件和软件等环境因素)
事前分析估算法:
在计算机程序编制前,依据统计方法对算法进行估算,抛开与计算机硬件、软件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题的输入规模是指输入量的多少。
算法时间复杂度
算法时间复杂度定义:
撒UN发的实际那复杂度,也就是算法的时间度量,记T(n)=O(f(n))。他便是随时间规模n的增大,算法执行的时间的增长率和f(n)的增长率相同,乘坐算法的渐行时间复杂度,简称时间复杂度,其中f(n)使问题规模n的某个函数,大O记法
一般情况下,随着n增大,T(n)增长得最慢的算法为最优算法
推导大O阶方法:
(1)用常数1取代运行时间中所有的加法常数
(2)在修改后的运行次数中,只保留最高阶项
(3)如果最高阶项存在且其系数不是1,则除去与这个项相乘的系数。
得到的结果就是大O阶
常数阶:
略
线性阶:
int i;
for(i=0;i<n:i++){
//时间复杂度为 O(1)的程序步骤序列
}
它的时间复杂度为O(n),因为循环体中的代码需要执行n次
对数阶:
int count=1;
while(count<n){
count*=2;
//时间复杂度为O(1)的程序步骤序列
}
由于每次count乘以2之后,就距离你更近了一步。也就是说,有多少个2相乘后大于n,则会推出循环。由2^x=n,得到x=log2 n。所以这个循环的时间复杂度为O(logn)。
平方阶:
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n:j++){
//时间复杂度为O(1)的程序序列
}
}
内部的时间复杂度为O(n)的语句,再循环n次,所以对于这段代码来讲,时间复杂度为O(n^2).
int i,j;
for(i=0;i<n;i++){
for(j=i;j<n;j++){
//时间复杂度为O(1)的程序序列
}
}
由于i=0时,内循环执行了n次,当i1时,执行了n-1次,........所以执行的总次数为:
n+(n-1)+(n-2)+(n-3)+........+1=n*(n+1)/2=n^2/2+n/2.
从这个例子,我们可以得到一个经验,其实理解大O阶推导不算难,难得时对数列的一些相关运算,这更多考察的是你的数学知识和能力(考研这里不能失分)
方法调用的时间复杂度:
void function(int count){
print(count);
}
int i,j;
for(i=0;i<n;i++){
function(i);
}
function()函数的时间复杂度是O(1),所以整体的时间复杂度为O(n)
void function(int count){
int j;
for(j=count;j<n;j++){
//时间复杂度为O(1)的程序步骤序列
}
}
这个的时间复杂度为O(n^2).
n++;//执行一次
function(n);//执行n次
int i,j;
for(i=0;i<n;i++)//执行n*n次
{
function(i);
}
for(i=0;i<n;i++){//执行n*(n+1)/2
for(j=i;j<n;j++){
//时间复杂度为O(1)的程序步骤序列
}
}
最终这段代码的时间复杂度为O(n^2)
最坏情况与平均情况:
平均运行时间是所有情况中最有意义的,因为他是期望的运行时间,对于算法分析来讲,一般在没有特殊说明的情况下,都是指最坏时间复杂度
算法空间复杂度:
算法的空间复杂度是通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数
若算法执行时所需的辅助空间相对于输入数据而言是个常数,则称此算法为原地工作,空间复杂度为O(1)
通常,我们是用“时间复杂度”来之运行时间的需求,使用“空间复杂度”指空间需求,当不用限定词地使用“复杂度”时,通常指时间复杂度。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)