算法设计与分析——期末复习系统c++源代码

HNU君陌

此为本人在大二下学期期末考试前复习期间于闲暇时所创,聊以慰藉。本系统有一c++文件及四txt文件,分别命名为1.txt\2.txt\3.txt\4.txt,使用时请注意。
算法设计与分析——期末复习系统c++源代码_第1张图片
现附源码如下:
.cpp文件如下:

#include 
#include 
#include  
using namespace std;
int main()
{
	ifstream ou;
	string a,b;
	system("color F0"); 
//	FortSize=0;
	cout<<"******************************"<<endl;
	cout<<"   欢迎来到算法设计复习系统\n"<<endl;
	cout<<"        制作人:方寸谛"<<endl;
	cout<<"     制作时间:2019.4.21"<<endl;
	cout<<"******************************"<<endl;
	Sleep(1000);
	A:
	system("cls");
	cout<<"请选择复习模块:"<<endl;
	cout<<"1、算法概述"<<endl;
	cout<<"2、递归与分治"<<endl;
	cout<<"3、动态规划"<<endl;
	cout<<"4、贪心算法"<<endl;
//	cout<<"5、汇编语言"<
//	cout<<"6、翻转、分支、循环"<
//	cout<<"7、过程"<
//	cout<<"8、数组的分配和访问"<
	cout<<"0、退出系统"<<endl;
	int n;
	cin>>n;
	system("cls");
	switch(n){
		case 1:{
			ou.open("1.txt"); 
			break;
		}
		case 2:{
			ou.open("2.txt"); 
			break;
		}
		case 3:{
			ou.open("3.txt"); 
			break;
		}
		case 4:{
			ou.open("4.txt"); 
			break;
		}
//		case 5:{
//			ou.open("5.txt"); 
//			break;
//		}
//		case 6:{
//			ou.open("6.txt"); 
//			break;
//		}
//		case 7:{
//			ou.open("7.txt"); 
//			break;
//		}
//		case 8:{
//			ou.open("8.txt"); 
//			break;
//		}
		case 0:{
			cout<<"******************************"<<endl;
			cout<<" 感谢使用本系统,祝愿考试顺利\n"<<endl;
			cout<<"        制作人:方寸谛"<<endl;
			cout<<"     制作时间:2019.4.21"<<endl;
			cout<<"******************************"<<endl;
			Sleep(1000);
			return 0;
			break;
		}
	}	
	ou>>a;
	while(a!="0"){
		ou>>b;
		if(a=="*") cout<<"        "<<b<<endl<<endl;
		else cout<<a<<"    "<<b<<endl<<endl;
		ou>>a;
		Sleep(100);
//		system("pause"); 
	}
	ou.close();
	system("pause");
	goto A;
} 

1.txt文件如下:

1 算法指解决问题的一种方法或一个过程,经常用伪代码描述,是由若干条指令组成的有穷队列,且满足以下四条性质:
* 输入:有0个或多个外部提供的数据作为算法的输入
* 输出:算法产生至少一个数据作为输出
* 确定性:组成算法的每条指令是清晰的、无歧义的
* 有限性:算法中每条指令的执行次数有限,且每条指令执行的时间有限
2 算法与程序不同,程序是算法用某种程序设计语言的具体实现,可以不满足有限性,如操作系统是一个在无限循环中执行的程序
3 2^n与n!等阶,好的算法可以在多项式时间内实现
4 算法复杂性的高低体现在运行该算法所需要计算机资源的多少上,主要有时间复杂性和空间复杂性
5 可操作性最好,价值最高的是在最坏情况下的时间复杂性
6 算法复杂度对应:
* 理论上可计算:至少指数时间
* 现实上可计算:多项式时间
* 高度并行可计算:对数多项式时间
7 NP完全性理论:
* 若知道了一个问题的计算时间下界,则知道了对于该问题能设计出多有效的算法,通常可在多项式时间内解决的问题看作是易解问题,需要指数时间的问题是难解问题
* 所有可以在多项式时间内求解的判定问题构成P类问题,P类问题是确定型计算机下的易解问题;NP类问题是非确定性计算机下的易验证问题。确定性:按部就班、非确定性:自主选择最优解
* 所有非确定性多项式时间可解的判定问题为NP类问题
* 猜测存在一类完全NP问题,即NPC类问题,若一个NP能在多项式时间内解决,则NP的每一个问题都可以在多项式时间内求解,即P=NP。经典的NPC问题有:合取范式的可满足性问题、三元合取范式的可满足性问题、团问题、顶点覆盖问题、子集和问题、哈密尔顿回路问题、旅行售货员问题
0

