当前位置: 首页 > wzjs >正文

黄页网站大全免费网在线大学生50个创新产品设计

黄页网站大全免费网在线,大学生50个创新产品设计,网页制作公司专业,网页设计html代码大全关于原神目录 字符串的基本概念 串的相关定义 BF(朴素查找算法) 算法原理​ BF算法的实现 BF算法的总结 KMP算法 算法原理​ i为什么可以不回退呢? 公式证明k是存在的. KMP算法的实现 总结​ 字符串的基本概念 字符串,简单来说,就是由零个或多个字符…

目录

字符串的基本概念

串的相关定义

BF(朴素查找算法)

算法原理​

BF算法的实现

BF算法的总结

KMP算法

算法原理​

i为什么可以不回退呢?

公式证明k是存在的.

KMP算法的实现

总结​


字符串的基本概念

字符串,简单来说,就是由零个或多个字符组成的有限序列。在大多数编程语言中,字符串被视为一种基本的数据类型,例如在 C++ 中,我们可以通过std::string来表示字符串;在 Python 中,直接使用引号括起来的字符序列即为字符串。字符串中的每个字符都有其对应的位置索引,从 0 开始计数。例如,对于字符串 "hello",'h' 的索引是 0,'e' 的索引是 1,以此类推。字符串的长度则是指其中字符的个数,"hello" 的长度为 5。

串的相关定义

  • 字符串的拷贝,比较,链接等等(C语言)
  • 串:用'  '引起来的字符序列,例如'abcd'  (区别字符串"abcd")
  • 空串:''  (区别字符串"")
  • 子串:包含空串和本身,'abc'的子串:'','a','b','c','ab','bc','abc'7个
  • 真子串:包含空串,不包含本身,'abc'的子串:'','a','b','c','ab','bc',6个
  • 串的长度:串中字符的数目,例如'abc'的长度为3;
  • 空格串:由一个或者多个空格组成的串' '
  • 空串:零个字符的串称为空串''

BF(朴素查找算法)

BF 算法的时间复杂度较高。在最坏情况下,对于主串长度为n,模式串长度为m,每一次比较都要进行m次字符比较,总共需要进行n - m + 1次尝试,所以时间复杂度为 O ((n - m + 1) * m),通常简化为 O (n * m)。空间复杂度则为 O (1),因为在匹配过程中只需要几个额外的变量来存储索引和中间比较结果,与输入字符串的长度无关。

算法原理​

BF 算法,也称为朴素匹配算法,是一种最基本的字符串匹配算法。其核心思想非常直观:对于给定的主串S和模式串P,从主串的第一个字符开始,依次与模式串的字符进行比较。如果在某一位置上,主串和模式串的字符不匹配,那么就将模式串向后移动一位,重新从模式串的第一个字符开始与主串的下一个字符进行比较,如此反复,直到在主串中找到与模式串完全匹配的子串,或者确定主串中不存在这样的子串为止。

1.字符串的查找举例:

"ababcabcdabcde"主串

"abcd"字串

2.查找算法定义:在主串str的pos位置查找子串sub,找到返回下标,没有找到返回-1;其实就是要用到字符串的查找匹配算法.

3.BF算法(BF朴素查找算法)分析:

i不回退对吗?

举例: 主串:aaaaab 子串:aaaab 得出结论:i必须要回退,否则有可能错误,其实就是i不回退,是错误的.

4.BF算法思想: 相等则继续比较,不相等即查找失败则回退,回退是i(主串的下标)退到刚才的位置的下一个,j退到0

//成功返回字串在主串中的下标,失败返回-1 pos:开始查找的主串下标;

BF算法的实现

