当前位置:文档之家› 蛮力算法题目

蛮力算法题目

蛮力算法题目
蛮力算法题目

一、某国汽车车牌号码是由4位数字组成,某天一辆汽车违法交通规则,撞人后逃逸,当时目击证人有3人,可事后都忘记了车牌,只能回忆起车牌的一些零碎特征。甲:车牌前面的两位数字是相同;乙:车牌的后两位相同,但与前两位不同;丙(是一位数学爱好者):车牌的号码刚好是一个整数的平方。现在请你根据以上3位目击证人提供的线索,请用蛮力算法编写程序,来协助交警尽快找到肇事汽车的车牌号。

二、两个乒乓球队进行比赛,各出3人。甲队为A、B、C 3人,乙对为X、Y、Z 3人,由抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比赛,C说他不和X、Z比赛,请用蛮力算法编写程序找出3对赛手的名单。

A1-3 B1-3 C1-3 将1转换为X a-1+‘X’

三、A,B,C,D,E 5人为某次竞赛的前五名,他们在名次公布前猜名次。

A说:B得第三名,C得第五名if((b==3)+(c==5)=1)只说对了一半,

B说:D得第二名,E得第四名可以这样表示

C说:B得第一名,E得第四名

D说:C得第一名,B得第二名

E说:D得第二名,A得第三名

结果每个人都猜对了一半,请用蛮力算法编写程序计算出实际的名次。

四、有4个学生,上地理课时提出我国四大淡水湖的排序如下。

甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三;

乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三;

丙:红泽湖最小,洞庭湖第三;

丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三;

对于各个湖泊应处的地位,每个人只说对了一个。

根据以上情况,请用蛮力算法编写程序,计算出各个湖泊应处在第几位。

五、背包问题:小明有一只能装10千克的背包,现有白菜1棵5千克,猪肉一块2千克,酱油一瓶1.7千克,鱼一条3.5千克,白糖一代1千克,菜油一桶5.1千克,请用蛮力算法编写程序,计算出小明的背包所装东西的总重量最重。(其中每个物品要么装入背包,要么不装入背包,不能分割)。

总重量Num小于10 Num=a*5+b*2+c*1.7+d*3.5+e+f*5.1

模式匹配的KMP算法详解

模式匹配的KMP算法详解 模式匹配的KMP算法详解 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?回溯,没错,注意到(1)句,为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 为什么会发生这样的情况?这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为abcdef这样的,大没有回溯的必要。

蛮力法求解背包问题

/*程序说明:此程序用来解决蛮力法求解背包问题,运行程序输入背包容量和物品数量,屏幕打印运算过程,最后运算时间输出到文件*/ 先看下运行图片

#include / #include #include #include #include #define MAXSIZE 20000 //#define BAGWEIGHT 200 int a[MAXSIZE] = {0}; int array[MAXSIZE] = {0}; int weightarray[MAXSIZE] = {0}; /*存放各物品重量*/ int valuearray[MAXSIZE] = {0}; /*存放各物品价值*/ int lastweight[MAXSIZE]={0}; int lastvalue[MAXSIZE]={0}; int qq=0; /*上面的数组,变量都是蛮力法所用到,下面的都是分支限界法所用到*/ int BAGWEIGHT; /*背包的载重*/ int n; /*物品的数量*/ int weightarrayb[MAXSIZE] = {0}; int valuearrayb[MAXSIZE] = {0}; float costarrayb[MAXSIZE] = {0}; int finalb[MAXSIZE] = {0}; int finalweightb[MAXSIZE] = {0}; /*蛮力法输出穷举的每一种可能,并求出下界*/ void print() { int i,xx,cc,weight,value,pp,aa; weight = 0; value = 0; cc = 1; xx = 1; aa = 1; for(i = 1;i <= n;i++) { if(a[i]) { printf("%3d",i); array[xx] = i; xx ++;

字符串的模式匹配算法

