算法设计与分析实验报告.docx

上传人:b****4 文档编号:3070258 上传时间:2022-11-17 格式:DOCX 页数:13 大小:133.38KB
下载 相关 举报
算法设计与分析实验报告.docx_第1页
第1页 / 共13页
算法设计与分析实验报告.docx_第2页
第2页 / 共13页
算法设计与分析实验报告.docx_第3页
第3页 / 共13页
算法设计与分析实验报告.docx_第4页
第4页 / 共13页
算法设计与分析实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

算法设计与分析实验报告.docx

《算法设计与分析实验报告.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

算法设计与分析实验报告.docx

算法设计与分析实验报告

 

算法设计与分析

实验报告

 

 

教师:

学号:

姓名:

 

实验一:

串匹配问题

实验目的:

(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:

");

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1