实验2FFT算法实现

实验2FFT算法实现
实验2FFT算法实现

实验2 FFT 算法实现

2.1 实验目的

1、 加深对快速傅里叶变换的理解。

2、 掌握FFT 算法及其程序的编写。

3、 掌握算法性能评测的方法。

2.2 实验原理

一个连续信号)(t x a 的频谱可以用它的傅立叶变换表示为

dt e t x j X t j a a Ω-+∞

∞-?=

Ω)()( (2-1)

如果对该信号进行理想采样,可以得到采样序列

)()(nT x n x a = (2-2)

同样可以对该序列进行z 变换,其中T 为采样周期

∑+∞∞--=n z n x z X )()(

(2-3)

当ωj e

z =的时候,我们就得到了序列的傅立叶变换 ∑+∞∞-=n j j e n x e X ωω)()(

(2-4)

其中ω称为数字频率,它和模拟域频率的关系为

s f T /Ω=Ω=ω (2-5)

式中的s f 是采样频率。上式说明数字频率是模拟频率对采样率s f 的归一化。同模拟域的情况相似,数字频率代表了序列值变化的速率,而序列的傅立叶变换称为序列的频谱。序列的傅立叶变换和对应的采样信号频谱具有下式的对应关系。

∑+∞∞--=)2(1)(T m j X T e X a j πωω (2-6)

即序列的频谱是采样信号频谱的周期延拓。从式(2-6)可以看出,只要分析采样序列的频谱,就可以得到相应的连续信号的频谱。注意:这里的信号必须是带限信号,采样也必须满

足Nyquist 定理。

在各种信号序列中,有限长序列在数字信号处理中占有很重要的地位。无限长的序列也往往可以用有限长序列来逼近。对于有限长的序列我们可以使用离散傅立叶变换(DFT ),这一变换可以很好地反应序列的频域特性,并且容易利用快速算法在计算机上实现当序列的长度是N 时,我们定义离散傅立叶变换为:

∑-===10)()]([)(N n kn N

W n x n x DFT k X (2-7) 其中N j N e W π

2-=,它的反变换定义为:

∑-=-==10)(1)]([)(N k kn N W

k X N k X IDFT n x (2-8)

根据式(2-3)和(2-7)令k N W z -=,则有

∑-====-10)]([)(|)(N n nk N W z n x DFT W n x z X k N

(2-9) 可以得到k N j k

N e W z z X k X π2|)()(===-,k N W -是z 平面单位圆上幅角为k N

πω2=的点,就是将单位圆进行N 等分以后第k 个点。所以,X(k)是z 变换在单位圆上的等距采样,或者说是序列傅立叶变换的等距采样。时域采样在满足Nyquist 定理时,就不会发生频谱混淆;同样地,在频率域进行采样的时候,只要采样间隔足够小,也不会发生时域序列的混淆。

DFT 是对序列傅立叶变换的等距采样,因此可以用于序列的频谱分析。在运用DFT 进行频谱分析的时候可能有三种误差,分析如下:

(1)混淆现象

从式(2-6)中可以看出,序列的频谱是采样信号频谱的周期延拓,周期是2π/T ,因此当采样速率不满足Nyquist 定理,即采样频率T f s /1=小于两倍的信号(这里指的是实信号)频率时,经过采样就会发生频谱混淆。这导致采样后的信号序列频谱不能真实地反映原信号的频谱。所以,在利用DFT 分析连续信号频谱的时候,必须注意这一问题。避免混淆现象的唯一方法是保证采样的速率足够高,使频谱交叠的现象不出现。这就告诉我们,在确定信号的采样频率之前,需要对频谱的性质有所了解。在一般的情况下,为了保证高于折叠频率的分量不会出现,在采样之前,先用低通模拟滤波器对信号进行滤波。

(2)泄漏现象

实际中的信号序列往往很长,甚至是无限长序列。为了方便,我们往往用截短的序列来近似它们。这样可以使用较短的DFT 来对信号进行频谱分析。这种截短等价于给原信号序列乘以一个矩形窗函数。而矩形窗函数的频谱不是有限带宽的,从而它和原信号的频谱进行卷积以后会扩展原信号的频谱。值得一提的是,泄漏是不能和混淆完全分离开的,因为泄露导致频谱的扩展,从而造成混淆。为了减小泄漏的影响,可以选择适当的窗函数使频谱的扩散减到最小。

(3)栅栏效应

因为DFT 是对单位圆上z 变换的均匀采样,所以它不可能将频谱视为一个连续函数。

这样就产生了栅栏效应,从某种角度来看,用DFT 来观看频谱就好像通过一个栅栏来观看一幅景象,只能在离散点上看到真实的频谱。这样的话就会有一些频谱的峰点或谷点被“栅栏”挡住,不能被我们观察到。减小栅栏效应的一个方法是在源序列的末端补一些零值,从而变动DFT 的点数。这种方法的实质是认为地改变了对真实频谱采样的点数和位置,相当于搬动了“栅栏”的位置,从而使得原来被挡住的一些频谱的峰点或谷点显露出来。注意,这时候每根谱线多对应的频率和原来的已经不相同了。

从上面的分析过程可以看出,DFT 可以用于信号的频谱分析,但必须注意可能产生的误差,在应用过程中要尽可能减小和消除这些误差的影响。

快速傅立叶变换FFT 并不是与DFT 不相同的另一种变换,而是为了减少DFT 运算次数的一种快速算法。它是对变换式(2-7)进行一次次的分解,使其成为若干小点数DFT 的组合,从而减小运算量。常用的FFT 是以2为基数,其长度M

N 2 。它的运算效率高,程序比较简单,使用也十分地方便。当需要进行变换的序列的长度不是2的整数次方的时候,为了使用以2为基的FFT ,可以用末尾补零的方法,使其长度延长至2的整数次方。IFFT 一般可以通过FFT 程序来完成,比较式(2-7)和(2-8),只要对X(k)取共轭,进行FFT 运算,然后再取共轭,并乘以因子1/N ,就可以完成IFFT 。 2.3 实验内容

1、 编制自己的FFT 算法。

2、 选取实验1中的典型信号序列验证算法的有效性。

3、 对所编制FFT 算法进行性能评估。

2.4 实验报告要求

1、 总结自己实现FFT 算法时候采用了哪些方法减小了运算量。

2、 给出自己的FFT 算法与实验1中自己的DFT 算法的性能比较结果。

3、 给出自己的FFT 算法与Matlab 中FFT 算法的性能比较结果。

4、 总结实验中根据实验现象得到的其他个人结论。

算法设计与分析实验报告贪心算法

算法设计与分析实验报告 贪心算法 班级:2013156 学号:201315614 姓名:张春阳哈夫曼编码 代码 #include float small1,small2; int flag1,flag2,count; typedefstructHuffmanTree { float weight; intlchild,rchild,parent; }huffman; huffmanhuffmantree[100]; void CreatHuffmanTree(intn,int m) { inti; void select(); printf("请输入%d个节点的权值:",n); for(i=0;i

printf("\n"); for(i=0;i

北京理工大学《数据结构与算法设计》实验报告实验一

《数据结构与算法设计》 实验报告 ——实验一 学院: 班级: 学号: 姓名:

一、实验目的 1.通过实验实践、巩固线性表的相关操作; 2.熟悉VC环境,加强编程、调试的练习; 3.用C语言编写函数,实现循环链表的建立、插入、删除、取数据等基本操作; 4.理论知识与实际问题相结合,利用上述基本操作实现约瑟夫环。 二、实验内容 1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的 结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到 第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点 的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出 了这个环表的全部结点为止。 三、程序设计 1、概要设计 为实现上述程序功能,应用单向环表寄存编号,为此需要建立一个抽象数据类型:单向环表。 (1)、单向环表的抽象数据类型定义为: ADT Joseph{ 数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={ |ai∈D,i=1,2,……,n} 基本操作: create(&L,n) 操作结果:构造一个有n个结点的单向环表L。 show(L) 初始条件:单向环表L已存在。 操作结果:按顺序在屏幕上输出L的数据元素。 Josephf( L,m,s,n) 初始条件:单向环表L已存在, s>0,n>0,s

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网1101 姓名:黄振亮 学号:20113379 2013年11月

目录 作业1 0-1背包问题的动态规划算法 (7) 1.1算法应用背景 (3) 1.2算法原理 (3) 1.3算法描述 (4) 1.4程序实现及程序截图 (4) 1.4.1程序源码 (4) 1.4.2程序截图 (5) 1.5学习或程序调试心得 (6) 作业2 0-1背包问题的回溯算法 (7) 2.1算法应用背景 (3) 2.2算法原理 (3) 2.3算法描述 (4) 2.4程序实现及程序截图 (4) 2.4.1程序源码 (4) 2.4.2程序截图 (5) 2.5学习或程序调试心得 (6) 作业3循环赛日程表的分治算法 (7) 3.1算法应用背景 (3) 3.2算法原理 (3) 3.3算法描述 (4) 3.4程序实现及程序截图 (4)

3.4.1程序源码 (4) 3.4.2程序截图 (5) 3.5学习或程序调试心得 (6) 作业4活动安排的贪心算法 (7) 4.1算法应用背景 (3) 4.2算法原理 (3) 4.3算法描述 (4) 4.4程序实现及程序截图 (4) 4.4.1程序源码 (4) 4.4.2程序截图 (5) 4.5学习或程序调试心得 (6)

作业1 0-1背包问题的动态规划算法 1.1算法应用背景 从计算复杂性来看,背包问题是一个NP难解问题。半个世纪以来,该问题一直是算法与复杂性研究的热点之一。另外,背包问题在信息加密、预算控制、项目选择、材料切割、货物装载、网络信息安全等应用中具有重要的价值。如果能够解决这个问题那么则具有很高的经济价值和决策价值,在上述领域可以获得最大的价值。本文从动态规划角度给出一种解决背包问题的算法。 1.2算法原理 1.2.1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi ∈{0,1}, ?∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。 1.2.2、最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解: 证明:使用反证法。若不然,设(z2,z3,…,zn)是上述子问题的一个最优解,而(y2,y3,…,yn)不是它的最优解。显然有 ∑vizi > ∑viyi (i=2,…,n) 且 w1y1+ ∑wizi<= c 因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n) 说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的一个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,矛盾。 1.2.3、递推关系:

银行家算法设计实验报告

银行家算法设计实验报告

银行家算法设计实验报告 一.题目分析 1.银行家算法: 我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。 2.基本要求: (1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。 (2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源, 但大于系统此时的可利用资源,提 示分配不合理不予分配并返回。 C. 所申请的资源未大于其所需资源, 亦未大于系统此时的可利用资源,预 分配并进行安全性检查: a. 预分配后系统是安全的,将该进 程所申请的资源予以实际分配并 打印后返回。 b. 与分配后系统进入不安全状态,提示系统不安全并返回。 (4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。 3.目的: 根据设计题目的要求,充分地分析和理解题 目,叙述系统的要求,明确程序要求实现的功能以及限制条件。 明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

算法与设计实验报告

算法与分析实验报告软件工程专业 安徽工业大学 指导老师:许精明

实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 一:实验目的 1:掌握动态规划算法的基本思想,学会用其解决实际问题。 2:通过几个基本的实验,提高算法分析与设计能力,提高动手操作能力和培养良好的编程习惯。 二:实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 实验一:杨辉三角

问题分析: ①每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 ②第n行数之和为2^n。 ③下一行每个数字等于上一行的左右两个数字之和。 算法设计及相关源代码: public void yanghui(int n) { int[] a = new int[n]; if(n==1){ System.out.println(1); }else if(n==2) { System.out.print(1 + " " +1); }else{ a[1]=1; System.out.println(a[1]); a[2]=1;

System.out.println(a[1]+" "+a[2]); for(int i=3;i<=n;i++){ a[1]=a[i]=1; for(int j=i-1;j>1;j--){ a[j]=a[j]+a[j-1]; } for(int j=1;j<=i;j++){ System.out.print(a[j]+" "); } System.out.println(); } } } 实验结果:n=10 实验二:0-1背包问题 问题分析::令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就 j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) j

算法设计实验报告(川大陈瑜)

《算法设计》课程报告 课序号: 01 学号: 2012141461134 姓名:刘佳玉 任课教师:陈瑜 评阅成绩: 评阅意见: 提交报告时间:2014年 6 月 16 日

贪心算法 1、问题描述 (这是我在soj上找的一道题,以前没做出来,现在用贪心的思想做出来了) 约翰要去钓鱼。他有h小时可用(1≤h≤16),在这个地区有n个湖泊(2≤n≤25),所有的湖泊沿着一条单行道可到达。约翰从湖泊1开始,他可以在任何湖泊结束。他只能从一个湖,到下一个,但他没有必要停在任何湖除非他想停。对于每个i = 1,……,n-1,ti 表示从湖i到湖i+1的5分钟的时间间隔(0 < ti < = 192)。例如,t3 = 4意味着它从湖3湖4需要20分钟的时间。 为了帮助他们规划自己的钓鱼旅行,约翰已经收集了一些关于湖泊信息。对于每个湖泊的i,能钓到的鱼在最初的5分钟的数量,用fi表示(fi > = 0),是已知的。每钓5分钟的鱼,能钓到的鱼在接下来的5分钟的间隔降低一个恒定的数di(di>=0)。如果能钓到的鱼在一个时间区的数量小于或等于di,将不会有更多的鱼留在湖里在下一个时间间隔。为了简化规划,约翰认为没有人会在影响他期待钓到的鱼的数量的湖里钓鱼。 写一个程序来帮助约翰计划他的最大化期望钓到的鱼的数量的钓鱼之旅。在每个湖花费的时间数必须是5的倍数。 这个问题包含多个测试案例! 一个多输入的第一行是一个整数N,然后一个空白行后的N个输入块。每个输入块由问题描述中的格式表示的。每个输入块之间有一个空行。 输出格式包含N个输出块。输出块之间要有一个空白行。 输入 在输入中,会给你一个案例输入的数量。每一种情况下,以n开始,其次是h,接下来有一行n个整数指定fi(1 < =i< = n),然后有一行n个整数di(1≤i<=n),最后,有一行n - 1的整数ti(1≤i<=n-1)。输入在n=0的情况下终止。 输出

《算法设计与分析》实验报告

算法设计与分析课程实验项目目录 学生:学号: *实验项目类型:演示性、验证性、综合性、设计性实验。 *此表由学生按顺序填写。

本科实验报告专用纸 课程名称算法设计与分析成绩评定 实验项目名称蛮力法指导教师 实验项目编号实验项目类型设计实验地点机房 学生学号 学院信息科学技术学院数学系信息与计算科学专业级 实验时间2012年3月1 日~6月30日温度24℃ 1.实验目的和要求: 熟悉蛮力法的设计思想。 2.实验原理和主要容: 实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。 实验容:以下题目任选其一 1).为蛮力字符串匹配写一段可视化程序。 2).写一个程序,实现凸包问题的蛮力算法。 3).最著名的算式谜题是由大名鼎鼎的英国谜人 H.E.Dudeney(1857-1930)给出的: S END +MORE MONEY . 这里有两个前提假设: 第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。3.实验结果及分析: (将程序和实验结果粘贴,程序能够注释清楚更好。)

该算法程序代码如下: #include "stdafx.h" #include "time.h" int main(int argc, char* argv[]) { int x[100],y[100]; int a,b,c,i,j,k,l,m,n=0,p,t1[100],num; int xsat[100],ysat[100]; printf("请输入点的个数:\n"); scanf("%d",&num); getchar(); clock_t start,end; start=clock(); printf("请输入各点坐标:\n"); for(l=0;l

算法设计与分析实验报告 统计数字问题

算法设计与分析实验报告 实验名称统计数字问题评分 实验日期年月日指导教师 姓名专业班级学号 一.实验要求 1、掌握算法的计算复杂性概念。 2、掌握算法渐近复杂性的数学表述。 3、掌握用C++语言描述算法的方法。 4.实现具体的编程与上机实验,验证算法的时间复杂性函数。 二.实验内容 统计数字问题 1、问题描述 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9) 2、编程任务 给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2, (9) 三.程序算法 将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。把这些结果统计起来即可。 四.程序代码 #include int s[10]; //记录0~9出现的次数 int a[10]; //a[i]记录n位数的规律 void sum(int n,int l,int m) { if(m==1) {

int zero=1; for(int i=0;i<=l;i++) //去除前缀0 { s[0]-=zero; zero*=10; } } if(n<10) { for(int i=0;i<=n;i++) { s[i]+=1; } return; }//位数为1位时,出现次数加1 //位数大于1时的出现次数 for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1) { m=1;int i; for(i=1;i

算法设计与分析实验报告

算法设计与分析实验报告 教师: 学号: 姓名:

实验一:串匹配问题 实验目的:(1) 深刻理解并掌握蛮力法的设计思想; (2) 提高应用蛮力法设计算法的技能; (3) 理解这样一个观点: 用蛮力法设计的算法, 一般来说, 经过适度的努力后, 都可以对算法的第一个版本进行一定程度的改良, 改进其时间性能。 三、实验要求:( 1) 实现BF 算法; (2 ) 实现BF 算法的改进算法: KMP 算法和BM 算法; (3 ) 对上述 3 个算法进行时间复杂性分析, 并设计实验程序验证 分析结果。 #include "stdio.h" #include "conio.h" #include //BF算法 int BF(char s[],char t[]) { int i; int a; int b; int m,n; m=strlen(s); //主串长度 n=strlen(t); //子串长度 printf("\n*****BF*****算法\n"); for(i=0;i

算法设计实验报告

院系:计算机科学学院 专业:计算机科学与技术 年级: 2010级 课程名称:算法设计与分析基础 班号: 组号: 3 指导教师:邢光林 2012年 12月 30 日

组员 学号姓名 实验名称算法实验整体框架的构建实验室9#205 实验目的或要求1. 实验题目 算法实验主菜单的设计。 2.实验目的 ⑴熟悉实验环境VC++6.0; ⑵复习C、C++语言以及数据结构课程的相关知识,实现课程间的平滑过度; 3. 实验要求 1)设计的主菜单可以是图形模式的,也可以是控制台模式的。以控制台为例,主菜单大致如下: ------------------------- 《算法设计与分析》实验 ------------------------- 1.算法分析基础——Fibonacci序列问题 2.分治法在数值问题中的应用——最近点对问题 3.减治法在组合问题中的应用——8枚硬币问题 4.变治法在排序问题中的应用——堆排序问题 5.动态规划法在图问题中的应用——全源最短路径问题 99. 退出本实验 ------------------------- 请输入您所要执行的操作(1,2,3,4,5,99): 2)点击操作后进入相应的实验项目或是相应项目的下一级菜单; 3)可以反复执行,直到退出实验。

程序代码void menu(); int main() { Fibonacci fibonacciImpl; Heapsort heapsortImpl; Martrix martrixImpl; Thecoin thecoinImpl; int chose; menu(); cin>>chose; while(chose!=99) { switch(chose) { case 1:{fibonacciImpl.fib1();cout<>chose; } return 0; } void menu() { cout<<"---------------------------------------"<

算法设计实验报告二

算法设计实验报告 一、实验内容: 题目:1、编程实现最长公共子序列 描述:如题,需要你做的就是写一个程序,得出最长公共子序列。tip: 最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS (Longest Common Subsequence)。其定义是,一个序列S ,如 果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最 长的,则S 称为已知序列的最长公共子序列。 2、超级台阶 描述:有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要 走上第m级,共有多少走法? 注:规定从一级到一级有0种走法。 3、最大和 描述:给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 例子:0 -2 -7 0 9 2 -6 2 -4 1 -4 1

-1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15。 4、剑客决斗 描述:在路易十三和红衣主教黎塞留当权的时代,发生了一场决斗。n个人站成一个圈,依次抽签。抽中的人和他右边的人决斗,负者出圈。这场决斗的最终结果关键取决于决斗的顺序。现书籍任意两决斗中谁能胜出的信息,但“A 赢了B”这种关系没有传递性。例如,A比B强,B比C强,C比A强。如果A和B先决斗,C最终会赢,但如果B和C决斗在先,则最后A会赢。 显然,他们三人中的第一场决斗直接影响最终结果。 假设现在n个人围成一个圈,按顺序编上编号1~n。一共进行n-1场决斗。第一场,其中一人(设i号)和他右边的人(即i+1号,若i=n,其右边人则为1号)。负者被淘汰出圈外,由他旁边的人补上他的位置。已知n个人之间的强弱关系(即任意两个人之间输赢关系)。如果存在一种抽签方式使第k个人可能胜出,则我们说第k人有可能胜出,我们的任务是根据n个人的强弱关系,判断可能胜出的人数。

算法设计工具实验报告

深圳大学实验报告 课程名称计算机基础 项目名称算法设计工具 学院 专业 指导教师 报告人学号 实验时间 2016.12.01 提交时间 2016.12.08 教务处制

一、实验目的与要求 1.加深对算法设计和流程图的认识和理解; 2.掌握算法设计工具Raptor的基本工作环境; 3.掌握顺序结构、选择结构和循环结构的设计方法; 4.掌握Raptor的子图和子程序设计方法。 二、实验内容与方法 1.Raptor的工作环境 2.控制结构 (1)顺序结构案例一 (2)选择结构案例2 (3)循环结构案例3 3.子图和子程序案例4 4.练习题 三、实验步骤与过程 1.Raptor的工作环境 1)Raptor的下载与安装 在Internet上查找Raptor4.0.5.0003汉化版并下载,或访问Raptor官网(http://https://www.360docs.net/doc/6317487668.html,/)下载,按照Raptor汉化版安装向导的说明进行安装即可。 2)Raptor的窗口组成 启动Windows系统后,选择“开始”→“所有程序”→“Raptor汉化版”命令,或双击桌面上的Raptor快捷图标,打开Raptor的应用窗口,如图1所示。

图1 (1) 标题栏。标题栏位于Raptor 窗口的顶部,显示该软件的图标,应用程序 名称(Raptor 汉化版)以及当前正在处理的Raptor 的文件名。标题栏最左端是Raptor 图标,单击该图标可以打开该软件的控制菜单,包括“还原”、“移动”、“移动”、“大小”、“最大化”、“最小化”和“关闭”等命令。右边的三个按钮分别是“最小化”按钮、“最大化”/ “还原”按钮和“关闭”按钮。 (2) 菜单栏。菜单栏位于标题栏的下方,包括“文件”、“编辑”、“比例”、 “视图”、“运行”、“模式”、“画笔”、“窗口”、“生成”、“帮助”等10个菜单选项。单击每一个菜单选项都会激活一个下拉菜单,列出有关此项功能的具体操作命令。其中,“模式”菜单选项包含“初级”、“中级”、和“面向对象”3种模式。 (3) 工具栏。工具栏位于菜单栏的下方,显示常用的Raptor 命令选项,用于 快速启动这些应用,如“新建”、“打开”、“保存”、“运行”、“单步运行”以及“画笔”等。 (4) 符号区。Raptor 有6种基本符号,每个符号代表一个特定的语句类型。 各类语句的功能如下。 ① 赋值语句:用于各类运算以更改变量的值。 ② 调用语句:用于调用Raptor 内置过程、子图和子程序。 ③ 输入语句:允许用户输入数据,并将数据赋值给一个变量。 ④ 输出语句:用于显示变量的值或保存到文件中。 ⑤ 选择语句:经过条件判断后选择两条路径之一,并继续执行。 ⑥ 循环语句:允许重复执行一个或多个语句,知道某些条件为真值。 工具栏

算法设计与实现_实验报告

实验报告1 姓名学号班级 指导老师万润泽课程名称算法设计与分析 一、实验目的 1) 冒泡排序算法的实现 2)分析其算法的时间复杂度 二、实验环境(仪器设备、软件等)MicroSoft VC++ 6.0 三、实验要求 编写完整的实现冒泡排序算法的程序 四、实验步骤 源代码 五、实验结果 运行结果 六、思考题 实验报告2 姓名学号班级 指导老师万润泽课程名称算法设计与分析 一、实验目的 1) 理解汉诺塔问题的递归算法 2)能用生成函数求解递归方程 二、实验环境(仪器设备、软件等)MicroSoft VC++ 6.0 三、实验要求 编写完整的实现汉诺塔问题的程序 四、实验步骤 源代码 五、实验结果 运行结果 六、思考题 实验报告3 姓名学号班级