在前面的图文中,我们讲了“串”这种数据结构,其中有求“子串在主串中的位置”(字符串的模式匹配)这样的算法。解决这类问题,通常我们的方法是枚举从A串(主串)的什么位置起开始与B串(子串)匹配,然后验证是否匹配。假设A串长度为n,B串长度为m,那么这种方法的复杂度是O(m*n)的。虽然很多时候复杂度达不到m*n(验证时只看头一两个字母就发现不匹配了),但是我们有许多“最坏情况”,比如: A=“aaaaaaaaaaaaaaaaaaaaaaaaab”,B=“aaaaaaaab”。 大家可以忍受朴素模式匹配算法(前缀暴力匹配算法)的低效吗?也许可以,也许无所谓。 有三位前辈D.E.Knuth、J.H.Morris、V.R.Pratt发表一个模式匹配算法,最坏情况下是O(m+n),可以大大避免重复遍历的情况,我们把它称之为克努特-莫里斯-普拉特算法,简称KMP算法。 假如,A=“abababaababacb”,B=“ababacb”,我们来看看KMP是怎样工作的。我们用两个指针i和j分别表示,。也就是说,i是不断增加的,随着i 的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。 例子: S=“abcdefgab” T=“abcdex” 对于要匹配的子串T来说,“abcdex”首字符“a”与后面的串“bcdex”中任意一个字符都不相等。也就是说,既然“a”不与自己后面的子串中任何一字符相等,那么对于主串S来说,前5位字符分别相等,意味着子串T的首字符“a”不可能与S串的第2到第5位的字符相等。朴素算法步骤2,3,4,5的判断都是多余,下次的起始位置就是第6个字符。 例子: S=“abcabcabc” T=“abcabx”

串的模式匹配算法实验报告

竭诚为您提供优质文档/双击可除串的模式匹配算法实验报告 篇一:串的模式匹配算法 串的匹配算法——bruteForce(bF)算法 匹配模式的定义 设有主串s和子串T,子串T的定位就是要在主串s中找到一个与子串T相等的子串。通常把主串s称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串T;不成功则指目标串s中不存在模式串T。bF算法 brute-Force算法简称为bF算法,其基本思路是:从目标串s的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串s的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串s中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下:

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0./*T非空。 intindex(strings,stringT,intpos) { inti=pos;//用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配intj=1;//j用于子串T中当前位置下标值while(i j=1; } if(j>T[0]) returni-T[0]; else return0; } } bF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是o(n+m).

模式匹配KMP算法实验报告

实验四:KMP算法实验报告 一、问题描述 模式匹配两个串。 二、设计思想 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KM P算法。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为a bcdef这样的,大没有回溯的必要。 改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。 如果不用回溯,那T串下一个位置从哪里开始呢? 还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样:

实验三____串的模式匹配

实验三串的模式匹配 一、实验目的 1.利用顺序结构存储串,并实现串的匹配算法。 2.掌握简单模式匹配思想,熟悉KMP算法。 二、实验要求 1.认真理解简单模式匹配思想,高效实现简单模式匹配; 2.结合参考程序调试KMP算法,努力算法思想; 3.保存程序的运行结果,并结合程序进行分析。 三、实验内容 1、通过键盘初始化目标串和模式串,通过简单模式匹配算法实现串的模式匹配,匹配成功后要求输出模式串在目标串中的位置; 2、参考程序给出了两种不同形式的next数组的计算方法,请完善程序从键盘初始化一目标串并设计匹配算法完整调试KMP算法,并与简单模式匹配算法进行比较。 参考程序: #include "stdio.h" void GetNext1(char *t,int next[])/*求模式t的next值并寸入next数组中*/ { int i=1,j=0; next[1]=0; while(i<=9)//t[0] { if(j==0||t[i]==t[j]) {++i; ++j; next[i]=j; } else j=next[j]; } } void GetNext2(char *t , int next[])/* 求模式t 的next值并放入数组next中 */ { int i=1, j = 0; next[1]= 0; /* 初始化 */ while (i<=9) /* 计算next[i+1] t[0]*/ { while (j>=1 && t[i] != t[j] ) j = next[j]; i++; j++;

if(t[i]==t[j]) next[i] = next[j]; else next[i] = j; } } void main() { char *p="abcaababc"; int i,str[10]; GetNext1(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); GetNext2(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); printf("\n\n"); }

分支限界法求解背包问题

