版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2算法与算法分析主要内容算法算法分析:
问题规模、模型、渐进分析算法(algorithm)算法没有统一的定义,一般认为:算法是一个意义明确的指令(操作)序列。指令序列描述了计算过程,即给定一组数据,得到一个计算结果,计算过程一定会结束。算法例2.1求一元二次方程ax2+bx+c=0的实根
算法算法是一个变换:Out=translate(In)定义了一个部分函数(partialfunction):定义域内有解算法的描述:自然语言+数学语言=>伪代码x1,2
=
f(a,b,c)算法算法的描述:自然语言+数学语言=>伪代码算法的特性有穷性:算法必须在有限步操作后结束。确定性:算法的每个操作应有确切的定义。输入:算法有零个或多个输入。输出:算法有若干个输出。有效性:算法的每个操作应足够简单,能够由计算机完成。程序(program)程序是算法的实现
public
static
booleanrealroot(double
a,double
b,double
c,
double[]roots){
double
deta=b*b-4.0*a*c;
if(deta<0)
return
false;
roots[0]=(-b+Math.sqrt(deta))/(2.0*a);
roots[1]=(-b-Math.sqrt(deta))/(2.0*a);
return
true; }算法≃程序查找问题(searchproblem)例2.2有n个不同的整数,a0,a1,…,an-1
给定整数x,判断是否存在ai与x相等,如果存在,则输出ai的下标i,否则,输出-1。
顺序查找算法基本思想是从左至右,将x和n个整数逐一比较,算法如下:使用变量i表示要与x比较的数据的下标,初始时,令i=0。如果i<n,即尚有未与x比较过的数据,则转(3);否则,输出-1,
结束。如果条件x==ai成立,则输出i,结束。否则令i=i+1,转(2)。使用数组存储数据a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]6856179811671129078顺序查找程序
public
staticintsequentialSearch(int
a[],int
x){
for(int
i=0;i<a.length;i++){
if(x==a[i])
return
i; }
return-1; }查找问题例2.3
有n个不同的整数,并且满足条件a0<a1<…<an-1给定整数x,判断是否存在某个ai与x相等,如果存在,则输出ai的下标i,否则,输出-1。折半查找算法基本思想是不断地循环,每次将查找区间缩小一半,算法如下:使用变量i,j表示数据的下标,查找区间记为[i,j],即从下标i到下标j的有序数据中查找x,初始时令i=0,j=n-1。如果区间[i,j]有数据,即i<=j,则重复(3)-(6),否则,输出-1,结束。计算处于中间位置的数据的下标m,m=i+(j-i)/2。如果x<am,则x只可能出现在区间[i,m-1],令j=m-1,转(2)。如果x>am,则x只可能出现在区间[m+1,j],令i=m+1,转(2)。如果条件x==am成立,输出m,结束。使用数组存储数据ja[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]5668788190112167179ipp=i+(j-i)/2折半查找程序
public
staticintbinarySearch(int
a[],int
x){
int
p,i=0,j=a.length-1;
while(i<=j){
p=i+(j-i>>>1);
if(x<a[p])
j=p-1;
else
if(x>a[p])
i=p+1;
else
return
p; }
return-1; } 阶乘:递推
public
staticlongfactorial(int
n){
if(n==0)
return1;longf=1;
for(int
i=2;i<=n;i++)
f*=i;
return
f; }阶乘:递归5!=5×4!4!=4×3!3!=3×2!2!=2×1!1!=1×0!0!=1
阶乘:递归
public
staticlongfactorial(int
n){
if(n==0)
return1;
else
return
n*factorial(n-1); } f(5)f(4)f(3)f(2)f(1)f(0)执行时间和影响因素影响因素软硬件环境(Enviroment)算法(Algorithm)问题的输入(Input)执行时间是一个函数:T(E,A,I)T(A,I)T(I)=>=>68,56,179,81,167,112,90,7868,56,179,81,78,112,90,16778,112,56,81,179,68,90,167问题的规模规模大,需要的时间长a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]6856179811671129078a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]…?6856179811671129078…32根据问题规模对输入进行分类:规模1的输入、规模2的输入、...、规模n的输入算法的运行时间就是问题规模的函数,记为T(n)。问题的规模相同规模的不同输入问题的规模68,56,179,81,167,112,90,7868,56,179,81,78,112,90,16778,112,56,81,179,68,90,167执行时间:Tworst、Tbest、Tavg问题的规模当有多个问题规模为n的输入时:如果将这些输入中最长的运行时间作为问题规模n的运行时间,这样的T(n)叫作最坏运行时间Tworst如果将这些输入中最短的运行时间作为问题规模n的运行时间,这样的T(n)叫作最好运行时间Tbest如果取这些输入的平均运行时间作为问题规模n的运行时间,这样的T(n)叫作平均运行时间Tavg。算法分析对算法的执行时间和需要的存储空间进行定性分析,以了解算法、比较算法、改进算法。假设程序在一台抽象的计算机上运行(1)这台计算机的指令涉及以下的运算:算术运算比较运算逻辑运算赋值运算移位运算(2)每条指令的执行时间为1个单位(3)执行时间
=指令条数时间复杂度模型顺序查找的执行时间T(n)=3n+2 publicstaticintsequentialSearch(inta[],intx){
for(int
i=0;i<a.length;i++){
if(x==a[i])
return
i; }
return-1; }问题的规模:数据的个数,即a.length,记为n publicstaticintbinarySearch(inta[],intx){
int
p,i=0,j=a.length-1;
while(i<j){
p=i+((j-i)>>>1);
if(x<a[p])
j=p-1;
else
if(x>ap)
i=p+1;
else
return
p; }
return-1; } 每循环1次:9折半查找的执行时间循环多少次?分析一个特殊情形,假设查找区间的数据个数:2m-12m-2……2221202m
即m=log2nnm+1次,即log2n+1
折半查找的执行时间T(0)=1
n=0T(n)=4(n-1)+4=4n
n≥1
public
staticlongfactorial(int
n){
if(n==0)
return1;longf=1;
for(int
i=2;i<=n;i++)
f*=i;
return
f; }问题的规模:n递推的阶乘的执行时间递推式:T(0)=1T(n)=T(n-1)+2
public
staticlongfactorial(int
n){
if(n==0)
return1;
else
return
n*factorial(n-1); } 递归的阶乘的执行时间T(n)=T(n-1)+2=(T(n
-
2)+2)+2=T(n
-
2)+2×2=(T(n
-
3)+2)+2×2=T(n-3)+3×2....=T(1)+(n-1)×2=(T(0)+2)+(n-1)×2=1+2n递归的阶乘的执行时间汉诺塔问题递归程序的执行时间
public
staticvoidhanoi(int
n,char
x,char
y,char
z){
if(n==1) move(x,1,z);
else{ hanoi(n-1,x,z,y); move(x,n,z); hanoi(n-1,y,x,z); } }问题的规模:n假设move方法的用时为1个时间单位:T(1)=2
n=1T(n)=2T(n-
1)+2
n>1递归程序的执行时间T(n)=2T(n
-
1)+2=2(2T(n
-
2)
+
2)
+
2=22T(n
-
2)+22+2=22(2T(n
-
3)+
2)+22+2=23T(n
-
3)+23+22+2=……=2n-1T(1)
+
2n-1
+…
+
22
+
2=2(2n-1
+
2n-2
+…
+
2
+
1)=2(2n
-
1)=2n+1-
22n-1+2n-2+…+2+1=(111......11)2
(2n-1+2n-2+…+2+1)+1=(111......11)2+(1)2=(1000......00)2=2n递归程序的执行时间执行时间的比较以下的两个算法哪个用时少(速度快)?T1(n)=3n+2
渐进时间复杂度分析时间复杂度是对算法所需时间的定性度量,忽略了很多因素比较两个算法的快慢时,不宜比较某个具体的问题规模,如n=5、n=100时谁快谁慢而应比较当n充分大时,谁快谁慢,即比较时间复杂度函数的增长率。BigO的定义
BigO的常见形式 常数阶 O(1)对数阶 O(logn)线性阶 O(n)线性对数阶 O(nlogn)平方阶 O(n2)立方阶 O(n3)k次方阶 O(nk)指数阶 O(2n)BigO的常见形式BigO的计算T1(n)=3n+2≤3n+n当n
≥2≤4n
n0=2,c=4T1(n)=O(n)BigO的计算
BigO的计算
对数的换底公式所以,不关注对数的底T2(n)=O(log2n)⟹T2(n)=O(logn)BigO的用途由于O(n)的增长率比O(log2n)高,所以,随着n的增大,T2(n)比T1(n)需要的时间少。即折半查找比顺序查找快。BigO运算规则
BigO运算规则的应用 publicstaticintbinarySearch(inta[],intx){
int
p,i=0,j=a.length;O(1)+O(1)
while(i<j){O(1),循环O(logn)次
p=i+((j-i)>>>1);O(1)+O(1)+O(1)+O(1)
if(x<a[p])O(1)
j=p-1;
else
if(x>a[p])O(1)
i=p+1;O(1)+O(1)
else
return
p; }
return-1; } BigO运算规则的应用O(1)+O(1)+O(1)+O(logn)(O(1)+......+O(1))O(1)+O(1)+O(1)=O(1+1+1)=O(1)O(1)+......+O(1))=O(1)O(1)+O(logn)O(1)=O(1)+O(1×logn)=O(1)+O(logn)=O(1+logn)=O(logn)BigO运算规则的应用例:n×n矩阵的元素值的和floatsum(floata[][]){ result=0;O(1)for(i=0;i<n;i++)O(n)for(j=0;j<n;j++)O(n) result+=a[i][j];O(1) returnresult;}T(n)=O(1)+O(n)O(n)O(1)=O(1)+O(n×n×1)=O(1)+O(n2)=O(1+n2)=O(n2)Big𝛀
BigO:上界Big𝛀:下界局限性查找问题的2个算法:顺序查找:O(n)折半查找:O(logn)当n比较大时,折半查找比顺序查找快
n比较小时?数据无序时?折半查找的实现比顺序查找的实现复杂局限性coff[0]=a0coff[1]=a1......coff[n]=an多项式求和:anxn+an-1xn-1+...+a2x2+
a1x
+a0
public
staticfloatpolyEval(float
coff[],float
x){
float
y=1,value=coff[0];
for(int
i=1;i<coff.length;i++){
y*=x;
value+=y*coff[i]; }
return
value; }T(n)=7n+4=O(n)局限性a3x3
+
a2x2
+
a1x
+
a0=(a3x2
+
a2x
+
a1)x
+
a0=((a3x
+
a2)x
+
a1)x
+
a0bx
+
ai-1重复多少次???Horner算法:局限性
publicstaticfloatpolyHorner(float
coff[],float
x){
int
n=coff.length-1;
float
value=coff[n];
for(int
i=1;i<=n;i++)
value=value*x+coff[n-i];
return
value; }T(n)=6n+5=O(n)局限性T(n)=6n+5=O(n)T(n)=7n+4=O(n)Horner算法的基本操作少Horner算法的乘法操作少空间复杂性模型只计局部变量的个数不计执行方法时其它必须的空间如方法的返回地址、返回值、中间结果等占用的空间空间复杂性计算
public
staticlongfactorial(int
n){
if(n==0)
return1;longf=1;
for(int
i=2;i<=n;i++)
f*=i;
return
f; }S(n)=3=O(1)空间复杂性计算S(n)=3=O(1)
public
staticintsequentialSearch(int
a[],int
x){
for(int
i=0;i<a.length;i++){
if(x==a[i])
return
i; }
return-1; }空间复杂性计算
public
staticintfactorial(int
n){
if(n==0)
return1;
else
return
n*factorial(n-1); } f(5)f(4)f(3)f(2)f(1)f(0)S(n)=n+1=O(n)程序性能的测量
public
static
voidmain(String[]args){
int
n=100000;
int[]a=new
int[n];
for(int
i=0;i<a.length;i++)
a[i]=i;
long
start=System.nanoTime();//纳秒
for(int
i=0;i<n;i++) sequentialSearch(a,n-1);//找最后一个
long
end=System.nanoTime(); System.out.println((end-start)/n); }T(n)=Θ(h(n)),如果存在正常数c1、c2和n0,n
≥
n0,c1h(n)≤
T(n)≤
c2h(n)叫做渐近确界T(n)=Θ(h(n))T(n)=O(h(n))且T(n)=Ω(h(n))渐进分析-Θ记号T(n)=o(g(n)),当且仅当:T(n)=O(g(n))且T(n)!=Ω(g(n))渐进分析-o记号小结算法分析算法的概念算法特性问题的规模n执行时间和空间是n的函数。O的含义如何求出T(n)的阶常用算法顺序和折半查找算法、Horner算法作业1、编写程序计算n=1、2、4、8、16、32时,以下函数的值:1lognnnlognn2n32nn!用excel做表,保存为PDF。提交"漂亮的"表格(log以2为底)作业2、测试你的机器跑递归的阶乘程序,当n=?时,程序开始抛出:java.lang.StackOverflowError注意:ppt的代码的返回值是int,能表示的数太小,要用long或double。记录下你尝试的次数(我的机器n=15000肯定抛出异常)。作业3、请给出++x的执行次数与n函数关系(严格,不用O) staticintfun(intn){
int
x=1;
for(int
i=0;i<n;i++)
for(int
j=0;j<i;++j)
for(int
k=0;k<j;++k) ++x; returnx; }作业(自我练习)输入:a0≤a1≤……≤an-1,x修改折半查找算法:1、找到x的第1次出现的位置2、找到x的最后1次出现的位置3、给出x出现的次数作业(自我练习)31502746abcdefhig3数据结构主要内容数据结构数据结构的描述抽象数据类型及实现计算机的用途数值计算数据处理实时控制辅助设计人工智能......数值计算的特点早期的计算机多用于数值计算,例如:弹道计算数据比较少计算复杂应用需求催生了数据结构这门课数据处理的特点计算机用于数据处理,例如:银行业务、人口普查数据量很大计算比较简单数据种类丰富:数值、字符、音频、视频...数据之间的关系复杂:时间序列、社交网络...数据结构房屋结构钢结构分子结构……牛津字典nounthearrangementofandrelationsbetweenthepartsorelementsofsomethingcomplextheorganizationofasocietyorothergroupandtherelationsbetweenitsmembers,determineitsworkingabuildingorotherobjectconstructedfromseveralpartsverbstructureddatastructuringofdatastructure线性结构:层次结构:线性表、栈、队列二叉树、树经典的数据结构数据结构的描述在计算机的存储器中如何存储数据和数据之间的关系存储器计算机使用存储器存储数据内存储器外存储器内存储器外存储器内存储器模型0123n……存储单元地址:0、1、2、......指令:read、write、move数据占用若干个相邻的存储单元内存分配方式存储大量的数据,如何为它们分配存储单元连续分配链式分配连续分配方式连续分配方式将数据分配(存储)于连续的存储单元。已知第一个数据的地址a,按照以下的公式得到各数据的地址。location(i)=a+(i-1)×s链式分配方式链式分配方式将数据分配于离散的存储单元,通过附加的地址信息将数据连接(Link)在一起。存取任何数据,必须依次存取第1个、第2个、。。。高级程序设计语言(C、JAVA)提供了:变量:用于存储数据数组:用于存储大量的数据高级语言管理内存储器数据类型:数据占用的存储单元的数量和编码方式int:4个字节,二进制补码float:4个字节,IEEE754编码double:8个字节,IEEE754编码int[]a=new
int[3];length3componentTypeint高级语言管理内存储器变量、数组就是存储单元地址的助记符通过符号表完成转换变量名
地址a100b108c116......0123n……高级语言管理内存储器高级语言管理内存储器已使用的存储单元未使用的存储单元分配存储单元回存储单元外存储器模型0123n……文件:由字节(存储单元)组成;字节有地址(偏移位置);可以在任何地址读写若干字节。操作系统的文件操作函数:open、closeread、writeseek通过文件使用外存储器原子数据:基本数据类型、引用数据类型复合数据数据classAddress{
String
road;
String
city;}复合数据地址:街道、城市学生的基本信息:姓名、年龄、身高和家庭住址复合数据public
classStudent{
char
name[];
int
age;
float
height; Addressaddress;}public
classStudent{
char
name[];
int
age;
float
height;}云飞扬17181Id:23浪淘沙18170Id:18万山红17165Id:25数据:对象学生的基本信息:姓名、年龄、身高和家庭住址nameageheight云飞扬17181浪淘沙18170万山红17165数据处理经常遇到表处理,数据一行一行的出现,即行与行之间有先后关系例如,有3位学生关系s2s3s1public
classStudent{
char
name[];
int
age;
float
height;
Student
next;}关系:增加变量云飞扬17181Id:18Id:23浪淘沙18170Id:25Id:18万山红17165nullId:25关系:增加变量云飞扬17181Id:18Id:23浪淘沙18170Id:25Id:18万山红17165nullId:25关系:增加变量箭头:表示引用关系:增加变量缺点:需要修改类的定义(修改数据)一个数据同时参与多个关系?动态的关系(随时间变化)?class
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022年内蒙古自治区呼伦贝尔市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2024年甘肃省陇南市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2024年安徽省安庆市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2022年江苏省连云港市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2024年湖南省湘西自治州公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 能源行业新能源开发会议议程
- 湖南省邵阳市(2024年-2025年小学六年级语文)人教版课后作业((上下)学期)试卷及答案
- 2024正规居民小区分户供气管理合同范本二零二四3篇
- 2024版幼儿园安全防护措施合作合同一
- 2024版商业协议续签指导性文本版B版
- 医院眼科医院雷火灸操作评分标准
- 二年级口算题卡
- 毕业设计工程造价预算书
- 幼儿园课件-神奇的中草药
- 起重机零配件(易损件)清单
- 锥坡工程量计算
- 植物园设计规范
- 北京保险中介行业营销员增员及流动自律公约
- 深圳市建设工程施工围挡图集(试行版_下半部分).pdf
- 热水器3c安全试验报告及第三方检测报告dsf65mx ts tx ws wx ys yx ms
- 南洋电工GSB1A型16锭高速编织机使用说明书
评论
0/150
提交评论