`
javasee
  • 浏览: 973362 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一步一步写算法(之字符串查找 下篇)

 
阅读更多

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】


前面我们谈到了KMP算法,但是讲的还不是很详细。今天我们可以把这个问题讲的稍微详细一点。假设在字符串A中寻找字符串B,其中字符串B的长度为n,字符串A的长度远大于n,在此我们先忽略。

假设现在开始在字符串A中查找,并且假设双方在第p个字符的时候发现查找出错了,也就是下面的情况:

那么这时候,A有什么选择呢?它可以左移1位,用A2~A(p-1)比较B1~B(p-2),然后再用A(p)~A(n+1)比较B(p-1)~B(n)位;或者左移2位,用A3~A(p-1)比较B1~B(p-3),然后再用A(p)~A(n+2)比较B(p-2)~B(n)位;依次类推,直到左移(p-2)位,用A(p-1)比较B(1),然后再用A(p)~A(p+n-2)比较B(2)~B(n)位。

不知道细心的朋友们发现什么规律没?因为A和B在前面(p-1)个数据是相等的,所以上面的计算其实可以这样看:用A2~A(p-1)比较B1~B(p-2),实际上就是B2~B(p-1)比较B1~B(p-2);用A3~A(p-1)比较B1~B(p-3),实际上就是B3~B(p-1)比较B1~B(p-3);最后直到B(p)和B(1)两者相比较。既然这些数据都是B自身的数据,所以当然我们可以提前把这些结果都算出来的。

那么这么多的选择,我们应该左移多少位呢?

其实判断很简单。假设我们左移1位,发现A2~A(p-1)的结果和B1~B(p-2)是一致的,那么两者可以直接从第(p-1)位开始比较了;如果不成功呢,那么只能左移2位,并判断A2~A(p-1)和B1~B(p-2)的比较结果了,......,这样以此类推进行比较。如果不幸发现所有的数据都不能比较成功呢,那么只能从头再来,从第1位数据依次进行比较了。

不知道讲清楚了没,还没有明白的朋友可以看看下面的代码:

当然,上面当然都是为了计算在索引n比较失败的时候,判断此时字符应该向左移动多少位。

可能朋友们看到了,上面的strlen又回来了?说明代码本身还有优化的空间。大家可以自己先试一试。


(三)、多核查找

多核查找其实不新鲜,就是把查找分成多份,不同的查找过程在不同的核上面完成。举例来说,我们现在使用的cpu一般是双核cpu,那么我们可以把待查找的字符分成两份,这样两份查找就可以分别在两个核上面同时进行了。具体怎么做呢,其实不复杂。首先我们要定义一个数据结构:

接着,我们要做的就是把字符串分成两等分,分别运算起始地址和长度。

分好之后,就可以开始并行运算了。

注意事项:

(1)这里omp宏要在VS2005或者更高的版本上面才能运行,同时需要添加头文件#include<omp.h>,打开openmp的开关;

(2)这里调用的strstr函数第2个参数是目标字符串的长度,和我们前面介绍的普通查找函数稍微不一样,前面的函数不能直接使用,但稍作改变即可。


分享到:
评论

相关推荐

    《算法精解:C语言描述》源代码

    6. **字符串处理**:如KMP算法用于高效地进行字符串匹配,Rabin-Karp算法利用哈希函数进行快速匹配。 7. **递归与分治**:递归是许多复杂算法的基础,如快速排序、归并排序和Fibonacci数列的计算。分治策略将大问题...

    算法的笔试题 附答案

    4. **字符串处理**:C++和C语言中的字符串操作是常见考点,如KMP算法、Rabin-Karp算法等字符串匹配算法,以及字符串的逆序、查找子串等问题。 5. **贪心算法和回溯法**:贪心算法在每一步选择最优解,而回溯法则...

    几个常用的Java算法

    7. **字符串处理**:KMP算法和Rabin-Karp算法用于字符串匹配,Trie树(字典树)则用于高效地存储和查找前缀相同的字符串。 8. **贪心算法**:贪心算法在每一步选择中都采取当前状态下最好或最优的选择,但并不保证...

    acm --算法分析

    8. **字符串处理**:KMP算法、Boyer-Moore算法、Rabin-Karp算法等,用于字符串匹配问题。 9. **排序与搜索**:快速排序、归并排序、堆排序、冒泡排序、插入排序、二分查找等,是基础且重要的算法。 10. **贪心算法...

    算法(个人总结)_算法知识_

    字符串处理在编程中常见,如KMP算法、Rabin-Karp算法用于模式匹配,Manacher's Algorithm用于找到字符串中的最长回文子串。 十、概率与随机化算法 在某些问题中,随机化算法能提供更好的解决方案,例如鸽巢原理、...

    牛客网算法基础和进阶资源

    5. **字符串处理**:KMP、Boyer-Moore、Rabin-Karp 等字符串匹配算法,以及Z函数、Manacher's算法等字符串处理技巧。 三、编程语言实战——Java 作为标签之一,Java 是实现算法的重要工具。熟悉 Java 的基本语法、...

    算法学习笔记.pdf

    KMP算法是一种改进的字符串匹配算法,通过预处理模式串(pattern)来实现在文本串(text)中高效匹配。它通过一个next数组来避免重复比较已经匹配的字符。 十四、贪心算法 贪心算法是一种在每一步选择中都采取当前...

    learning-algorithm-step-by-step3.rar_数值算法/人工智能_Visual_C++_

    文件名“一步一步写算法(之字符串查找上篇).txt”表明这个教程将详细讲解字符串查找的步骤。常见的字符串查找算法有: 1. 简单匹配:最基础的查找方式,从目标字符串的每个位置开始,逐个字符比较。 2. KMP算法:...

    DFA算法实现敏感词过滤

    在敏感词过滤的上下文中,每个状态代表字符串匹配过程中的一个阶段,起始状态是空字符串,输入符号通常是字符集中的单个字符,而状态转移则根据字符来决定。 首先,我们需要构建一个DFA。这个过程通常涉及将敏感词...

    十三个经典算法研究与总结、目录+索引

    KMP算法是一种高效的字符串匹配算法,由James H. Morris在1977年提出。本文通过逐步分析算法的思想,解释了KMP算法如何通过预处理模式串生成部分匹配表来加速搜索过程。 #### 七、遗传算法透析GA本质 遗传算法是一...

    汽车牌照的排序与查找问题-数据结构与算法课程设计报告.pdf

    二分查找算法适用于有序数组,其基本思想是将待查找区间分成两半,判断待查找的值与中间位置的值的关系,从而决定下一步查找范围。在实现时,我们先对车牌号进行排序,然后将车牌号中的每个字符转换成一个长整型数据...

    c++算法大全.docx

    - Rabin-Karp算法:使用哈希函数进行字符串匹配,减少比较次数。 - Boyer-Moore算法:根据模式串的特性进行滑动窗口匹配,提高查找效率。 6. **数据结构** - 数组:基础数据结构,提供固定大小的连续内存空间。 ...

    C++数据结构算法演示.rar

    7. 字符串匹配算法:如KMP算法、Boyer-Moore算法用于查找字符串中是否存在目标子串。 三、C++实现与演示 该压缩包中的"**数据结构算法演示**"可能包含了一系列的C++源代码示例,用于直观地展示各种数据结构和算法...

    数据压缩LZW算法效率不错值得看看

    5. **输出编码**:输出最近匹配的编码,并将它的后一个字符添加到当前字符串中,继续下一步的查找过程。 6. **字典更新**:随着编码过程的进行,字典会不断增长,包括由已编码字符串组合而成的新条目。 7. **循环...

    编译原理语法分析算法实现

    - **初始化栈和输入缓冲区**:初始化一个空栈和一个包含待分析字符串的缓冲区。 - **读取输入符号**:从缓冲区中读取下一个符号。 - **进行归约操作**:根据算符优先表中的信息决定是否进行归约操作。 - **循环处理*...

    KMP_1977.rar

    相比于朴素的字符串匹配算法,其效率有了显著提升,尤其是在模式串较短或重复字符较多的情况下。 KMP算法的应用广泛,包括但不限于文本处理、数据压缩、生物信息学等领域。通过理解并掌握KMP算法,可以提升对字符串...

    刘汝佳总结《算法竞赛入门经典》

    - `strchr`函数用于在字符串中查找特定字符的位置。 5. **字符串处理注意事项**: - 自定义字符串处理时必须确保字符串以`\0`结尾,以避免未定义行为。 #### 四、函数和递归 1. **函数调用**: - 函数执行...

    算法突击系列六.doc

    - **定义**:在每一步选择中都采取在当前状态下最好或最优的选择策略,希望最后达到全局最优解的一种算法思想。 - **应用场景**:最小生成树问题、霍夫曼编码等。 - **特点**: - 局部最优选择。 - 不回溯性。 ...

    数独算法Java版。(有注释,编译已过)

    解析方法可以从字符串或文件中读取数独,转换成内部的二维数组表示;打印方法则将数独盘面输出到控制台或文件。 ```java public static SudokuGrid parse(String input) { // ...解析输入并构建SudokuGrid实例 } ...

    数据结构与算法:C_语言描述(中文)

    本篇文章将基于C#语言这一背景,深入探讨数据结构与算法的相关概念、实现方式及其在实际问题解决中的应用。 #### 数据结构与算法概览 数据结构是指数据元素的组织形式,而算法则是解决问题的一系列步骤。二者紧密...

Global site tag (gtag.js) - Google Analytics