第3章 蛮力法资料
- 格式:ppt
- 大小:1.11 MB
- 文档页数:51
蛮力法的魅力摘要:蛮力法是我们算法中最常使用的算法,虽然巧妙和高效的算法很少来自于蛮力法,但是蛮力法依然是一种重要的算法设计技术。
在实际理论上,蛮力法可以解决可计算领域的各种问题,只是效率的高低不同而已。
因此蛮力法经常用来解决一些较小规模的问题。
蛮力法对于一些重要的问题可以产生一些合理的算法,他们具备一些实用价值,而且不受问题规模的限制。
蛮力法也可以作为某类问题时间性能的底限,来衡量同样问题的更高效算法。
本文将对蛮力法进行深入了解,发掘出蛮力法的价值。
关键字:蛮力法效率算法应用简单结合引言:蛮力法,由于对于解决一些问题时的低效,不够有技巧性,一直为人们所“诟病”。
但是,遍观我们所学的算法,只有蛮力法是可以适合于任何问题的。
而且,简单的招式,练到极致,就是绝招。
我们在解决的问题的时候,首先考虑的也是蛮力法。
只有当蛮力法不能高效处理问题时,我们才会思考其他算法。
这也就说明,蛮力法对于我们设计算法,仍是必不可少的。
1 蛮力法的原理顾名思义,蛮力法即是顺序往下寻找方法,直到问题的解决。
它所依赖的技术是扫描技术,关键是依次处理所有元素。
蛮力法的思想非常简单,没有很多条件的限制,比如动态规划法,必须满足最有性原理才可以使用。
它的方法上也没有缺陷,对于分治法,一旦子问题的规模不同,便不能在使用。
而蛮力法则没有这个要求。
因此,简单,易上手,是蛮力法的基本原理。
1 蛮力法与其他算法的比较大部分算法都是在蛮力法的基础上改进而来的。
这里比较蛮力法中的冒泡排序与分治法中的快速排序。
对于蛮力法,是所以元素都要经过比较之后再排序,显然这是不可取的。
比如2比1大,3比2大,那1和3就没必要再进行比较。
快速排序,就是有选择性的进行比较。
将序列分为两个子序列,用递归实现,从而使得算法的时间复杂度变为nlog2n,这就是技巧的体现(减治法也是如此),从中也可以看出,在蛮力法的基础上,我们可以改造出更好的算法,体现了蛮力法的重要性。
先看下运行过程:/*此程序用蛮力法求解旅行商问题,输入城市数目得出最优解,将运算时间存储到外部文件,精确到毫秒*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include <time.h>#include <sys/time.h>#include <assert.h>#define MAXSIZE 99999//#define CITYNUM 5 /*4个城市的话,其实全排列的只有3个,另外一个是起点固定的*///#define TOTLE 15 /*4个城市对应的道路一共有6条*/#define MAX 32int CITYNUM=0;int TOTLE=0;char city[MAXSIZE]={0}; /*和下面这个数组组成两个城市之间的道路*/char citytwo[MAXSIZE]={0};int distance[MAXSIZE]={0}; /*存放城市间距离*/int valueall[MAXSIZE]={0}; /*最后放每次运算的路径值*/int all=0; /*对应上面的*/char backarray[MAXSIZE]={0};long int bbb=0;int ccc=0;/*文件里存了全部的道路和距离比如:ab 7,读取数据到三个数组*/void read(){int nn = 1, ii = 1;int i = 1;int p ;FILE *fp;fp = fopen("in.dat", "rb");while(!feof(fp)){p=fscanf(fp,"%c %c %d\n",&city[nn],&citytwo[nn], &distance[nn]); /*读取的时候遇到回车所以fscanf时候加\n*/if((p != EOF)){nn++;i++;TOTLE++;}else{break;}}fclose(fp);printf("city ");printf("distance\n");for(ii = 1; ii < nn;ii++){printf(" %c%c %d\n", city[ii],citytwo[ii],distance[ii]);}}/*两两互换*/void swap(int *l, int *r){int temp;temp = *l;*l = *r;*r = temp;}/*打印各种东西...*/void print(int ncount, int *val){int n=0;int i;int ii=0;int nnn=0;int sum=0; /*每次运算加起来的最后路程*/int value[MAXSIZE]={0}; /*存放每次运算上面那个结果*/printf("a-");for(;n < ncount;n++){printf("%c-", val[n]);backarray[bbb]=val[n];bbb++;}printf("a");printf("=");/*起点城市*/for(i=0;i<TOTLE;i++){if(val[0]==citytwo[i+1]&&city[i+1]=='a'){printf("%d+", distance[i+1]);value[nnn]=distance[i+1];nnn++;}}/*中间的全排列城市*/for(i=0;i<ncount;i++){for(ii=1;ii<=TOTLE;ii++){if(val[i]==city[ii] && val[i+1]==citytwo[ii]){printf("%d+", distance[ii]);value[nnn]=distance[ii];nnn++;continue;}else if(val[i]==citytwo[ii] && val[i+1]==city[ii]){printf("%d+", distance[ii]);value[nnn]=distance[ii];nnn++;continue;}}}/*最后返回起点*/for(i=0;i<TOTLE;i++){if(val[ncount-1]==citytwo[i+1] && city[i+1]=='a'){printf("%d=", distance[i+1]);value[nnn]=distance[i+1];nnn++;}}/*存放走一次的路径*/for(i=0;i<nnn;i++){sum=sum+value[i];}printf("%d", sum);/*存入数组*/valueall[all]=sum;all++;printf("\n");}/*蛮力法穷举*/void func(int ncount, int n, int *val){if(1 == n){print(ncount, val);}else{int i = 0;int *pnew = (int *)malloc(sizeof(int)*ncount);for(;i < n;i++){memcpy(pnew, val, sizeof(int)*ncount);swap(pnew +ncount -n, pnew+ncount-1-i);func(ncount, n-1, pnew);}free(pnew);}}/*自动生成文件*/void become()int i,j;FILE *fp;fp = fopen("in.dat","w");//srand(unsigned(time(NULL)));for(i=0;i<CITYNUM;i++){for(j=i+1;j<=CITYNUM;j++){fprintf(fp,"%c %c %d\n",i+'a',j+'a',rand()%10+1);}}fclose(fp);}void del(){remove("in.dat");}int main(){printf("请输入城市的数目(大于1的整数):");scanf(" %d",&CITYNUM);CITYNUM=CITYNUM-1;become();float time_usea=0;float time_useb=0;struct timeval starta;struct timeval enda;struct timeval startb;struct timeval endb;int i = 0, ncount = CITYNUM, *val = 0;int temp;int loop;int n=0,d,cnt=0;char sa[10],sb[10];int j;gettimeofday(&starta,NULL);read();val = (int *)malloc(sizeof(int)*ncount);/* a 城市是起点,从b 城市开始全排列,把所有城市存在val中*/ for(i = 0;i < ncount;i++){val[i] ='b'+i;}func(ncount, ncount, val);/*for(i=0;i<all;i++){if(i%10==0){printf("%d ",valueall[i]);printf("\n");}else{printf("%d ",valueall[i]);}}*//*找到最短路程*/temp = valueall[0];for(i=1;i<all;i++){if(temp > valueall[i]){temp=valueall[i];ccc = i;}}printf("The shorttest way is:%d\n",temp);printf("a-");for(i=ccc*(CITYNUM-1);i<ccc*(CITYNUM-1)+(CITYNUM-1);i++){printf("%c-",backarray[i]);}printf("a");printf("\n");gettimeofday(&enda,NULL);time_usea=(__sec)*1000+(__usec)/1000;//毫秒printf("It took you %f 毫秒\n",time_usea);//printf("b = %ld,all=%d,ccc=%d\n",bbb,all,ccc);free(val);FILE *fp = NULL;fp = fopen("OUT.DAT", "a+");if(NULL == fp){printf("wrong");return 0;}fprintf(fp, "蛮力: %d %f\n", n,time_usea);//fprintf(fp, "分支: %d %f\n", n,time_useb/1000);fclose(fp);del();printf("如果需要再算一次,请按1\n");printf("如果需要退出,请按2\n");scanf("%d",&loop);switch(loop){case 1:return main();case 2:return;default:return;}return 0;}。
(word完整版)浙教版七年级下科学第三章运动和力复习提纲(word版可编辑修改)编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((word完整版)浙教版七年级下科学第三章运动和力复习提纲(word版可编辑修改))的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(word完整版)浙教版七年级下科学第三章运动和力复习提纲(word版可编辑修改)的全部内容。
第三章运动和力复习提纲一.机械运动1.机械运动:物体空间位置发生了变化的运动.也是最简单、最基本的运动形式。
2.参照物:在研究机械运动时,被选作标准的物体叫做参照物。
参照物的选择是任意的(除研究对象本身外),科学中一般取地面或相对于地面静止的物体作为参照物,可以不加以说明;若选取其他合适的物体做参照物研究机械运动时,则要作出说明.3.运动和静止的相对性: 运动和静止是相对参照物而言的。
选择不同的参照物对同一物体运动的描述结果可能是不同的。
4.机械运动的分类:根据运动路线的形状,可分为直线运动和曲线运动;而直线运动根据运动快慢是否变化,可分为匀速直线运动和变速直线运动。
匀速直线运动是最简单的机械运动,即运动的方向和快慢不发生变化的运动.5.比较物体的快慢有两种方法:⑴相同时间比较路程,路程大的速度快;⑵相同的路程比较时间,用时少的速度快。
6.速度和平均速度⑴速度是表示物体运动快慢的科学量.①定义:物体在单位时间内通过的路程叫做速度。
②计算公式:v=s/t ;变形公式:s=vt t=s/v③速度单位:国际单位:米/秒,记作:m/s常用单位:千米/时,记作:Km/h换算关系:1米/秒 = 3.6千米/时“1米/秒”表示:物体在1秒内通过的路程为1米。