指导老师万润泽课程名称算法设计与分析 一、实验目的 1) 理解堆的构造、上移、下移操作,以及如何进行堆排序 2)堆排序算法的实现 二、实验环境(仪器设备、软件等) MicroSoft VC++ 6.0 三、实验要求 编写完整的实现堆排序的程序 四、实验步骤 源代码 五、实验结果 运行结果 六、思考题 实验报告4 姓名学号班级 指导老师万润泽课程名称算法设计与分析 一、实验目的 1) Dijkstra算法的实现 2)理解贪婪法的思想 二、实验环境(仪器设备、软件等) MicroSoft VC++ 6.0 三、实验要求 编写完整的实现Dijkstra算法的程序 四、实验步骤 源代码 五、实验结果 运行结果 六、思考题 实验报告5 姓名学号班级 指导老师万润泽课程名称算法设计与分析 一、实验目的 1) 0/1背包问题的算法实现 2)理解动态规划的思想 二、实验环境(仪器设备、软件等)

算法设计与分析实验报告三篇

算法设计与分析实验报告一 实验名称统计数字问题评分 实验日期2014 年11 月15 日指导教师 姓名专业班级学号 一.实验要求 1、掌握算法的计算复杂性概念。 2、掌握算法渐近复杂性的数学表述。 3、掌握用C++语言描述算法的方法。 4.实现具体的编程与上机实验,验证算法的时间复杂性函数。 二.实验内容 统计数字问题 1、问题描述 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9) 2、编程任务 给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2, (9) 三.程序算法 将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。把这些结果统计起来即可。 四.程序代码 #include int s[10]; //记录0~9出现的次数 int a[10]; //a[i]记录n位数的规律 void sum(int n,int l,int m) { if(m==1) {int zero=1; for(int i=0;i<=l;i++) //去除前缀0 { s[0]-=zero; zero*=10;

} } if(n<10) { for(int i=0;i<=n;i++) { s[i]+=1; } return; }//位数为1位时,出现次数加1 //位数大于1时的出现次数 for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1) {m=1;int i; for(i=1;iyushu) { i++; } s[0]+=i*(yushu+1);//补回因作模操作丢失的0 s[zuigao]+=(yushu+1);//补回最高位丢失的数目 sum(yushu,l-i-1,m+1);//处理余位数 }} void main() { int i,m,n,N,l; cout<<"输入数字要查询的数字:";

