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

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

 
阅读更多

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


昨天我们编写了简单的字符查找函数。虽然比较简单,但是也算能用。然而,经过我们仔细分析研究一下,这么一个简单的函数还是有改进的空间的。在什么地方改进呢?大家可以慢慢往下看。

下面的代码是优化前的代码,现在再贴一次,这样分析起来也方便些:

不知道朋友们发现没有,原来的while条件中有一个很费时的操作。那就是每次str移动的时候,都需要判断str的长度大小。如果str的长度远大于data的长度,那么计算str长度的时间是相当可观的。

上面的代码很好地解决了长度判断的问题,这样一来每次比较的长度很短,只要判断len的大小字符长度即可。但是,我们还不是很满足,如果两者不比较岂不更好。那么,有没有这个可能?我们发现,如果str在每次比较不成功的时候,就会自己递增一位。那么我们只要判断这一位是不是‘\0’不就可以了吗?所以说,我们的代码还可以写成下面的形式。

和上面第一次的优化不同,我们在进入while之前会判断两者的长度区别,但是经过第一次判断之后,我们就再也不用判断了,因为接下来我们只要判第n个元素是否为‘\0’即可,原来的n-1个元素我们已经判断过了,肯定是合法的元素。为什么呢?大家可以好好想想。


(二)、KMP算法

KMP算法本质上说是为了消除查找中的多余查找步骤。怎么就产生了多余的查找步骤了呢。我们可以用示例说话。假设有下面两个字符串:

A: baaaaabcd

B: aaaab

那么这两个查找的时候会发生什么现象呢?我们可以看一下:

我们发现B和A在从第2个元素开始比较的时候,发现最后一个元素是不同的,A的第6个元素是a,而B的第5个元素是b。按照普通字符串查找的算法,那么下面A会继续向右移动一位,但是事实上2-5的字符我们都已经比较过了,而且2-5这4个元素正好和B的前4个元素对应。这个时候B应该用最后一位元素和A的第7位元素比较即可。如果这个计算步骤能省下,查找的速度不就能提高了吗?


【预告: 下面一篇博客介绍KMP的编写和多核查找算法】



分享到:
评论

