算法设计与分析——期末考试

递归与分治策略

Fibonacci数列

int fib(int n)
{
	if (n<=1) return 1;
	return fib(n-1)+fib(n-2);
}
int  fib[50];			//采用数组保存中间结果
void fibonacci(int n)
{
	fib[0] = 1;	
	fib[1] = 1;
	for (int i=2; i<=n; i++)
		fib[i] = fib[i-1]+fib[i-2];
}

集合的全排列问题

//产生从元素k~m的全排列,作为前k—1个元素的后缀
void Perm(int list[], int k, int m)
{
	if(k==m) 	//构成了一次全排列,输出结果
	{
		for(int i=0;i<=m;i++)
			cout<<list[i]<<" ";
		cout<<endl;
	}
	else
		//在数组list中,产生从元素k~m的全排列
		for(int j=k;j<=m;j++)
		{
			swap(list[k],list[j]);
			Perm(list,k+1,m);
			swap(list[k],list[j]);
		}
}

整数划分问题

int split(int n,int m)
{
	if(n==1||m==1) return 1;
	else if (n<m) return split(n,n);
	else if(n==m) return split(n,n-1)+1;
	else return split(n,m-1)+split(n-m,m);
}

分治策略的算法设计模式

Divide_and_Conquer(P)
{
	if (|P|<=n0 ) return adhoc(P);
	divide P into smaller substances P1,P2,…,Pk;
	for (i=1; i<=k; k++) 
		yi=Divide-and-Conquer(Pi)	     //递归解决Pi
	Return merge(y1,y2,…,yk)	    //合并子问题
}

二分搜索算法

//数组a[]中有n个元素,已经按升序排序,待查找的元素x
template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
	int left=0;				//左边界
	int right=n-1;				//右边界
	while(left<=right)
	{
		int middle=(left+right)/2;	//中点
		if (x==a[middle]) return middle;
 		if (x>a[middle]) left=middle+1;
		else right=middle-1;
	}	return -1;			//未找到x
}

循环赛日程表

void Table(int k)
{	
	int i, r;
	int n = 1 << k;	
	//构造正方形表格的第一行数据
	for (i=0; i<n; i++)
		a[0][i] = i + 1;
	//采用分治算法,构造整个循环赛日程表
	for (r=1; r<n; r<<=1)
		for (i=0; i<n; i+=2*r)
		{ 
			Copy(r, r + i, 0, i, r);		//①
			Copy(r, i, 0, r + i, r);		//②
		}
}

//源方阵的左上角顶点坐标(fromx, fromy),行列数为r
//目标方阵的左上角顶点坐标(tox, toy),行列数为r
void Copy(int tox, int toy, int fromx, int fromy, int r)
{
	for (int i=0; i<r; i++)
		for (int j=0; j<r; j++)  
			a[tox+i][toy+j] = a[fromx+i][fromy+j];
}

选择问题

输油管道问题

半数集问题

整数因子分解

取余运算

回溯

最优装载问题

void Backtrack(int t)
{
	if (t > n)
	{
		if (cw > bestw)
		{
			for (int i = 1; i <= n; i++)
				best[i] = x[i];
			bestw = cw;
		}
		return;
	}
	r -= w[t];
	if (cw + w[t] <= c)
	{
		x[t] = 1;
		cw += w[t];
		Backtrack(t + 1);
		cw -= w[t];
	}
	if (cw + r > bestw)
	{
		w[t] = 0;
		Backtrack(t + 1);
	}
	r += w[t];


}

01背包

void Backtrack(int t)
{
	if (t + 1 > n)
	{
		bestv = cv;
		return;
	}
	if (cw + Q[i].w <= c)
	{
		cw += Q[i].w;
		cv += Q[i].v;
		Backtrack(t + 1);
		cw -= Q[i].w;
		cv -= Q[i].v;
	}
	if (bound(i + 1) > bestv)
	{
		Backtrack(t + 1);
	}
}
int bound(int i)
{
	int cleft = c - cw;
	int b = cv;
	while (i < n && Q[i].w <= cleft)
	{
		cleft -= Q[i].w;
		b += Q[i].v;
		i++;
	}
	if (i < n)b += cleft * Q[i].d;
	return b;
}

