顺序查找和蛮力字符串匹配
顺序查找
该算法只是简单地将给定数组中的连续元素和给定的查找键进行比较,直到遇到一个匹配的元素(成功查找),或者在遇到匹配元素前就遍历了整个列表(失败查找)。但是怎么才知道自己查找完整个列表了呢?在算法的每次循环时都检查是否到达表的末尾吗?如果我们把需要查找的K,放在A[n]的位置会怎么样?这样子的话,我们必然能够找到K,那就自然不用考虑是否到达列表末尾的问题了。但是我们怎么知道查找到的K是列表中原有的元素还是我们添加了列表末尾的?那自然是,查找结束之后,判断i的值,如果i的值等于n,则表示没找到,小于n则表示查找成功。
A[n]=K有个生动形象的名字:哨兵
伪代码
SequentialSearch(A[0...n],K)//顺序查找算法实现,它用查找键累做限位器//输入:一个n个元素的数组A和一个查找键K//输出:第一个值等于K的元素的位置,如果找不到这样的元素,返回-1A[n] <- Ki <- 0while A[i] != K doi <- i + 1if i < n return ielse return -1
Java代码实现
public class SequentialSearch {public static void main(String[] args) {int[] a = new int[6];a[0] = 43; a[1]=54;a[2]=3;a[3]=6;a[4]=34;int index = -1;index = Search(a,1);if (index!=-1) System.out.println("查找成功,索引为:"+index);else System.out.println("查找失败!");index = Search(a,54);if (index!=-1) System.out.println("查找成功,索引为:"+index);else System.out.println("查找失败!");}public static int Search(int[] arr,int k){int len = arr.length;arr[len-1] = k;int i=0;while (arr[i]!=k){i++;}if (i!=len-1) return i;else return -1;}
}
结果如下:
蛮力字符串匹配
思路
字符串匹配问题:给定一个n个字符串组成的串[称为文本(text)],一个m(m ≤ \leq ≤n)个字符的串[称为模式],从文本中寻找匹配模式的子串。更准确地说,我们求的是i——文本中第一个匹配子串最左元素的下标——使得 t i = p 0 , . . . , t i + j = p j , . . . , t i + m − 1 = p m − 1 t_i=p_0,...,t_{i+j}=p_j,...,t_{i+m-1}=p_{m-1} ti=p0,...,ti+j=pj,...,ti+m−1=pm−1
字符串匹配问题的蛮力算法是显而易见:将模式对准文本的前m个字符,然后从左到右匹配每一对相应的字符,直到m对字符全部匹配(算法就可以停止了)或者遇到一对不匹配的字符。在后一种情况下,模式向右移一位,然后从模式的第一种字符开始,继续把模式和文本中的对应字符进行比较。
注意:在文本中,最后一轮子串匹配的起始位置为n-m(假设文本位置的下标是从0到n-1)。在这个位置之后,再也没有足够的字符可以匹配整个模式,因此也就没有必要继续匹配下去了。
伪代码
BruteForceStringMatch(T[0...n-1],P[0...m-1])//该算法实现了蛮力字符串匹配//输入://一个n个字符的数组T[0...n-1],代表一段文本//一个m个字符的数组P[0...m-1],代表一个模式//输出://如果查找成功,返回文本的第一个匹配子串中第一个字符的位置,否则返回-1for i <- 0 to n-m doj <- 0while j < m and P[j]=T[i+j] doj <- j+1if j=mreturn ireturn -1
Java代码实现
public class BruteForceStringMatch {public static void main(String[] args) {String A = "fhodsahfo";String P1 = "ods";String P2 = "os";int index = -1;index = StringMatch(A,P1);if (index!=-1) System.out.println("查找成功,索引为:"+index);else System.out.println("查找失败!");index = StringMatch(A,P2);if (index!=-1) System.out.println("查找成功,索引为:"+index);else System.out.println("查找失败!");}public static int StringMatch(String A,String P){int n = A.length();int m = P.length();for (int i=0;i<n-m+1;i++){int j=0;while (j<m&&A.charAt(i+j)==P.charAt(j)){j++;if (j == m) return i;}}return -1;}
}
结果如下:
顺序查找和蛮力字符串匹配相关推荐
- 蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法
蛮力法在字符串匹配问题中的应用 字符串匹配问题通常是给定一个n个字符组成的串(称为文本),一个m(m<=n)个字符的串(称为模式),从文本中寻找匹配模式的子串.显然我们需要逐个匹配,这是蛮力算法 ...
- 蛮力法在查找算法中的应用(JAVA)--顺序查找
蛮力法在查找算法中的应用 对于查找算法来说,最简单的一个思路就是逐个匹配,直到找到目标元素 顺序查找: public class Main {public static void main(Strin ...
- 1.9 编程基础之顺序查找 11 连续出现的字符 python
http://noi.openjudge.cn/ch0109/11/ """ 1.9 编程基础之顺序查找 11 连续出现的字符 http://noi.openjudge. ...
- 字符串匹配:字符串中查找某子串
字符串匹配:字符串中查找某子串 需求 具体算法 常规方法 程序 KMP算法 程序 后续 需求 我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法.而目前常用的字符串匹配算法有很多, ...
- 蛮力法 字符串匹配
字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提 ...
- 【超详细图解】字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?
关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多.至于选择哪一种字符串匹 ...
- 子串查找(字符串匹配)
子串查询 首先,我们来定义两个概念,主串和模式串.我们在字符串 A 中查找字符串 B,则 A 就是主串,B 就是模式串.我们把主串的长度记为 n,模式串长度记为 m.由于是在主串中查找模式串,因此,主 ...
- # 字符串从右往左查找_字符串匹配(搜索,查找)算法
(一)前言 所谓的字符串匹配就是在一个长字符串(可称文本T)中找一个短字符串(可称模式P),看长字符串中是否存在短字符串,若存在则返回出现的第一个位置,若不存在则返回一个标记.字符串搜索算法有很多,比 ...
- 字符串匹配(多模式匹配篇)
字符串匹配(多模式匹配篇) 摘要: 问题的提出:众所周知,KMP算法在O(n)的时间中solve单模式串匹配问题.但怎样solve多模式串匹配问题呢? Solve:本文用简要记叙了使用trie树,tr ...
最新文章
- mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述
- JS获取iFrame的内容
- python处理大量excel数据-python如何批量处理excel数据?
- 8. String to Integer
- 搭建QT和VS2010集成开发环境
- HTML 元素居中的方法
- WdatePicker 设置日期第一个比第二个的日期小
- vue-cli@2的原理解析
- linux最基础的几个指令
- jcenter那些事儿
- JSP和Servlet互相传输数据的过程中产生的乱码问题及解决方案(没有使用AJAX的情况)...
- node.js学习笔记之模拟路由
- IEEE Trans LaTex模板参考文献格式
- CAD重装时显示已安装
- 美国VERSA VGG-4422-U-A240有一种幸福叫微笑
- ThinkPHP开发手册
- 如何测量二极管的正负极
- hexo的next主题换到Yelee(Yilia)
- 频谱细化-----Zoom-FFT算法介绍及MATLAB实现
- 路由器和三层交换机的搞笑文章