static int BF(const char* str, const char* sub, int pos)
{assert(str != NULL && sub != NULL);if (str == NULL || sub == NULL || pos<0 || pos>strlen(str)){return -1;}int lenstr = strlen(str);int lensub = strlen(sub);int i = pos;int j = 0;while (i < lenstr && j < lensub){if (str[i] == sub[j]){i++;j++;}else{i = i - j + 1;j = 0;}}if (j >= lensub)return i - j;elsereturn -1;
}int main()
{const char* str1 = "ababcabcdabcde";const char* str2 = "abcd";printf("%d \n", BF(str1, str2, 0));//5printf("%d \n", BF(str1, str2, 6));//9printf("%d \n", BF(str1, str2, 10));//-1return 0;
}

BF算法的总结

在主串str的pos位置查找子串sub,找到返回下标,没有找到返回-1;

思想:相等则继续比较,不相等则回退,回退是i退到刚才的位置的下一个(i-j+1),j退到0

利用子串是否遍历完成,来判断查找是否成功,注意:不能利用主串来判断;

算法时间复杂度BF:O(n*m)

KMP算法

KMP 算法的时间复杂度为 O (n + m),其中n是主串长度,m是模式串长度。这是因为在匹配过程中,主串的每个字符最多被访问两次(一次是在匹配时,一次是在根据部分匹配表调整模式串位置时),而构建部分匹配表的时间复杂度为 O (m)。空间复杂度为 O (m),主要用于存储部分匹配表。

算法原理​

KMP 算法是一种高效的字符串匹配算法,它通过对模式串进行预处理,构建部分匹配表(也称为前缀函数),从而在匹配过程中能够跳过一些不必要的比较,大大提高匹配效率。部分匹配表记录了模式串中每个前缀的最长相同前缀和后缀的长度。在匹配过程中,当主串和模式串出现不匹配时,KMP 算法不是简单地将模式串向后移动一位,而是根据部分匹配表,将模式串向后移动尽可能多的位数,使得已经匹配的部分能够最大程度地利用,减少重复比较。

i为什么可以不回退呢?

不相等的例子:

"ababcabcdabcde" 主串

"abcd"子串

相等的例子:

"abcdabdabcdabc"主串

"abcdabc"子串

不相等,不回退(不相等还是往后走)

相等了,也是不回退(相等必然有一段相同的路,那么相同的路i不走,等着j走过来即可.)即相等的路j走过一段k长度的路.

一句话:i不回退,j退到k的位置.而BF算法是i退到刚才的位置+1,j退到0;

公式证明k是存在的.

得出一个重要的结论:

在匹配成功的子串中找到两个最长的相等的真子串,这两个子串满足如下特点:

  1. 一个串以子串的开头作为开头;
  2. 另一个串以失配前的最后一个字符作为结尾(Pj-1);
  3. k正是子串的长度;

KMP最大特点是指示主串的指针不需要回溯.整个匹配过程中,对主串仅需从头到尾扫描一遍.这对处理从外设输入的庞大文件很有效,可以边读入边匹配,而无需回头重读.

KMP算法的实现

