**
(这个就先放着吧)
算法设计于问题求解
-------------编程实践
**
第一章 问题求解概述
问题:是人们需要回答的一般性提问,通常包含若干个参数,由问题描述,输入条件,输出要求等要素组成。
问题实例:定义为确定问题描述参数后的一个对象。
例
正整数求和问题
问题描述:计算整数a和整数b的和c
输入条件:正整数a,b
输出要求:c
算法正确是指对于问题界定后的所有问题实例,算法执行后都能得到正确的结果。
问题求解周期:问题简化,模型构建,算法设计,程序设计与调试等过程。
问题简化得到的原型一般为问题描述-输入-输出。
算法:算法是任何定义好了的计算程式,它取某些值或值的集合作为输入,并产生某些值或值的集合作为输出。
(5个特性)
确定性,可实践性,有穷性,具体数据输入,具体数据输出。
可以没有输入但是一定要有输出(重点)
算法复杂性:分为时间复杂性和空间复杂性
算法执行所需要的空间包括指令空间,数据空间,系统栈空间三大类。
指令空间对于所解决的特定问题不够敏感,以至于可以忽略不记。
算法的效率:当要比较两个渐进复杂度的阶不同时,只要确定各自的阶,就可以判定哪个算法的效率高。
渐进符号O
符号O是为了简化算法复杂度分析而采用的一种记号。
非递归算法的复杂性分析:
(1)确定关键操作
(2)计算关键操作的执行步数T(n)
(3)求解T(n)渐进阶,并用O记号表示
例:
寻找最大元素
int Max(int a[],int n){//寻找a[0:n-1]中最大的元素
int pos = 0;
for(int i=1;i<n;i++)
if(a[pos]<a[i])
pos=i;
return pos;
}
for循化中共进行了n-1次比较,所以时间复杂度为O(n)
冒泡排序
BubbleSort(int a[],int n){
int t=0;//作为中间变量
for(int i=n;i>1;i--)
for(int j=0;j<i-1;j++){
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
冒泡排序的时间复杂度为O(n^2)
递归算法的复杂性分析
三个步骤:
(1)分析递归程序的结构,确定每一逻辑块的时间复杂度。非递归的程序块用非递归方法分析其复杂度。
(2)构造复杂性函数的递归方程
(3)求解递归方程和渐进阶,并用O记号表示
int Hanoi(int n,int a,int b,int c){
if(n<=0)return 0;
Hanoi(n-1,a,c,b);
Move(n,a,c);
Hanoi(n-1,b,a,c);
return 1;
}
算法包括两次Hanoi递归调用,每一次调用的规模为n-1,假设原Hanoi算法执行的时间为T(n),每次递归调用的时间为T(n-1),递归方程为T(n)=2T(n-1)+c;c为Move的常数时间。