分支限界法求解背包问题 /*此程序实现,分支限界法求解背包问题,分支限界法是根据上界=当前背包的价值+背包 剩余载重* (剩余物品最大价值/质量)*/ 分支r 10 I 分S: 104 1.200060' 6 2.i/eeoe #i nclude #i nclude

#include #include #include #define MAXSIZE 20000 //#define BAGWEIGHT 200 int a[MAXSIZE] = {0}; int array[MAXSIZE] = {0}; int weightarray[MAXSIZE] = {0}; /* 存放各物品重量*/ int valuearray[MAXSIZE] = {0}; /* 存放各物品价值*/ int lastweight[MAXSIZE]={0}; int lastvalue[MAXSIZE]={0}; int qq=0; /* 上面的数组,变量都是蛮力法所用到,下面的都是分支限界法所用到*/ int BAGWEIGHT; /* 背包的载重*/ int n; /* 物品的数量*/int weightarrayb[MAXSIZE] = {0}; int valuearrayb[MAXSIZE] = {0}; float costarrayb[MAXSIZE] = {0}; int finalb[MAXSIZE] = {0}; int finalweightb[MAXSIZE] = {0}; /* 从文件读取数据*/ void readb() int nn = 1,ii = 1; int i = 1; FILE *fp; fp = fopen("in.dat","rb"); while(!feof(fp)) {

(整理)力法求解超静定结构的步骤:.

第八章力法 本章主要内容 1)超静定结构的超静定次数 2)力法的解题思路和力法典型方程(显然力法方程中所有的系数和自由项都是指静定基本结构的位移,可以由上一章的求位移方法求出(图乘或积分)) 3)力法的解题步骤以及用于求解超静定梁刚架桁架组合结构(排架) 4)力法的对称性利用问题,对称结构的有关概念四点结论 5)超静定结构的位移计算和最后内力图的校核 6) §8-1超静定结构概述 一、静力解答特征: 静定结构:由平衡条件求出支反力及内力; 超静定结构的静力特征是具有多余力,仅由静力平衡条件无法求出它的全部(有时部分可求)反力及内力,须借助位移条件(补充方程,解答的唯一性定理)。 二、几何组成特征:(结合例题说明) 静定结构:无多余联系的几何不变体 超静定结构:去掉其某一个或某几个联系(内或外),仍然可以是一个几何不变体系,如桁架。即:超静定结构的组成特征是其具有多余联系,多余联系可以是外部的,也可能是内部的,去掉后不改变几何不变性。 多余联系(约束):并不是没有用的,在结构作用或调整结构的内力、位移时需要的,减小弯矩及位移,便于应力分布均匀。 多余求知力:多余联系中产生的力称为 三、超静定结构的类型(五种) 超静定梁、超静定刚刚架、超静定桁架、超静定拱、超静定组合结构 四、超静定结构的解法 综合考虑三个方面的条件: 1、平衡条件:即结构的整体及任何一部分的受力状态都应满足平衡方程; 2、几何条件:也称变形条件、位移条件、协调条件、相容条件等。即结构的变形必须 符合支承约束条件(边界条件)和各部分之间的变形连续条件。 3、物理条件:即变形或位移与内力之间的物理关系。 精确方法: 力法(柔度法):以多余未知力为基本未知量 位移法(刚度法):以位移为基本未知量。 力法与位移法的联合应用: 力法与位移法的混合使用:混合法 近似方法:

字符串匹配算法总结

