算法分析与设计实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实 验 原 理 (算 法 基 本 思 想)
程 序 代 码
void dian() { time_t c_start1, c_end1; c_start1 = clock(); int s[100],f[100],i,j,t,a,b,c,d,n; printf("蛮力法求最近点问题"); printf("\n 请输入坐标数:"); scanf("%d",&n); for(t=0;t<n;t++) { scanf("%d",&s[t]); scanf("%d",&f[t]); } double l,k; k=sqrt((s[1]-s[0])*(s[1]-s[0])+(f[1]-f[0])*(f[1]-f[0])); a=s[1];b=f[1];c=s[0];d=f[0]; for(i=0;i<n;i++) { for(j=i+1;j<=n;j++) { l=sqrt((s[j]-s[i])*(s[j]-s[i])+(f[j]-f[i])*(f[j]-f[i])); if(k>l) { k=l; a=s[j];b=f[j];c=s[i];d=f[i]; } } } c_end1 = clock(); printf("\n 最近的距离为:%f\n",k); printf("\n 他们的坐标分别为:(%d,%d),(%d,%d)\n",a,b,c,d); printf("\n 此方法所花时间为:%f",difftime(c_end1,c_start1)/18.2) ; } typedef struct { double x; double y; }pttype; long arr[maxsize]; long arr1; pttype pt[maxsize]; int sortcmp(const void *a, const void *b) { if (((pttype*)a)->x < ((pttype*)b)->x) return -1;
3)可以反复执行,直到退出实验。 void show() { printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" }
实 验 结 果 及 分 析
实验名称
减治法在组合问题中的应用——8 枚 硬币问题 实验题目
实验室
在 8 枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不
实 验 目 的 或 要 求
知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高 效的算法来检测这枚假币。
实验要求
1) 使用教材 2.5 节中介绍的迭代算法 Fib(n),找出最大的 n,使得 数不超过计算机所能表示的最大整数,并给出具体的执行时间;
第 n 个 Fibonacci
2)对于要求 1),使用教材 2.5 节中介绍的递归算法 F(n)进行计算,同样给出具体的执 行时间,并同 1)的执行时间进行比较; 3)对于输入同样的非负整数 n,比较上述两种算法基本操作的执行次数; 4)对 1)中的迭代算法进行改进,使得改进后的迭代算法其空间复杂度为Θ (1); 5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。
dis(pt[left],
pt[right])),
/*枚举个点和个点的情况,当边界使用*/ //大于用分治法 long i,j,mid = (left + right) / 2; double curmin = getMin(shortest(left,mid),shortest(mid +1 ,right)); arr1 = 0; for (i = mid; i >= left && pt[mid+1].x - pt[i].x <= curmin; i --) arr[arr1++] = i;//确定左边-d 内的点 for (i = mid + 1; i <= right && pt[i].x - pt[mid].x <= curmin; i ++) arr[arr1++] = i;//确定右边+d 内的点 qsort(arr, arr1, sizeof(arr[0]), arrcmp);//按 y 排序 for (i = 0; i < arr1; i ++) for (j = i + 1; j < arr1 && pt[arr[j]].y - pt[arr[i]].y <= curmin; j ++) curmin = getMin(curmin, dis(pt[arr[i]], pt[arr[j]])); return curmin; }
else return 1; } int arrcmp(const void *a, const void *b) { if (((pttype*)a)->y < ((pttype*)b)->y) return -1; else return 1; } double dis(pttype a,pttype b) { return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)); } double getMin(double a, double b) { if(a<b) return a; else return b; } double shortest(long left,long right) { if(right-left == 1)//两个点 return dis(pt[left],pt[right]); if(right-left == 2)//三个点 return getMin(getMin(dis(pt[left], pt[left+1]), dis(pt[left+1], pt[right]));
实验目的 1)深刻理解并掌握减治法的设计思想并理解它与分治法的区别; 2)提高应用减治法设计算法的技能。 3)理解这样一个观点:建立正角的模型对于问题的求解是非常重要的。
实验要求 1)设计减治算法实现 8 枚硬币问题; 2)设计实验程序,考察用减治技术设计的算法是否高效; 3)扩展算法,使之能处理 n 枚硬币中有一枚假币的问题。
实 验 原 理 (算 法 基 本 思 想)
F(n) //根据定义,递归计算第 n 个斐波那契数 //输入:一个非负数 n //输出:第几个斐波那契数 if n≤1 return n else return F(n-1)+F(n-2)
程 序 代 码
int Fib1(int n) { int s[48],i; s[0]=0; s[1]=1; for(i=2;i<=n;i++) s[i]=s[i-1]+s[i-2],time1++; return s[n]; } int Fib2(int n) { long int f; if(n>1) { f=Fib2(n-1)+Fib2(n-2),time2++; return f; } if(n<2) { time3++; return n;} time3=time3+time2; }
实 验 结 果 及 分 析
实验名称
分治法在数值问题中的应用——最近 点对问题
实验室
实验题目 设 p1 = (x1,y1), p2 = (x1, y2), ……, pn= (xn, yn)是平面上 n 个点构成的集合 S,设计 算法找出集合 S 中距离最近的点对。
实 验 目 的 或 要 求
实验目的 1)提高应用蛮力法设计算法的技能; 2)深刻理解并掌握分治法的设计思想; 3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以 对其进行改进,以提高算法的效率。 实验要求 1)设计并实现用 BF 方法求解最近点对问题的算法; 2)设计并实现用 DAC 方法求解最近点对问题的算法; 3)以上两种算法的输入既可以手动输入,也可以自动生成; 4)算法不仅要输出最近点对的距离,还要输出最近点对的两个点; 5)对上述两个算法进行时间复杂性分析,并设计实验程序验证分析结果; 6)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。
程 序 代 码
\n"); |--------------------------|\n"); | |\n"); | 《算法设计与分析》实验 |\n"); | |\n"); |--------------------------|\n"); | 1. 算法分析基础——Fibonacci 序列问题 |\n"); | |\n"); | 2. 分治法在数值问题中的应用——最近点对问题 |\n"); | |\n"); | 3. 减治法在组合问题中的应用——8 枚硬币问题 |\n"); | |\n"); | 4. 变治法在排序问题中的应用——堆排序问题 |\n"); | |\n"); | |\n"); | 99.退出本实验 |\n"); |--------------------------|\n"); \n"); * 请输入您所要执行的操作(1,2,3,4,5,99) : \n"); \n");
实 验 结 果 及 分 析
实验名称
算法分析基础——Fibonacci 序列问 题
实验室
实 验 目 的 或 要 求
实验题目 给定一个非负整数 n,计算第 n 个 Fibonacci 数
实验目的 1)理解递归算法和迭代算法的设计思想以及递归程序的调式技术 2)掌握并应用递归算法和迭代算法效率的理论分析(前验分析)和实际分析(后验分 析)方法; 3)理解这样一个观点:不同的算法可以解决相同的问题,这些算法的解题思路不同, 复杂程度不同,效率也不同;
实 验 原 理 (算 法 基 本 思 想)
int jiabi(int s[],int n,int i) { int l[1000]; int r=0,t,k,y,x,a,b,c=0,f,e; k=n+i; f=i; if(n>=3) { if(n%2==0) { t=n/2; for(e=i;e<i+t;e++) y+=s[e]; for(e=i+t;e<n+i;e++) x+=s[e]; if(y>x) { for(e=i;e<i+t;e++) l[e]=s[e]; return jiabi(l,t,f); } c=0; if(x>y) { for(e=i+t;e<n+i;e++) l[e]=s[e]; return jiabi(l,t,f+t); } if(y==x) printf("没有假币!!"); ! } if(n%2==1) { a=(n-1)/2; for(e=i;e<i+a;e++) y+=s[e]; for(e=a+i;e<i+n-1;e++) x+=s[e]; b=s[k-1]; if(y>x) {
学号
姓名
组员
实验名称
算法实验整体框架的构建 1. 实验题目 算法实验主菜wenku.baidu.com的设计。 2.实验目的 ⑴ 熟悉实验环境 VC++6.0 ;
实验室
⑵ 复习 C、C++语言以及数据结构课程的相关知识,实现课程间的平滑过度;
实 验 目 的 或 要 求
3. 实验要求 1)设计的主菜单可以是图形模式的,也可以是控制台模式的。以控制台为例,主菜单大 致如下: ------------------------- 《算法设计与分析》实验 ------------------------- 1. 算法分析基础——Fibonacci 序列问题 2. 分治法在数值问题中的应用——最近点对问题 3. 减治法在组合问题中的应用——8 枚硬币问题 4. 变治法在排序问题中的应用——堆排序问题 5. 动态规划法在图问题中的应用——全源最短路径问题 99. 退出本实验 ------------------------- 请输入您所要执行的操作(1,2,3,4,5,99) : 2)点击操作后进入相应的实验项目或是相应项目的下一级菜单;