子集树模板

void Backtrack(int t)
{
	if (t > n)update(x);
	else {
		for (int i = 0; i <= 1; i++)
		{
			x[t] = i;
			if (constraint(t) && bound(t)) Backtrack(t + 1);
		}
	}
}

排列树模板

void Backtrack(int t)
{
	if (t > n)update(x);
	else {
		for (int i = t; i <= n; i++)
		{
			swap(x[t], x[i]);
			Backtrack(t + 1);
			swap(x[t], x[i]);
		}
	}
}

m着色

void Backtrack(int t)
{
	if (t > n)
	{
		sum++;
		for (int i = 1; i <= n; i++)
			printf("%d ", x[i]);
		printf("/n");
	}
	else {
		for (int i = 1; i <= m; i++)
		{
			x[t] = 1;
			if(Same(t))Backtrack(t + 1);
			x[t] = 0;
		}
	}
}

bool Same(int t)
{
	for (int i = 1; i <= n; i++)
	{
		if ((x[t][i] == 1) && (x[i] == x[t])) return false;
	}
	return true;
}

n皇后

void Backtrack(int t)
{
	if (t > n)
	{
		sum++;
		for (int i = 1; i <= n; i++)
			printf("%d", x[i]);
		printf("\n");
	}
	else {
		for (int i = i; i <= n; i++)
		{
			x[t] = i;
			if (Place(t)) Backtrack(t + 1);
		}
	}
}

inline bool Place(int t)
{
	for (int i = 1; i <= t; i++)
	{
		if((abs(t-i)==abs(x[i] - x[t])||(x[i]==x[t]))
			return false;
	}
	return true;
}
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
计算机算法设计与分析 期末试 一。选择 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、在下列算法中有时找不到问解的是( B )。 A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法 5. 回溯法解旅行售货员问时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 6.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 8、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问 B 选择问 C 归并排序 D 0/1背包问 9. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 10、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 11.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 12.下列算法中通常以深度优先方式系统搜索问解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 13.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 14.哈弗曼编码的贪心算法所需的计算时间为( B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 15.分支限界法解最大团问时,活结点表的组织形式是( B )。 A、最小堆 B、最大堆 C、栈 D、数组 16.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 17.实现棋盘覆盖算法利用的算法是( A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 18.下面是贪心算法的基本要素的是( C )。 A、重叠子问 B、构造最优解 C、贪心选择性质 D、定义最优解 19.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C. 计算限界函数的时间 D. 确定解空间的时间 20.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 21、下面关于NP问说法正确的是(B ) A NP问都是不可能解决的问 B P类问包含在NP类问中 C NP完全问是P类问的子集 D NP类问包含在P类问中 22、蒙特卡罗算法是( B )的一种。 A、分支界限算法 B、概率算法 C、贪心算法 D、回溯算法 23.下列哪一种算法不是随机化算法( C ) A. 蒙特卡罗算法B. 拉斯维加斯算法C.动态规划算法D.舍伍德算法 24. ( D )是贪心算法与动态规划算法的共同点。 A、重叠子问 B、构造最优解 C、贪心选择性质 D、最优子结构性质 25. 矩阵连乘问算法可由( B)设计实现。 A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法 26. 分支限界法解旅行售货员问时,活结点表的组织形式是( A )。 A、最小堆 B、最大堆 C、栈 D、数组 27、Strassen矩阵乘法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 29、使用分治法求解不需要满足的条件是(A )。 A 子问必须是一样的 B 子问不能够重复 C 子问的解可以合并 D 原问和子问使用相同的方法解 30、下面问(B )不能使用贪心法解决。 A 单源最短路径问 B N皇后问 C 最小花费生成树问 D 背包问 31、下列算法中不能解决0/1背包问的是(A ) A 贪心法 B 动态规划 C 回溯法 D 分支限界法 32、回溯法搜索状态空间树是按照(C )的顺序。 A 中序遍历 B 广度优先遍历 C 深度优先遍历 D 层次优先遍历 33、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 34.实现合并排序利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 35.下列是动态规划算法基本要素的是( D )。 A、定义最优解 B、构造最优解 C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战士小小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值