顺序查找和蛮力字符串匹配

顺序查找

该算法只是简单地将给定数组中的连续元素和给定的查找键进行比较,直到遇到一个匹配的元素(成功查找),或者在遇到匹配元素前就遍历了整个列表(失败查找)。但是怎么才知道自己查找完整个列表了呢?在算法的每次循环时都检查是否到达表的末尾吗?如果我们把需要查找的K,放在A[n]的位置会怎么样?这样子的话,我们必然能够找到K,那就自然不用考虑是否到达列表末尾的问题了。但是我们怎么知道查找到的K是列表中原有的元素还是我们添加了列表末尾的?那自然是,查找结束之后,判断i的值,如果i的值等于n,则表示没找到,小于n则表示查找成功

A[n]=K有个生动形象的名字:哨兵

伪代码

SequentialSearch(A[0...n],K)
	//顺序查找算法实现,它用查找键累做限位器
	//输入:一个n个元素的数组A和一个查找键K
	//输出:第一个值等于K的元素的位置,如果找不到这样的元素,返回-1
	A[n] <- K
	i <- 0
	while A[i] != K do
		i <- i + 1
	if i < n return i
	else 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+m1=pm1
在这里插入图片描述
字符串匹配问题的蛮力算法是显而易见:将模式对准文本的前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],代表一个模式
	//输出:
	//如果查找成功,返回文本的第一个匹配子串中第一个字符的位置,否则返回-1
	for i <- 0 to n-m do
		j <- 0
		while j < m and P[j]=T[i+j] do
			j <- j+1
			if j=m
				return i
	return -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;
    }
}

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿豆蛙给生活加点甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值