#include <iostream>
#include <stdio.h>
#include <cassert>
#include <string>static int* GetNext(const char* str)
{int len = strlen(str);int* next = (int*)malloc(sizeof(int) * len);next[0] = -1;next[1] = 0;int j = 1;int k= 0;while (j+1 < len){if ((k==-1)||str[j] == str[k]){next[++j] = ++k;}else{k = next[k];}}return next;
}int KMP(const char* str, const char* sub, int pos)
{assert(str != NULL && sub != NULL);if (str == NULL || sub == NULL || pos<0 || pos>strlen(str)){return -1;}int lenstr = strlen(str);int lensub = strlen(sub);int i = pos;int j = 0;int* next = GetNext(sub);while (i < lenstr && j < lensub){if ((j==-1)||str[i] == sub[j]){i++;j++;}else{//i不回退;j = next[j];}}free(next);if (j >= lensub)return i - j;elsereturn -1;
}int main()
{const char* str1 = "ababcabcdabcde";const char* str2 = "abcd";printf("%d \n", KMP(str1, str2, 0));//5printf("%d \n", KMP(str1, str2, 6));//9printf("%d \n", KMP(str1, str2, 10));//-1return 0;
}

总结​

BF 算法和 KMP 算法作为字符串匹配领域的重要算法,各有其特点和适用场景。BF 算法简单直观,易于理解和实现,在一些简单场景中能够满足需求;而 KMP 算法通过巧妙的预处理和匹配策略,大大提高了匹配效率,在面对大规模数据和复杂匹配需求时表现出色。深入理解这两种算法的原理、实现和应用,能够帮助开发者在字符串处理相关的编程任务中,根据实际情况选择最合适的算法,提升程序的性能和效率。在未来的编程之旅中,无论是文本处理、数据挖掘还是其他涉及字符串操作的领域,掌握这两种算法都将为我们提供有力的支持,助力我们解决更多复杂的实际问题。


文章转载自:

http://gwav6WsL.cLndL.cn
http://UTrK3ITJ.cLndL.cn
http://KxYNgT00.cLndL.cn
http://ky0aUf1X.cLndL.cn
http://PtGW62XB.cLndL.cn
http://NYWq5FDo.cLndL.cn
http://16eY5ENr.cLndL.cn
http://R3DZa9hJ.cLndL.cn
http://yzevFmeJ.cLndL.cn
http://Vz8FfmW2.cLndL.cn
http://wFpDA3yp.cLndL.cn
http://s9jTJ6XL.cLndL.cn
http://F5UB4qZc.cLndL.cn
http://RmunrPJz.cLndL.cn
http://YVqyFBLB.cLndL.cn
http://eXdRR2Lz.cLndL.cn
http://hTNB3T2P.cLndL.cn
http://oq3JkeFf.cLndL.cn
http://MVS6iw9K.cLndL.cn
http://5XwaHvWD.cLndL.cn
http://yeYlAnX2.cLndL.cn
http://8jpV7eba.cLndL.cn
http://qJtUMQbR.cLndL.cn
http://ARFrmLtT.cLndL.cn
http://zcqeyWXr.cLndL.cn
http://zCzo0Lkf.cLndL.cn
http://79joT41o.cLndL.cn
http://pn53rS3n.cLndL.cn
http://C4Evenq5.cLndL.cn
http://0SiAucup.cLndL.cn
http://www.dtcms.com/wzjs/631475.html

相关文章:

  • 外贸网站源码去一品资源淮安专业做网站
  • 自己设计的网站如何推广区块链的网站怎么做
  • 永久免费的电销外呼系统seo如何推广网站
  • 网站推广员大连网站建设资讯
  • 慈利网站建设太原编程培训机构
  • 做网站可以赚钱吗?网页制作教程百度网盘
  • 网站制作app开发公司万网做网站顺序
  • 网站标题字体设计药品网站订单源码
  • 怎么建设局域网网站做塑料的网站
  • 广东阳春市建设局网站百度外链查询工具
  • 环保网站模板 htmlwordpress install.php 500
  • 优质网站建设的设计要点wordpress产品页面没有分类选择
  • 做招聘网站做服务器多少钱网站如何添加代码
  • 茂名网站建设优化沈阳网站做
  • 专做高中知识的网站wordpress自己安装了插件吗
  • 方山建站报价萝岗电子商务网站建设
  • 赤峰建网站的电话华东民航机场建设公司网站
  • 汉高建设公司网站片头制作网站
  • 金堂县建设局网站自己建立网站教程
  • 小型深圳网站定制开发顺德手机网站建设
  • 扁平化设计网站建设小红书关键词排名怎么做
  • 出名的网站建设公司网站如果不备案吗
  • 网站地址ip域名查询将网站的字体设计成百分比的形式要怎样定义
  • 团购做的好的网站成都建设企业网站
  • 常宁网站制作wordpress带会员的主题
  • 公司网站内容太原网站优化价格
  • 深圳龙岗做网站公司农业行业网站模板
  • 手机评测网站公众号制作135
  • 如何建立一个网站app做网站的要素
  • 三合一网站建设什么意思抖音代运营计划书