Brute Force(BF或蛮力搜索) 算法: 这是世界上最简单的算法了。 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。 速度最慢。 那么,怎么改进呢? 我们注意到Brute Force 算法是每次移动一个单位,一个一个单位移动显然太慢,是不是可以找到一些办法,让每次能够让模式串多移动一些位置呢? 当然是可以的。 我们也注意到,Brute Force 是很不intelligent 的,每次匹配不成功的时候,前面匹配成功的信息都被当作废物丢弃了,当然,就如现在的变废为宝一样,我们也同样可以将前面匹配成功的信息利用起来,极大地减少计算机的处理时间,节省成本。^_^ 注意,蛮力搜索算法虽然速度慢,但其很通用,文章最后会有一些更多的关于蛮力搜索的信息。 KMP算法 首先介绍的就是KMP 算法。 这个算法实在是太有名了,大学上的算法课程除了最笨的Brute Force 算法,然后就介绍了KMP 算法。也难怪,呵呵。谁让Knuth D.E. 这么world famous 呢,不仅拿了图灵奖,而且还写出了计算机界的Bible (业内人士一般简称TAOCP). 稍稍提一下,有个叫H.A.Simon的家伙,不仅拿了Turing Award ,顺手拿了个Nobel Economics Award ,做了AI 的爸爸,还是Chicago Univ的Politics PhD ,可谓全才。 KMP 的思想是这样的: 利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离 比如 模式串ababac这个时候我们发现在c 处不匹配,然后我们看c 前面那串字符串的最大相等前后缀,然后再来移动 下面的两个都是模式串,没有写出来匹配串 原始位置ababa c 移动之后aba bac 因为后缀是已经匹配了的,而前缀和后缀是相等的,所以直接把前缀移动到原来后缀处,再从原来的c 处,也就是现在的第二个b 处进行比较。这就是KMP 。 Horspool算法。 当然,有市场就有竞争,字符串匹配这么大一个市场,不可能让BF 和KMP 全部占了,于是又出现了几个强劲的对手。

蛮力法、动归、贪心、分支限界法解01背包问题剖析

算法综合实验报告 学号: 1004121206 姓名:林 一、实验内容: 分别用蛮力、动态规划、贪心及分支限界法实现对0-1背包问题的求解,并至少用两个测试用例对所完成的代码进行正确性及效率关系上的验证。 二、程序设计的基本思想、原理和算法描述: 1、蛮力法 1.1数据结构 注:结构体obj用来存放单个物品的价值和重量 typedef struct obj { int w;//物品的重量 int v;//物品的价值 }; 1.2 函数组成 void subset(int s[][10],int n):用来生成子集的函数 void judge(int s[][10], obj obj[],int mark[],int n,int c):判断子集的可行性 int getmax(int mark[],int n,int &flag):求解问题的最优解 void outputObj(int flag,int s[][10],int n):输出选择物品的情况 1.3 输入/输出设计 本程序通过键盘进行输入、屏幕进行输出。 1.4 符号名说明

符号说明 S[][]存放子集 mark[]记录子集的可行性 n物品的个数 c物品的容量 max记录背包所能产生的最大价值 flag记录能产生最大价值的子集的编号 1.5 算法描述 算法的伪代码描述如下: 输入:背包的容量c,物品的个数n,n个物品的重量 w[n],价值v[n] 输出:装入背包的物品编号以及产生的最大价值 1.初始化最大价值 max=0,结果子集 s=φ; 2.对集合{1,2,......n}的每一个子集T,执行下述操作: 2.1初始化背包的价值 v=0,背包的重量 w=0; 2.2对子集t的每一个元素j 2.2.1 如果w+wj

结构力学-力法习题

结构力学自测题(第五单元) 力法 姓名 学号 一、是 非 题(将 判 断 结 果 填 入 括 弧 :以 O 表 示 正 确 ,以 X 表 示 错 误 ) 1、图 示 结 构 用 力 法 求 解 时,可 选 切 断 杆 件 2、4 后 的 体 系 作 为 基 本 结 构 。 ( ) 1 2 3 4 5 a b a b 2、图 示 结 构 中 ,梁 AB 的 截 面 EI 为 常 数,各 链 杆 的E A 1相 同, 当 EI 增 大 时 ,则 梁 截 面 D 弯 矩 代 数 值 M D 增 大 。 ( ) C 3、图 a 所 示 结 构,取 图 b 为 力 法 基 本 体 系 ,线 胀 系 数 为 α ,则?1= t t l h -322 α ) 。 ( ) l o +2t 1 X (a) (b) 4、图 示 对 称 桁 架 ,各 杆 EA l , 相 同 ,N P AB = 。 ( ) 5、图 a 所 示 梁 在 温 度 变 化 时 的 M 图 形 状 如 图 b 所 示 ,对 吗 ? ( ) (a) (b) 0C 图 -50C +15M 二、选 择 题 ( 将 选 中 答 案 的 字 母 填 入 括 弧 内 ) 1、图 a 所 示 结构 ,EI = 常数 ,取 图 b 为 力 法 基 本 体 系,则 下 述 结 果 中 错 误 的 是: A .δ230= ; B .δ 310= ; C .?20P = ; D .δ120= 。 ( ) l l l l /2X (a) P (b) 2、图 示 连 续 梁 用 力 法 求 解 时 ,最 简 便 的 基 本 结 构 是 : A .拆 去 B 、 C 两 支 座 ; B .将 A 支 座 改 为 固 定 铰 支 座 ,拆 去 B 支 座 ; C .将 A 支 座 改 为 滑 动 支 座 ,拆 去 B 支 座 ; D .将 A 支 座 改 为 固 定 铰 支 座 ,B 处 改 为 完 全 铰 。 ( ) 3、图 示 结 构 H B 为 : A .P ; B .-P ; C .P 2 ; D .- P 。 ( ) 4、图 示 两 刚 架 的 EI 均 为 常 数 ,并 分 别 为 EI = 1 和 EI = 10,这 两 刚 架 的 内 力 关 系 为: ( ) A .M 图 相 同; B .M 图 不 同; C .图 a 刚 架 各 截 面 弯 矩 大 于 图 b 刚 架 各 相 应 截 面 弯 矩; D .图 a 刚 架 各 截 面 弯 矩 小 于 图 b 刚 架 各 相 应 截 面 弯 矩。 /2/2 /2(a) l l /2/2 /2 (b) l l 5、在 力 法 方 程 δ ij j c i X ∑+=??1 中 : A B. C. D .;;;.???i i i =><000前三种答案都有可能。 ( ) 三、填 充 题 ( 将 答 案 写 在 空 格 内 ) 1、图 示 结 构 超 静 定 次 数 为 。 2、力 法 方 程 等 号 左 侧 各 项 代 表 , 右 侧 代 表 。 3、图 示 结 构,EI =常 数 , 在 给 定 荷 载 作 用 下 , Q AB =_____________。 l l l 4、试 绘 出 图 示 结 构 用 力 法 计 算 时 ,未 知 量 最 少 的 基 本 结 构 。 l l 1 1 2 l 5、图 a 结 构 中 支 座 转 动 θ,力 法 基 本 结 构 如 图 b ,力 法 方 程 中 ?1c = 。 l A (a) X 2 (b) θ

