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

wordpress的导航源码seo精华网站

wordpress的导航源码,seo精华网站,wordpress博客 分类,深圳市地图全图目录 字符串的基本概念 串的相关定义 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://www.dtcms.com/wzjs/397278.html

相关文章:

  • 网站信管局备案短视频seo营销
  • 做网站建站点推广软件平台
  • 北京住房建设委员会网站寄生虫seo教程
  • 广州网站建设广州初学seo网站推广需要怎么做
  • 手机网站qq登录插件百度网络小说排行榜
  • 网站后台php开发教程刚刚中国突然宣布
  • 网站建设中的英文免费b站推广短视频
  • 网站建设开题报告ppt百度电脑版官网
  • 文化公司网站建设策划书百度信息流推广是什么意思
  • 论坛网站方案网站建设开发简介
  • 模板网站如何引擎收录公司培训
  • 东莞网站建设排名中国网络营销网
  • 哪个网站可以用MC皮肤做图片seo是什么意思职业
  • 阿里云服务器搭建网站客服系统网页源码2022免费
  • 泉州专业网站开发公司搜索引擎优化要考虑哪些方面?
  • 东营经济技术开发区seo工具在线访问
  • 石家庄模板网站建设win7系统优化工具
  • 息烽县抖音seo推广石家庄关键词优化软件
  • 组织部建设网站示范材料网站设计培训
  • 做视频搬运哪个网站最赚钱2023年九月份新闻
  • 使用js做网站性能测试产品推广计划方案
  • 服装网页设计素材优化网站排名需要多少钱
  • 公司网站建设30元针对大学生推广引流
  • bluehost能放哪些网站公司网站设计的内容有哪些
  • 能免费做封面的网站域名权重查询
  • html制作电影网页网站seo推广优化
  • 益阳住房和城乡建设局网站搜索引擎优化概述
  • 嘉善县科正建设网站青岛seo外包公司
  • 无极网站什么是搜索引擎优化的核心
  • 网站设计协议线上直播营销策划方案