《算法设计与分析》习题解答笔记

题外话:近期准备复习一下算法的知识,顺便刷几道习题,在这边留一下笔记,方便之后查看。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

习题1-2 方法头签名

        方法签名由方法的名称和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。需注意的是,方法签名既不包含返回类型,也不包含 params 修饰符(它可用于最右边的参数)。 · 实例构造函数签名由它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。具体说来,实例构造函数的签名不包含可为最右边的参数指定的 params 修饰符。 · 索引器签名由它的每一个形参(按从左到右的顺序)的类型组成。具体说来,索引器的签名不包含元素类型。  运算符签名由运算符的名称和它的每一个形参(按从左到右的顺序)的类型组成。具体说来,运算符的签名不包含结果类型。 签名是对类、结构和接口的成员实施重载的机制: 方法重载允许类、结构或接口用同一个名称声明多个方法,条件是它们的签名在该类、结构或接口中是唯一的。 实例构造函数重载允许类或结构声明多个实例构造函数,条件是它们的签名在该类或结构中是唯一的。  索引器重载允许类、结构或接口声明多个索引器,条件是它们的签名在该类、结构或接口中是唯一的。运算符重载允许类或结构用同一名称声明多个运算符,条件是它们的签名在该类或结构中是唯一的。

习题1-3 数组排序判定

      写一个通用方法用于判定给定的数组是否已排好序

int isOrdered(int a[],int n)
{
	int i,flag = 0,res = 1;
	for(i = 0; i < n-1; i ++ )
	{
		if((a[i] <= a[i+1])&& flag!=2)
		{
			flag = 1;
			continue;
		}
		else if((a[i] >= a[i+1] )&& flag!=1)
		{
			flag = 2;
			continue;
		}
		else
		{
			res =0;
			break;
		}		
	}
	return res;
}
习题1-10 函数渐进阶

大写O符号(上界,最坏)
f(n)=O(g(n)),这里f(n)是分析出来算法的执行次数的函数,
O的定义:当且仅当存在正的常数c和n0,使得对于所有的n>=n0,有f(n)<=cg(n)。这里cg(n)就是函数f(n)的上限。

几种函数的例子:
1.线性函数
f(n)=3n+2,当n>=2时,3n+2<=3n+n=4n。所以f(n)=O(n),这里c就是4,n0=2。
2.平方函数
f(n)=2n^2+3n+3,当n>=3时,3n+3<=4n,当n>=4时,4n f(n)=O(n^2),这里c是3,n0=4。
3.指数函数
f(n)=6*2^n+n^2,当n>=4时,n^2<=2^n,所以当n>=4,有f(n)<=6*2^n+2^n=7*2^n。
这里c是7,n0=4,f(n)=O(2^n)。
4.常数阶
f(n)=9,这里就直接记为O(1),c为9,n0为0就可以了,f(n)=9<=9*1。

Ω符号(下界,最好)
f(n)=Ω(g(n)),当且仅当存在正的常数c和n0,使得对于所有n>=n0,有f(n)>=cg(n)。Ω符号是给函数的下限。
例子
对于所有的n,有f(n)=3n+2>3n,所以f(n)=Ω(n),这里c=3,n0=0。这里也可以这样f(n)=Ω(1),

Θ符号(确界,渐进)
对于存在大于0的常数c1、c2和非负的整数n0,以及足够大的n,对于所有的n≥n0来说,有c1g(n)<=f(n)<=c2g(n)。
3n+2=Θ(n),当c1=3,c2=4,n>=n0=2时,3n<=3n+2<=4n。

小写o符号
定义:f(n)=o(g(n))当且仅当f(n)=O(g(n))且f(n)!=Ω(g(n))。





你可能感兴趣的:(算法)