算法设计与分析实验报告.docx
《算法设计与分析实验报告.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
![算法设计与分析实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/17/c36b241f-3600-4a30-94f3-5ebf07bb3bbe/c36b241f-3600-4a30-94f3-5ebf07bb3bbe1.gif)
算法设计与分析实验报告
算法设计与分析
实验报告
教师:
学号:
姓名:
实验一:
串匹配问题
实验目的:
(1)深刻理解并掌握蛮力法的设计思想;
(2)提高应用蛮力法设计算法的技能;
(3)理解这样一个观点:
用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。
3、实验要求:
(1)实现BF算法;
(2)实现BF算法的改进算法:
KMP算法和BM算法;(3)对上述3个算法进行时间复杂性分析,并设计实验程序验证分析结果。
#include"stdio.h"
#include"conio.h"
#include
//BF算法
intBF(chars[],chart[])
{inti;inta;intb;intm,n;m=strlen(s);//主串长度
n=strlen(t);//子串长度
printf("\n*****BF*****算法\n");
for(i=0;i{b=0;a=i;while(s[a]==t[b]&&b!
=n)
{
a++;b++;}
if(b==n)
{printf("查找成功!
!
\n\n");return0;
}
}
printf("找不到%s\n\n",t);return0;}
//前缀函数值,用于KMP算法
intGETNEXT(chart[],intb)
{intNEXT[10];NEXT[0]=-1;
intj,k;j=0;k=-1;while(j{
if((k==-1)||(t[j]==t[k]))
{
j++;
k++;
NEXT[j]=k;}
elsek=NEXT[k];
}
b=NEXT[b];
returnb;
}
//KMP算法
intKMP(chars[],chart[])
{
inta=0;intb=0;
intm,n;m=strlen(s);//主串长度
n=strlen(t);//子串长度
printf("\n*****KMP算法*****\n");
while(a<=m-n)
{
while(s[a]==t[b]&&b!
=n)
{
a++;
b++;}
if(b==n)
{
printf("查找成功!
!
\n\n");
return0;
}
b=GETNEXT(t,b);
a=a-b;
if(b==-1)b++;
}
printf("找不到%s\n\n",t);
return0;}//滑动距离函数,用于BM算法
intDIST(chart[],charc)
{inti=0,x=1;
intn;n=strlen(t);
while(x&&i!
=n-1)
{
if(t[i]==c)
x=0;
elsei++;
}
if(i!
=n-1)
n=n-1-i;
returnn;}//BM算法
结果分析与体会:
glibc里的strstr函数用的是brute-force(naive)算法,它与其它算法的区别是strstr不对pattern(needle)进行预处理,所以用起来很方便。
理论复杂度O
(mn), 实际上,平均复杂度为O(n), 大部分情况下高度优化的算法性能要优于基于自动机的匹配算法,BF有一个重要性质是事先不用知道串的长度,而基于跳跃的算法是需要用字符串长度来判断结束位置的。
实验二:
最近对问题
2、实验目的:
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;
(2)理解这样一个观点:
分治与递归经常同时应用在算法设计之中。
3、实验要求:
(1)分别用蛮力法和分治法求解最近对问题;
(2)分析算法的时间性能,设计实验程序验证分析结论。
ClosestPair1.java //蛮力算法
import java.util.*; public class ClosestPair1 {
public static void main(String[] args) { /**
*输入需要比较的点的对数存在变量n中 */
Scanner in=new Scanner(System.in);
System.out.println("How many pairs of points to compare?
(有多少对点需要比较?
)"); int n=in.nextInt();
int[] x=new int[n]; int[] y=new int[n]; /**
*输入这些点的横坐标和纵坐标分别存储在x[n]和y[n] */
System.out.println("Please enter these points,X-coordinate(请输入这些点,横坐标):
"); for(int i=0;i x[i]=in.nextInt(); }
System.out.println("Please enter these points,Y-coordinate(请输入这些点,纵坐标):
"); for(int i=0;i y[i]=in.nextInt(); }
double minDist=Double.POSITIVE_INFINITY; double d; int indexI=0; int indexJ=0; /**
*求解最近对距离存在minDist中 */
double startTime=System.currentTimeMillis();//startTime for(int i=0;i for(int j=i+1;j d=Math.sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); if(d minDist=d; indexI=i; indexJ=j; } } }
double endTime=System.currentTimeMillis();//endTime /**
*打印输出最后求出的结果,最近的是哪两个点,以及最近距离和程序用的时间 */
System.out.println("The
closest
pair
is:
("+x[indexI]+","+y[indexI]+")
and
("+x[indexJ]+","+y[indexJ]+")");
System.out.println("The closest distance is "+minDist);
System.out.println("Basic Statements take(基本语句用时) "+(endTime-startTime)+" milliseconds!
"); }
}
ClosestPair2.java //分治算法
import java.util.*; public class ClosestPair2 {
public static void main(String[] args) { /**
*输入需要比较的点的对数存在变量n中 */
Scanner in=new Scanner(System.in);
System.out.println("How many pairs of points to compare?
(有多少对点需要比较?
)");
int n=in.nextInt(); /**
*输入这些点的横坐标和纵坐标,存储在点数组S[n]中 */
System.out.println("Please enter these points,X-coordinate and Y-coordinate.(请输入这些点,x坐标和y坐标):
");
Point[] S=new Point[n];
double startTime=System.currentTimeMillis();//starttime
for(int i=0;i int x=in.nextInt(); int y=in.nextInt(); S[i]=new Point(x,y);
System.out.println("("+S[i].getX()+","+S[i].getY()+")"); } /**
*求出这点的x坐标的中位数mid */
int minX=(int)Double.POSITIVE_INFINITY; int maxX=(int)Double.NEGATIVE_INFINITY; for(int i=0;i if(S[i].getX()maxX) maxX=S[i].getX(); }
int mid=(minX+maxX)/2; /**
*以mid为界把S中的点分为两组分别存放在范型数组列表point1和point2中 */
ArrayList point1=new ArrayList(); ArrayList point2=new ArrayList(); for(int i=0;i if(S[i].getX()<=mid) point1.add(S[i]); else
point2.add(S[i]); } /**
*将范型数组列表转换为数组类型S1和S2 */
Point[] S1=new Point[point1.size()]; Point[] S2=new Point[point2.size()]; point1.toArray(S1); point2.toArray(S2); /**
*将S1和S2中的点按x 坐标升序排列 */ sortX(S1); sortX(S2); /**
*打印输出排序后S1和S2的点 */
System.out.print("The points in S1 are:
");