算法设计实验报告

华北电力大学 实验报告| | 实验名称算法设计与分析综合实验 课程名称算法设计与分析 | | 专业班级:学生姓名: 学号:成绩: 指导教师:实验日期:

[综合实验一] 分治策略—归并排序 一、实验目的及要求 归并排序是一个非常优秀的排序方法,也是典型的分治策略的典型应用。 实验要求: (1)编写一个模板函数:template ,MergeSort(T *a, int n);以及相应的一系列函数,采用分治策略,对任意具有:bool operator<(const T&x,const T&y);比较运算符的类型进行排序。 (2)与STL库中的函数std::sort(..)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题, 给出所用的时间比较。 二、所用仪器、设备 计算机、Visual C++软件。 三、实验原理 分治原理: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。 归并原理: 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 四、实验方法与步骤 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。 实现时间计量: #define _CLOCK_T_DEFINED srand((unsigned)time(0)); //定义一数组a[n];对每一个赋予一值。 a[i]=rand();得到随即数。 duration =(double)(finish -start)/CLOCKS_PER_SEC; start=clock();将系统时间赋予Start。以便以后进行比较。 std::sort(b,b+1000);系统执行1000个数据。 Finish-Start为最终结果。 五、实验结果与数据处理 实验结果截图:

算法设计与分析实验报告