串的朴素模式匹配算法(BF算法)

//算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法 #include #include #define MAXL 255 #define FALSE 0 #define TRUE 1 typedef int Status; typedef unsigned char SString[MAXL+1]; //生成一个其值等于串常量strs的串T void StrAssign(SString &T, char *strs) { int i; T[0] = 0; //0号单元存储字串长度 for(i = 0; strs[i]; i++) //用数组strs给串T赋值 T[i+1] = strs[i]; T[0] = i; } //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0 int Index(SString S, SString T, int pos) { int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) //继续比较后面的字符 { i++; j++; } else//指针回退,重新开始匹配 { i = i -j + 2; j = 1; } } if(j > T[0]) return i - T[0]; else return 0;

int main() { SString S, T; int m; char strs1[MAXL]; //建立主串S char strs2[MAXL]; //建立模式串T printf("请输入主串和子串:\n"); printf("主串S: "); scanf("%s", strs1); printf("子串T: "); scanf("%s", strs2); StrAssign(S, strs1); StrAssign(T, strs2); m = Index(S, T, 1); if(m) printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m); else printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2); return 0; }

力法例题

[例题5-3-1] 一端固定,一端铰支的超静定梁,梁中受一集中荷载作用,求作内力图。 解:(1)取基本结构 (2)作、图 (3)求主系数和自由项 (4)列力法方程 解得: (5)叠加作弯矩图 [例题5-3-2] 求作连续梁的弯矩图及剪力图。 解法1:(1)取基本结构 (2)作、和图 (3)求主系数、副系数和自由项 (4)列力法方程 解方程得: (5)叠加作弯矩图 [例题5-3-3] 求作刚架的内力图。 解法1:(1)取基本结构 (2)作、和图 (3)求主系数、副系数和自由项 (4)列力法方程 解方程得: (5)叠加作弯矩图(6)求剪力与轴力 解法2:(1)取基本结构 (2)作、和图 (3)求主系数、副系数和自由项(4)列力法方程 解方程得: (5)叠加作弯矩图 [例题5-3-4] 求作刚架的内力图。 解:(1)取基本结构 (2)作、图 (3)求主系数和自由项(4)列力法方程 解得: (5)叠加作弯矩图 [例题5-3-5] 求作刚架的内力图。 解法1:(1)取基本结构 (2)作、和图 (3)求主系数、副系数和自由项(4)列力法方程 解方程得: (5)叠加作弯矩图 [例题5-5-2] 计算单跨排架结构。 解:(1)取基本结构

(2)作和图 (3)求主系数和自由项(4)列力法方程 解方程得: (5)叠加作弯矩图 [例题5-5-4] 计算两跨不等高排架结构。其中解:(1)取基本结构 (2)作、和图 (3)求主系数、副系数和自由项(4)列力法方程 解方法得: (5)叠加作弯矩图 [例题5-10-1] 校核图示结构的最后内力图。解:(1)平衡条件的校核 1)取结点D为对象 满足平衡条件 2)取ADE为对象 满足平衡条件 (2)位移条件的校核 1)检查A点的水平位移 2)检查A点的竖向位移 不满足位移条件 (3)正确的内力图 平衡条件的校核,取ADE为对象满足平衡条件 位移条件的校核,检查A点的竖向位移 满足位移条件 [例题5-11-1] 计算图示刚架,作弯矩图,常数。解法1:(1)取基本结构(一般解法)(2)作、和图 (3)求主系数、副系数和自由项 (4)列力法方程 解方法得: (5)叠加作弯矩图 解法2:(1)取基本结构(利用对称性)(2)作、和图 (3)求主系数、副系数和自由项 (4)列力法方程 解方法得: (5)叠加作弯矩图 [例题5-11-3] 利用对称性求图示结构的图。 解:取半刚架 (1)取基本结构 (2)作、和图 (3)求主系数、副系数和自由项 (4)列力法方程 解方法得: (5)叠加作弯矩图 [例题5-11-4]