2.txt文件如下:

1 递归:直接或间接的调用自身的算法,可是函数的定义和算法描述见解且易于理解。经典问题有:阶乘问题、斐波那契数列问题、排序问题、汉诺塔问题
2 大部分递归问题可以转化为非递归问题,但有些不可以
3 设计递归算法需要写出选择关系,注意终止返回条件
4 递归的运行效率低,占用空间多,可以用栈来代替
5 分治法:将一个规模为N的问题分解为k个规模较小的子问题,子问题相互独立且与原问题相同,递归处理子问题,合并得到原问题的解
6 分治法使用条件:
* 原问题可分解为格式相同规模较小的子问题
* 子问题相互独立且与原问题相同
* 子问题合并可以得到原问题的解
* 不含有公共子问题(可不用)
7 使用分治法的时候最好使子问题规模大致相同,并设计出递归算法的条件分支,在设计子问题规模的时候可以用减一法、减常数因子法、分k法
8 分治法的经典问题有:二分搜索问题、大整数的乘法、矩阵乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表问题
9 个人理解:递归是一种方法,分治法是一种算法思想,但实际上都是相当于自上而下的暴力破解,也许可能起到优化的作用,但解决问题的本质思路并没有改变
0

2.txt文件如下:

1 动态规划法:适用于解最优化问题,通过开辟一个空间存储子问题的最优解,在后面进行更新调用
2 动态规划的步骤:
* 找出最优解的性质,并刻画其结构特征
* 递归的定义最优解
* 自底向上的方式计算出最优值
* 根据计算最优值时的信息,构造最优解
* 其中1~3是求最优值,4构造最优解
3 动态规划做题的基本步骤是:
* 分析最优子结构
* 建立递归关系
* 计算最优值
* 复杂性分析
4 动态规划算法的基本要素:
* 最优子结构性质,即问题的最优解包含了其子问题的最优解,动态规划算法利用问题的最优子结构性质,自下而上的递归的从子问题的最优解逐步构造出整个问题的最优解
* 子问题重叠性质,即在用递归自顶向下解决问题时,每次产生的子问题不总是新问题,有些子问题被反复计算,动态规划只是对每一个子问题只求解一次,将解保存在一个表格中,不反复计算
* *注意*:备忘录方法,是动态规划法的变形,用表格保存已解决的子问题的答案,不同的是备忘录方法计算方式是自顶向下,动态规划法自底向上,备忘录方法只是在递归的时候记录了每个子问题的值
5 动态规划的经典问题有:矩阵连乘问题、最长公共子序列、最大子段和问题(又可以推广为最大子矩阵和问题、最大m子段和问题)、凸多边形最优三角剖分问题、多边形游戏问题、0-1背包问题
6 0-1背包问题之所以不能使用贪心算法而只能使用动态规划算法是因为0-1背包问题没有办法装满整个背包,所以存在空间浪费,从而导致价值的改变,没有办法使用贪心算法
0

4.txt文件如下:

1 贪心算法:总是做出局部最优的选择
2 贪心算法的要素有:
* 贪心选择性质,所求问题的整体最优解可通过一些列局部最优的选择得到,是否具有贪心选择性质要证明每步所做的谈心选择最终导致问题的最优解,先考察问题的一个整体最优解,并证明可以修改最优解顺序使其满足贪心选择(即每次都取局部最优),然后通过最优子结构性质对其子问题进行证明,通过数学归纳法证明整个问题具有贪心选择性质
* 最优子结构性质,问题的最优解包含其子问题的最优解
3 注意!!!贪心与动态的差异:
* 在动态规划中,所做的每步选择多依赖于相关子问题的解,因为只有解出相关子问题后才能做出选择
* 在贪心算法中,所做的每步选择只需要局部最优,再去解做出这个选择后相应的子问题,选择可依赖以往的选择,但不能依赖将来的选择,也不能依赖子问题的解
4 贪心算法的经典问题有:背包问题、最优装载问题、哈弗曼编码问题、
0

学海漫漫,回头无岸
何以解忧,唯有恰饭

你可能感兴趣的:(各科复习系统,c++,算法设计,算法设计与分析,复习)