相关推荐

    多文本内字符串查找程序

    总结来说,"多文本内字符串查找程序"是一个利用C#实现的高效文本搜索工具,可能运用了先进的字符串查找算法,并结合了文件I/O操作和用户界面设计,以满足用户在大量文本数据中快速查找特定字符串的需求。

    字符串查找替换程序设计

    - **KMP算法**:不回溯的字符串匹配算法,通过预处理模式串得到部分匹配表,提高查找效率。 - **Boyer-Moore算法**:根据模式串的后缀进行跳过,减少不必要的比较,特别适合长模式串的查找。 - **Rabin-Karp算法*...

    超好用的字符串查找工具

    在IT领域,字符串查找工具是一种极其实用的软件,它能够帮助用户快速、高效地在大量文本数据中定位特定的字符串。这种工具对于开发者、数据分析师、程序员以及任何需要处理大量文本信息的人来说,都是不可或缺的助手...

    字符串查找_字符串查找_

    在给定的标题“字符串查找_字符串查找_”和描述“将字典中的单词输出并查找包含某一串字符的所有单词”中,我们可以深入探讨字符串查找的概念、方法以及在实际应用中的实现。 首先,字符串查找,简单来说,就是在一...

    彻底理解字符串查找算法的好书《Handbooks fo Exact String-Matching Algorithms》

    一本全面彻底讲解字符串查找算法的书。 书中讲解了34个字符串查找算法的思想。每个算法都有适用性的描述。每个算法都有逐步推演的例子(图解)。每个算法都有代码(C语言)。每个算法都有复杂度分析。每个算法都有...

    通用的固定长度编码格式的字符串查找算法的实现

    字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE、DB2、SYBASE、MS SQL SERVER、MYSQL等等)也都提供了对应的字符串处理函数,比如...本文介绍了通用固定长度编码格式的字符串查找算法的实现。

    一步一步写算法

    "一步一步写算法(之查找).pdf"可能会介绍这些算法的原理及其实现。 6. **双向链表**: - 双向链表是链表的一种形式,每个节点包含指向前一个和后一个节点的指针,允许双向遍历。"一步一步写算法(之双向链表).pdf...

    字符串查找源码

    "1.1 beta 源码"可能指的是某个早期版本的字符串查找算法的源代码,这通常对于理解算法的工作原理和进行进一步的优化至关重要。下面我们将详细探讨字符串查找的相关知识点。 字符串查找算法的目标是在一个文本(主...

    x86汇编语言文本字符串查找替换程序

    2. 查找字符串:遍历缓冲区,使用选定的查找算法寻找目标字符串。 3. 替换操作:找到目标字符串后,替换为新字符串,并更新缓冲区。 4. 保存结果:将修改后的缓冲区写回文件,完成替换。 五、相关文件解析 1. ...

    BF算法查找字符串中字符

    数据结构,BF算法,替换字符,查找字符,利用BF算法,一个一个回溯进行比较!~

    LZ78算法实现对任意字符串的压缩与解压

    它通过查找输入字符串中的最长匹配前缀来构建一个新的编码,从而实现数据的压缩。这种算法的主要思想是创建一个动态更新的字典,字典中的条目是输入字符串中的已编码子串。 在Java环境中实现LZ78算法,首先我们需要...

    数据结构和算法:字符串

    KMP算法是一种用于字符串搜索的高效算法,主要用于在一个文本字符串S内查找一个词W的出现位置。该算法通过预处理模式字符串(即要搜索的词)来实现高效匹配,大大减少了不必要的比较次数。Manacher算法则用于解决在...

    模式匹配、字符串查找

    这通常通过朴素字符串查找算法实现,如KMP(Knuth-Morris-Pratt)算法、Boyer-Moore算法或Rabin-Karp算法。这些算法各有优缺点,例如,KMP算法避免了不必要的回溯,而Boyer-Moore算法利用了模式和文本的特性来减少...

    文学研究助手(字符串的查找\模式匹配\KMP算法)

    《文学研究助手——深入解析KMP算法在字符串查找与模式匹配中的应用》 在文学研究领域,高效地处理文本信息是至关重要的。本项目“文学研究助手”正是为解决这一问题而设计,它利用C语言实现,核心算法是著名的KMP...

    基于字符串模式匹配算法的病毒感染检测问题_算法_数据结构_

    字符串模式匹配算法在此过程中扮演了核心角色,因为它可以高效地查找可能的病毒签名或恶意代码序列。本话题将深入探讨如何利用C语言实现基于字符串模式匹配算法的病毒感染检测。 首先,我们需要了解字符串模式匹配...

    字符串相似度比较算法

    在计算机科学领域,字符串相似度比较算法是一种用于评估两个字符串之间相似程度的技术。这些算法广泛应用于文本处理、信息检索、生物信息学等多个领域。当我们要判断两个字符串是否含有相同或相近的信息时,这类算法...

    C经典算法之字符串核对

    ### C经典算法之字符串核对 #### 概述 在当今高级编程语言中,字符串处理变得日益强大,例如 Java 和 Perl 提供了丰富的内置函数来处理字符串操作。然而,字符串搜索算法仍然是一个重要的研究领域。本文将介绍一种...

    JavaScript字符串查找1

    本文主要关注的是最基础的字符串查找算法——朴素搜索法。这是一种简单直观的方法,但效率较低,适用于小规模的数据处理。 **一、字符串查找的基本概念** 字符串查找,或者称为字符串搜索或字符串匹配,其目标是在...

    c语言写的根据字符串排序的算法

    在这个特定的案例中,我们讨论的是一个使用C语言编写的算法,它根据字符串的长度进行排序,如果长度相同,则根据字符串本身的优先级进行排序。这涉及到两个主要的编程概念:字符串处理和排序算法。 首先,让我们...

Global site tag (gtag.js) - Google Analytics