模式匹配KMP算法实验步骤

一、问题描述 模式匹配两个串。 二、设计思想 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KM P算法。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为a bcdef这样的,大没有回溯的必要。

改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。 如果不用回溯,那T串下一个位置从哪里开始呢? 还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样: ...ababd... ababc ->ababc 这样i不用回溯,j跳到前2个位置,继续匹配的过程,这就是KMP算法所在。这个当T[j]失配后,j应该往前跳的值就是j的next值,它是由T串本身固有决定的,与S串无关。 《数据结构》上给了next值的定义: 0 如果j=1 next[j]={Max{k|1aaab ->aaab ->aaab 像这样的T,前面自身部分匹配的部分不止两个,那应该往前跳到第几个呢?最近的一个,也就是说尽可能的向右滑移最短的长度。 到这里,就实现了KMP的大部分内容,然后关键的问题是如何求next值?先看如何用它来进行匹配操作。 将最前面的程序改写成: int Index_KMP(String S,String T,int pos) { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) {

结构力学力法习题及答案

力法 作业 01 (0601-0610 为课后练习,答案已给出) 0601 图示结构,若取梁 B 截面弯矩为力法的基本未知量 1X ,当 2I 增大时,则 1X 绝对值: A .增大; B .减小; C .不变; D .增大或减小,取决于21/I I 比值 。( C ) q 0602 图示桁架取杆 AC 轴力(拉为正)为力法的基本未知量1X ,则有: A .X 10=; B .X 10>; C .X 10<; D .1X 不定 ,取决于12A A 值及α值 。( A ) a D 0603 图 b 示图a 结构的力法基本体系,则力法方程中的系数和自由项为: A .?11200P ><,; δ B .?11200P <<,;δ C . ?112 00P >> , ;δ D .?11200P <>,δ 。 ( B ) X X 0604 图 a 结构取力法基本体系如图 b ,1X 是基本未知量,其力法方程可写为11111c X δ+?=?,其中: A .??1100c >=,; B .??1100c <=,; C .??1100c =>,; D .??1100c =<, 。 ( A )

(a) (b) X 1 0605 图 a 结构的最后弯矩图为 : A .图 b ; B .图 c ; C .图 d ; D .都不 对 。 ( A ) l 3M /4 M /4 (a) (b) M /4 3M /4 M /8M /4 3M /4 M /2 (c) (d) 0606 图示结构 f (柔 度) 从小到大时,固定端弯矩 m 为: A .从小到大; B .从大到小; C .不变化; D . m 反向 。 ( B ) 0607 图示对称结构,其半结构计算简图为图: B.原 图 ( A ) 0608 图示结构( f 为柔度): A . M M A C >; B .M M A C =; C .M M A C <; D .M M A C =- 。( C )

串的模式匹配算法

串的匹配算法——Brute Force (BF)算法 匹配模式的定义 设有主串S和子串T,子串T的定位就是要在主串S中找到一个与子串T相等的子串。通常把主串S称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串S中找到一个模式串T;不成功则指目标串S中不存在模式串T。 BF算法 Brute-Force算法简称为BF算法,其基本思路是:从目标串S的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串S的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串S中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下: /*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0. /*T非空。 int index(String S, String T ,int pos) { int i=pos; //用于主串S中当前位置下标,若pos不为1则从pos位置开始匹配int j =1; //j用于子串T中当前位置下标值 while(i<=S[0]&&j<=T[0]) //若i小于S长度且j小于T的长度时循环 { if(S[i]==T[j]) //两个字母相等则继续 { ++i; ++j; } else //指针后退重新开始匹配 { i=i-j+2; //i退回到上次匹配首位的下一位 j=1; } if(j>T[0]) return i-T[0]; else return 0; } }

BF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m 次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m 从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是O(n+m).

C语言字符串模式匹配

数据结构面试之十四——字符串的模式匹配 题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。 十四、字符串的模式匹配 1. 模式匹配定义——子串的定位操作称为串的模式匹配。 2. 普通字符串匹配BF算法(Brute Force 算法,即蛮力算法) 【算法思想】: 第(1)步;从主串S的第pos个字符和模式的第一个字符进行比较之,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式串的字符比较之。 第(2)步骤;依次类推,直至模式T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功;函数值为和模式T中第一个字符相等的字符在主串S中的序号,否则称为匹配不成功,函数值为0。 比如对于主串S=”abacababc”; 模式串T=”abab”; 匹配成功,返回4。 对于主串S=”abcabcabaac”; 模式串T=”abab”; 匹配不成功,返回0。 【算法实现】: //普通字符串匹配算法的实现 int Index(char* strS, char* strT, int pos) { //返回strT在strS中第pos个字符后出现的位置。 int i = pos; int j = 0; int k = 0; int lens = strlen(strS);

int lent = strlen(strT); while(i < lens && j < lent) { if(strS[i+k] == strT[j]) { ++j; //模式串跳步 ++k; //主串(内)跳步 } else { i = i+1; j=0; //指针回溯,下一个首位字符 k=0; } }//end i if(j >= lent) { return i; } else { return 0; } }//end [算法时间复杂度]:设主串长度为m,模式串的长度为n。一般情况下n

串匹配问题:BF算法、KMP算法、BM算法

一、实验内容和目的 1、深刻理解并掌握蛮力算法的设计思想; 2、提高应用蛮力算法设计算法的技能; 3、理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努 力后,都可以对算法的第一个版本进行一定程度的改良,改进其时 间性能。 二、实验原理及基本技术路线图(方框原理图) 串匹配问题——给定两个串S=“s1s2…s n” 和T=“t1t2…t m”,在主 串S中查找子串T的过程称为串匹配,也称模式匹配。 串匹配问题属于易解问题。 串匹配问题的特征: (1)算法的一次执行时间不容忽视:问题规模n 很大,常常需要在 大量信息中进行匹配; (2)算法改进所取得的积累效益不容忽视:串匹配操作经常被调用,执行频率高。 BF算法: 基本思想:从主串S的第一个字符开始和模式T的第一个字符进行比 较,若相等,则继续比较两者的后续字符;若不相等,则从主串S 的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,若T中的字符全部比较完毕,则说明本趟匹配成功;若最后一轮匹配 的起始位置是n-m,则主串S中剩下的字符不足够匹配整个模式T, 匹配失败。这个算法称为朴素的模式匹配算法,简称BF算法。 KMP算法: 1. 在串S和串T中分别设比较的起始下标i和j; 2. 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较 完毕 2.1 如果S[i]=T[j],则继续比较S和T的下一个字符;否则 2.2 将j向右滑动到next[j]位置,即j=next[j];

2.3 如果j=0,则将i和j分别加1,准备下一趟比较; 2.4 如果T中所有字符均比较完毕,则返回匹配的起始下标;否则返回0; BM算法: BM算法与KMP算法的主要区别是匹配操作的方向不同。虽然BM算法仅把匹配操作的字符比突顺序改为从右向左,但匹配发生失败时,模式T右移的计算方法却发生了较大的变化。 设计思想:设文本串T,模式串为P。首先将T与P进行左对齐,然后进行从右向左比较,若是某趟比较不匹配时,BM算法就采用两条启发式规则,即坏字符规则和好后缀规则,来计算模式串向右移动的距离,直到整个匹配过程的结束。

背包问题求解方法综述

背包问题求解方法综述 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

算法分析与设计大作业 实验题目:0-1背包问题求解方法综述 组员: 班级: 指导老师: 0-1背包问题求解方法综述 【摘要】:0-1背包问题是一个经典的NP-hard组合优化问题,现实生活 中的很多问题都可以以它为模型。本文首先对背包问题做了阐述,然后 用蛮力解法、动态规划算法、贪心算法和回溯解法对背包问题进行求 解,分析了0-1背包问题的数学模型,刻划了最优解的结构特征,建立了 求最优值的递归关系式。最后对四种算法从不同角度进行了对比和总 结。 【关键词】:0-1背包问题;蛮力解法;动态规划算法;贪心算法;回溯解法。 0.引言 0-1背包问题是指给定n个物品,每个物品均有自己的价值vi和重量wi(i=1,2,…,n), 再给定一个背包,其容量为W。要求从n个物品中选出一部分物品装入背包,这部分物 品的重量之和不超过背包的容量,且价值之和最大。单个物品要么装入,要么不装入。 很多问题都可以抽象成该问题模型,如配载问题、物资调运[1]问题等,因此研究该问 题具有较高的实际应用价值。目前,解决0-1背包问题的方法有很多,主要有动态规划 法、回溯法、分支限界法、遗传算法、粒子群算法、人工鱼群算法、蚁群算法、模拟 退火算法、蜂群算法、禁忌搜索算法等。其中动态规划、回溯法、分支限界法时间复

杂性比较高,计算智能算法可能出现局部收敛,不一定能找出问题的最优解。文中在动态规划法的基础上进行了改进,提出一种求解0-1背包问题的算法,该算法每一次执行总能得到问题的最优解,是确定性算法,算法的时间复杂性最坏可能为O(2n)。 背包问题描述 0-1背包问题(KP01)是一个着名的组合优化问题。它应用在许多实际领域,如项目选择、资源分布、投资决策等。背包问题得名于如何选择最合适的物品放置于给定背包中。本文主要研究背包问题中最基础的0/1背包问题的一些解决方法。 为解决背包问题,大量学者在过去的几十年中提出了很多解决方法。解决背包问题的算法有最优算法和启发式算法[2],最优算法包括穷举法、动态规划法、分支定界法、图论法等,启发式算法包括贪心算法、遗传算法、蚁群算法、粒子算法等一些智能算法。 0-1背包问题一般描述为:给定n 种物品和一个背包。物品i 的重量是w(i),其价值为v(i),背包的容量为c 。问应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大? 在选择装入背包的物品时,对每种物品i 只有两种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,也不能只装入部分的物品i 。因此,该问题称为0-1背包问题。 此问题的形式化描述是,给定n i v w c i i ≤≤>>>1000,,,,要求找出一个n 元0-1向量n i x x x x i n ≤≤∈1}1,0{21,),,,,( ,使得c x w i i i ≤∑=n 1 ,而且i n i i x v ∑=1 达到最 大。 数学模型:∑=n i i i x v 1max

相关主题
文本预览
相关文档 最新文档