本科实验报告 课程名称: 算法设计与分析 实验项目:递归与分治算法 实验地点:计算机系实验楼110 专业班级: 物联网1601 学号: 2016002105 学生姓名: 俞梦真 指导教师: 郝晓丽 2018年05月04 日 实验一递归与分治算法 1、1 实验目得与要求 1.进一步熟悉C/C++语言得集成开发环境; 2.通过本实验加深对递归与分治策略得理解与运用。 1、2实验课时 2学时 1、3 实验原理 分治(Divide-and—Conquer)得思想:一个规模为n得复杂问题得求解,可以划分成若干个规模小于n得子问题,再将子问题得解合并成原问题得解。 需要注意得就是,分治法使用递归得思想。划分后得每一个子问题与原问题得性质相同,可用相同得求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题得解。

1、4 实验题目 1.上机题目:格雷码构造问题 Gray码就是一个长度为2n得序列。序列无相同元素,每个元素都就是长度为n得串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应得Gray码(分治、减治、变治皆可). 对于给定得正整数n,格雷码为满足如下条件得一个编码序列。 (1)序列由2n个编码组成,每个编码都就是长度为n得二进制位串。 (2)序列中无相同得编码. (3)序列中位置相邻得两个编码恰有一位不同。 2.设计思想: 根据格雷码得性质,找到她得规律,可发现,1位就是0 1。两位就是00 01 11 10。三位就是000001 011 010110111 101 100。n位就是前n—1位得2倍个。N—1个位前面加0,N-2为倒转再前面再加1。 3.代码设计:

算法设计与分析实验报告

算法设计与分析实验报告 指导老师:沙莎 学院:信息科学与工程学院 班级:计科0508 姓名:戚婕 学号:10

完成日期:2007年12月 目录 实验一分治法 (2) 1.1 实验要求 (2) 1.2 实验容 (2) 1.3 核心算法 (2) 1.4 程序代码 (4) 1.5 实验结果 (8) 实验二贪心法 (10) 2.1 实验要求 (10) 2.2 实验容 (10) 2.3 核心算法 (10) 2.4 程序代码 (12) 2.5 实验结果 (18) 实验三动态规划 (20) 3.1 实验要求 (20) 3.2 实验容 (20) 3.3 核心算法 (20) 3.4 程序代码 (21) 3.5 实验结果 (24) 实验四深度优先搜索 (26) 4.1 实验要求 (26) 4.2 实验容 (26) 4.3 核心算法 (26) 4.4 程序代码 (27) 4.5 实验结果 (28) 实验五回溯法 (30)

5.1 实验要求 (30) 5.2 实验容 (30) 5.3 核心算法 (30) 5.4 程序代码 (31) 5.5 实验结果 (33) 实验一分治法 一.实验要求 1.了解用分治法求解的问题:当要求解一个输入规模为n,且n的取值相当大的问题 时, 如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1

相关文档
最新文档