Redis缓存(笔记三:Redis6新数据类型)

目录

1. 介绍

2. Bitmaps(可以称为字符串,专门进行位操作的字符串)

2.1 概念

2.2 setbit(设置Bitmaps中某个偏移量的值)

2.3 getbit(获取Bitmaps中某个偏移量的值)

2.4 bitcount(统计字符串被设置为1的bit数,访问过的用户为1,没有访问过的为0)

2.5 bitop(复合操作,将多种情况的操作结果保存在destkey中)

3. HyperLogLog(做基数处理,去重等..)

3.1 概念

3.2 pfadd(添加指定元素到HyperLogLog中)

3.3 pfcount(计算HLL的近似基数)

3.4 pfmerge(合并其它的key,进行计算等)

4. Geospatial(对经纬度,地理信息等操作)

4.1 概念

4.2 geadd(添加地理位置)

4.3 geopos(获取指定地区的坐标值)

4.4 geodist(获取两个位置之间的直线距离)

4.5 georadius(以给定的经纬度为中心,找出某一半径内的元素)


1. 介绍

在Redis 6中,有几种比较特殊且功能强大的数据结构:Bitmaps(位图)、HyperLogLog(超级对数日志)、Geospatial(地理空间)

1. Bitmaps(位图):

  • 作用:Bitmaps 是 Redis 中的一种非常紧凑和高效的数据结构,用来处理位操作相关的需求。
  • 用途:主要用于记录某些状态或者事件是否发生过,例如用户是否点击过某个按钮、某天是否有用户访问网站等。因为它可以节省大量内存,特别适合于需要高效率地记录大量布尔型状态的场景。

2. HyperLogLog(超级对数日志):

  • 作用:HyperLogLog 是一种概率性数据结构,用于统计元素的基数(唯一元素的数量),占用固定大小的内存空间。
  • 用途:适合于需要快速估计大数据集合中的唯一元素数量,例如统计网站的独立访客数、统计一周内不同IP地址访问网站的数量等。

3. Geospatial(地理空间):

  • 作用:Geospatial 是 Redis 提供的一种处理地理位置和坐标的数据结构,可以存储地理位置的经度和纬度,并支持相关的地理位置查询操作。
  • 用途:适合于需要存储和查询地理位置信息的应用场景,如附近的商家搜索、地点推荐等。

2. Bitmaps(可以称为字符串,专门进行位操作的字符串)

2.1 概念
  • Bitmaps本身不是数据类型,他只是字符串,专门进行位操作的字符串;

Bitmaps与set的区别:

提高了空间利用率,提高了cpu内存的利用率;

对比 setBitmaps 在存储独立用户空间方面的差异:

  • setBitmaps 存储独立用户空间对比
数据类型一天一个月一年
set400MB12GB144GB
Bitmaps12.5MB375MB4.5GB
  • 备注
    • Bitmaps 并不是万能的。如果网站每天的独立访问用户很少(例如只有 10 万,大量的僵尸用户),则对比情况如下。
    • Bitmaps 在用户数量少的情况下不太适合,因为这时候大部分位都是 0,使其不太高效。
2.2 setbit(设置Bitmaps中某个偏移量的值)
  • SETBIT 命令用于设置 Bitmaps 中某个偏移量的值,可以将指定位置的位设置为 0 或 1;
    • <key>: Bitmaps 的键
    • <offset>: 偏移量,从 0 开始
    • <value>: 设置的值,只能是 0 或 1
SETBIT <key> <offset> <value>
# 设置键 `userbitmap` 在偏移量 5 处的位值为 1
127.0.0.1:6379> SETBIT userbitmap 5 1
(integer) 0# 设置键 `userbitmap` 在偏移量 10 处的位值为 1
127.0.0.1:6379> SETBIT userbitmap 10 1
(integer) 0# 设置键 `userbitmap` 在偏移量 5 处的位值为 0
127.0.0.1:6379> SETBIT userbitmap 5 0
(integer) 1
2.3 getbit(获取Bitmaps中某个偏移量的值)
  • GETBIT 命令用于获取 Bitmaps 中某个偏移量的值,返回该位的值(0 或 1);
    • <key>: Bitmaps 的键
    • <offset>: 偏移量,从 0 开始
GETBIT <key> <offset>
# 获取键 `userbitmap` 在偏移量 5 处的位值
127.0.0.1:6379> GETBIT userbitmap 5
(integer) 0# 获取键 `userbitmap` 在偏移量 10 处的位值
127.0.0.1:6379> GETBIT userbitmap 10
(integer) 1# 获取键 `userbitmap` 在偏移量 15 处的位值
127.0.0.1:6379> GETBIT userbitmap 15
(integer) 0
2.4 bitcount(统计字符串被设置为1的bit数,访问过的用户为1,没有访问过的为0)
  • BITCOUNT 命令用于统计 Bitmaps 中被设置为 1 的位的数量。该命令可以统计整个 Bitmaps 的 1 位数,也可以通过指定 startend 参数来统计特定范围内的 1 位数;
    • <key>: Bitmaps 的键
    • [start] (可选): 开始的字节下标,负数表示从末尾开始计算
    • [end] (可选): 结束的字节下标,负数表示从末尾开始计算
BITCOUNT <key> [start end]
# 统计键 `userbitmap` 中所有被设置为 1 的位的数量
127.0.0.1:6379> BITCOUNT userbitmap
(integer) 2
# 统计键 `userbitmap` 在字节 0 到字节 1 范围内被设置为 1 的位的数量
127.0.0.1:6379> BITCOUNT userbitmap 0 1
(integer) 1# 统计键 `userbitmap` 在最后 2 个字节范围内被设置为 1 的位的数量
127.0.0.1:6379> BITCOUNT userbitmap -2 -1
(integer) 1
2.5 bitop(复合操作,将多种情况的操作结果保存在destkey中)
  • BITOP 命令用于对多个 Bitmaps 进行位运算,包括 AND(交集)、OR(并集)、NOT(非)、XOR(异或)操作,并将结果存储在 destkey 中;
    • <operation>: 运算类型,可以是 ANDORNOTXOR
    • <destkey>: 结果存储的目标键
    • <key>: 输入的源键,可以有一个或多个
BITOP <operation> <destkey> <key> [key...]
  • 操作类型:
    • AND: 交集(所有键中对应位都为 1,则结果位为 1)
    • OR: 并集(至少一个键中对应位为 1,则结果位为 1)
    • NOT: 非(键中对应位取反,NOT 只能有一个源键)
    • XOR: 异或(键中对应位不同则结果位为 1)
# 计算键 `bitmap1` 和 `bitmap2` 的位交集,结果存储在 `result`
127.0.0.1:6379> BITOP AND result bitmap1 bitmap2
(integer) <result-length>
# 计算键 `bitmap1` 和 `bitmap2` 的位并集,结果存储在 `result`
127.0.0.1:6379> BITOP OR result bitmap1 bitmap2
(integer) <result-length>
# 计算键 `bitmap1` 的位取反,结果存储在 `result`
127.0.0.1:6379> BITOP NOT result bitmap1
(integer) <result-length>
# 计算键 `bitmap1` 和 `bitmap2` 的位异或,结果存储在 `result`
127.0.0.1:6379> BITOP XOR result bitmap1 bitmap2
(integer) <result-length>

3. HyperLogLog(做基数处理,去重等..)

  • Redis 提供了三种主要的 HyperLogLog 操作命令:PFADDPFCOUNTPFMERGE。这些命令允许我们高效地执行基数估计、添加元素、统计唯一元素数量、以及合并多个 HyperLogLog;
3.1 概念
  • 在现代应用中,统计数据的基数(Unique Visitors,独立 IP 数,等)是常见需求。传统方法精确但耗费内存大,而 Redis 提供的 HyperLogLog 可以在较低的空间占用下高效估计集合的基数;
  • 基数是集合中不重复元素的个数:数据集 {1, 3, 5, 7, 5, 7, 8},其基数集为 {1, 3, 5, 7, 8},基数为 5;
  • 空间效率: 固定使用约 12 KB 内存;
  • 适用场景: 处理大规模数据集,允许少量误差;
  • 特点
    • 不存储实际元素,仅用于基数估计;
    • 可处理多达 2642^{64}2​64​​ 个不同元素;
3.2 pfadd(添加指定元素到HyperLogLog中)
  • PFADD 命令用于向 HyperLogLog 中添加元素。如果这些元素是新出现的(即之前没有添加过),HyperLogLog 的估计基数将增加;
    • <key>: HyperLogLog 的键
    • <element>: 要添加的元素,可以是一个或多个
PFADD <key> <element> [element ...]
  • 如果 HyperLogLog visitors 中没有这些元素,它会更新并增加基数估计:
# 添加用户 user1, user2, user3 到 HyperLogLog `visitors`
127.0.0.1:6379> PFADD visitors user1 user2 user3
(integer) 1  # 1 表示基数发生了变化
3.3 pfcount(计算HLL的近似基数)
  • PFCOUNT 命令返回 HyperLogLog 中估计的唯一元素数量。可以对单个或多个 HyperLogLog 进行基数估计;
    • <key>: HyperLogLog 的键,可以是一个或多个;
PFCOUNT <key> [key ...]
  • (integer) 表示估计的唯一元素数量:
# 统计 HyperLogLog `visitors` 中的唯一元素数量
127.0.0.1:6379> PFCOUNT visitors
(integer) 3  # 估计的唯一元素数# 统计多个 HyperLogLog `visitors1`, `visitors2` 的合并基数
127.0.0.1:6379> PFCOUNT visitors1 visitors2
(integer) 5  # 合并估计的唯一元素数
3.4 pfmerge(合并其它的key,进行计算等)
  • PFMERGE 命令将多个 HyperLogLog 合并为一个目标 HyperLogLog。合并后的结果保存在指定的目标键中;
    • <destkey>: 目标 HyperLogLog 的键
    • <sourcekey>: 源 HyperLogLog 的键,可以是一个或多个
PFMERGE <destkey> <sourcekey> [sourcekey ...]
  • 合并后的 total_visitors 将包含 visitors1visitors2 的所有元素,并估计其总的唯一元素数量;
    • 返回值: OK 表示操作成功
# 合并 HyperLogLog `visitors1`, `visitors2` 到 `total_visitors`
127.0.0.1:6379> PFMERGE total_visitors visitors1 visitors2
OK

4. Geospatial(对经纬度,地理信息等操作)

4.1 概念
  • Redis 3.2 中增加了对 GE0 类型的支持。GE0,Geographic,地理信息的缩写。该类型,就是元素的 2维坐标,在地图上就是经纬度。redis 基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度 Hash 等常见操作;
  • 地理空间数据存储方式
    • Redis 使用有序集合(Sorted Set)来存储地理空间数据。
    • 每个成员(member)都有一个关联的分数(score),这个分数用来排序,通常用来表示成员的位置。
  • 地理位置表示
    • 每个地理位置通过经度(longitude)和纬度(latitude)来表示。
    • Redis 使用二维平面坐标系来存储这些位置信息。
  • 地理位置的索引
    • 有序集合中的每个成员是一个地理位置的标识符,可以是任意字符串。
    • 每个成员都有一个对应的地理坐标(经纬度),以及用来排序的分数。
4.2 geadd(添加地理位置)
  • GEADD 是一个用于向地理空间索引(Geo Index)添加成员的命令,它可以将带有经度和纬度信息的成员添加到指定的地理位置集合(GeoSet)中;
    • <key>: 地理位置集合(GeoSet)的键名。
    • <longitude>: 成员的经度。
    • <latitude>: 成员的纬度。
    • <member>: 要添加的成员名称。
GEADD <key> <longitude> <latitude> <member> [longitude latitude member...]
  • 添加单个成员:
GEADD cities 13.361389 38.115556 "Palermo"
  • 添加多个成员:
GEADD cities 15.087269 37.502669 "Catania" 13.361389 38.115556 "Palermo"
  • 注意事项:
    • GEADD 命令会创建地理位置集合(如果它不存在),并将指定的成员添加到集合中。
    • 成员的经度和纬度需要是有效的浮点数值。
    • 成员名称可以是任何字符串,但必须唯一标识该成员。
4.3 geopos(获取指定地区的坐标值)
  • GEOPOS 是用于获取地理位置集合(GeoSet)中成员的经度和纬度信息的命令。它可以用来查询指定成员在地理位置集合中的坐标信息;
    • <key>: 地理位置集合(GeoSet)的键名。
    • <member>: 要查询坐标信息的成员名称。
GEOPOS <key> <member> [member...]
  • 返回值:

    如果指定的成员存在于地理位置集合中,GEOPOS 返回一个数组,每个成员的坐标用一个两元素的数组表示 [longitude, latitude]。如果成员不存在于集合中,返回 nil

  • 查询单个成员的坐标:
GEOPOS cities "Palermo"
假设 "Palermo" 的坐标是 `[13.361389, 38.115556]`,则命令返回:
1) 1) "13.361389"2) "38.115556"
  • 查询多个成员的坐标:
GEOPOS cities "Palermo" "Catania"
假设 "Palermo" 的坐标是 `[13.361389, 38.115556]`,"Catania" 的坐标是 `[15.087269, 37.502669]`,则命令返回:
1) 1) "13.361389"2) "38.115556"
2) 1) "15.087269"2) "37.502669"
  • 注意事项:
    • GEOPOS 返回的坐标是以字符串形式表示的浮点数,分别代表经度和纬度。
    • 如果查询的成员不存在于地理位置集合中,返回 nil
    • GEOPOS 命令可以用于单个成员或多个成员的查询,允许一次性获取多个成员的坐标信息。
4.4 geodist(获取两个位置之间的直线距离)
  • GEODIST 是用于计算地理位置集合(GeoSet)中两个成员之间距离的命令。它能够返回成员之间的距离,单位默认为米(meters),或者可以通过选项指定为其他单位(如千米、英里等);
    • <key>: 地理位置集合(GeoSet)的键名。
    • <member1>: 第一个成员的名称。
    • <member2>: 第二个成员的名称。
    • [unit]: (可选)距离的单位,可选项包括:
      • m: 米(默认)
      • km: 千米
      • mi: 英里
      • ft: 英尺
GEODIST <key> <member1> <member2> [unit]
  • 返回值:

    如果两个成员都存在于地理位置集合中,GEODIST 返回这两个成员之间的距离。如果其中一个或两个成员不存在于集合中,返回 nil

  • 假设有以下数据:

    • 商店 A 的经纬度为 (13.361389, 38.115556)
    • 商店 B 的经纬度为 (15.087269, 37.502669)
GEODIST stores "storeA" "storeB" km
这表示商店 A 和商店 B 之间的距离是 163.8964 千米:
127.0.0.1:6379> GEODIST stores "storeA" "storeB" km
"163.8964"
4.5 georadius(以给定的经纬度为中心,找出某一半径内的元素)
  • GEORADIUS 是 Redis 中用于根据给定的经纬度和半径查找地理位置元素的命令;
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
- `key`: Redis 中存储地理位置数据的键名。
- `longitude` 和 `latitude`: 给定的中心点经纬度,用于确定搜索的中心。
- `radius`: 搜索半径,可以是以 `m` (米), `km` (千米), `ft` (英尺), `mi` (英里) 为单位的浮点数。
- `unit`: 单位参数,指定 `radius` 的单位,可以是 `m` (米), `km` (千米), `ft` (英尺), `mi` (英里)。
- `WITHCOORD`: 返回每个位置元素的经纬度。
- `WITHDIST`: 返回每个位置元素与中心点的距离。
- `WITHHASH`: 返回每个位置元素的 geohash 值。
- `COUNT count`: 指定返回的最大元素数量。
- `ASC|DESC`: 结果的排序方式,按距离升序或降序排列。
- `STORE key`: 将结果存储到指定键名的有序集合中。
- `STOREDIST key`: 将结果存储到指定键名的有序集合中,并且同时存储每个位置元素与中心点的距离。
  • 假设我们有一个名为 stores 的 Redis 地理位置集合,其中存储了不同商店的经纬度信息。我们可以使用 GEORADIUS 命令来查找以某一经纬度为中心,半径内的商店。
    • 例如,假设要查找以经度 13.361389 和纬度 38.115556 为中心,半径 2000 米内的商店,并返回商店的经纬度和距离:
    • 这将返回半径 2000 米内所有商店的经纬度和它们与中心点的距离。
GEORADIUS stores 13.361389 38.115556 2000 m WITHCOORD WITHDIST
- 返回结果:
1) 1) "storeA"2) 1) "13.36138933897018433"2) "38.11555639549629859"3) "100.0"    // 与中心点的距离,单位由 WITHDIST 参数决定
2) 1) "storeB"2) 1) "13.35622221279144287"2) "38.12111264686523257"3) "190.0"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/26890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java I/O操作

引言 在Java编程中&#xff0c;输入和输出&#xff08;I/O&#xff09;操作是必不可少的部分。Java I/O通过一系列流&#xff08;Stream&#xff09;类和方法&#xff0c;支持文件操作、控制台输入输出、网络I/O等多种I/O操作。本文将详细介绍Java I/O的基础概念、文件操作、字…

vue实现类似微信按住发送语音给后端

一、需求是点击发送按钮说话获取语音文件发送给后台、鼠标移除即发送,限制时长30s 代码如下 <ttemplete><div class="bottom"><el-button type="primary" size="small" @mousedown.native="startRecord" @mouseup.n…

第二十七章 使用 MTOM 进行附件

文章目录 第二十七章 使用 MTOM 进行附件附件和 SOAP 消息打包具有全部内联部分的 SOAP 消息&#xff08;默认&#xff09; 第二十七章 使用 MTOM 进行附件 可以在 SOAP 请求和响应消息中包含附件。首选方法是使用 IRIS 数据平台对 MTOM&#xff08;消息传输优化机制&#xff…

FPGA专项课程即将开课,颁发AMD官方证书

社区成立以来&#xff0c;一直致力于为广大工程师提供优质的技术培训和资源&#xff0c;得到了众多用户的喜爱与支持。为了满足用户需求&#xff0c;我们特别推出了“基于Vitis HLS的高层次综合及图像处理开发”课程。 本次课程旨在帮助企业工程师掌握前沿的FPGA技术&#xff…

携程任我行礼品卡怎么用?

前两天我用积分兑了张携程卡&#xff0c;但是最近有没有假期&#xff0c;这张携程卡又不知道咋用 最后朋友告诉我可以在收卡云上转让&#xff0c; 去收卡云看了一眼&#xff0c;携程卡现在99.1折&#xff0c;果断出了&#xff0c;到账速度好快啊

Java多线程编程与并发处理

引言 在现代编程中&#xff0c;多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持&#xff0c;包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容&#xff0c;并通过表格进行总结和…

MySQL----主键、唯一、普通索引的创建与删除

创建索引 CREATE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);CREATE INDEX: 用于创建普通索引的关键字。index_name: 指定要创建的索引的名称。索引名称在表中必须是唯一的。table_name: 指定要在哪个表上创建索引。(column1, column2, ……

IntelliJ IDEA 用maven创建web项目

前言 已经安装并配置好Tomcat。具体步骤&#xff1a;Tomcat安装及环境变量配置(一看就会)-CSDN博客​编辑https://blog.csdn.net/longyongyyds/article/details/135825647 具体步骤 1.新建一个maven项目 2&#xff0c;配置好tomcat服务器 3.运行测试一下 maven教程&#xf…

前端面试题(四)|求职季面试分享|答案版

面试形式&#xff1a;线上面试&#xff1a;&#xff08;一面&#xff1a;电话&#xff09;&#xff1a;时长10分钟 面试评价&#xff1a;面试官介绍公司业务面试者倾听介绍 面试官&#xff1a;技术人员 面试官的提问大纲&#xff1a;本公司招聘要求 面试官提问&#xff08;面试…

使用PHP对接企业微信审批接口的流程和基本接口(一)

在现代企业中&#xff0c;审批流程是非常重要的一环&#xff0c;它涉及到企业内部各种业务流程的规范和高效运转。而随着企业微信的流行&#xff0c;许多企业希望将审批流程整合到企业微信中&#xff0c;以实现更便捷的审批操作。本文将介绍如何使用PHP对接企业微信审批接口&am…

鸿蒙轻内核A核源码分析系列四(3) 虚拟内存

4.2 函数LOS_RegionAlloc 函数LOS_RegionAlloc用于从地址空间中申请空闲的虚拟地址区间。参数较多&#xff0c;LosVmSpace *vmSpace指定虚拟地址空间&#xff0c;VADDR_T vaddr指定虚拟地址&#xff0c;当为空时&#xff0c;从映射区申请虚拟地址&#xff1b;当不为空时&#…

响应式网页开发方法与实践

随着移动设备的普及和多样化&#xff0c;响应式网页开发已成为现代网页设计的主流趋势。响应式网页&#xff08;Responsive Web Design, RWD&#xff09;是一种网页设计技术&#xff0c;其核心思想是通过灵活的布局和媒体查询&#xff0c;使网页能够适应不同设备和屏幕尺寸&…

WebSocket 详解--spring boot简单使用案例

一、什么是WebSocket WebSocket 是一种网络通信协议&#xff0c;专为在单个 TCP 连接上进行全双工通信而设计。WebSocket 允许客户端和服务器之间的消息能够实时双向传输。这与传统的 HTTP 请求-响应模式有很大的不同。 二、WebSocket 的关键特性 双向通信&#xff1a;WebSocke…

【StableDiffusion】Prompts 提示词语法;高阶用法;写作顺序是什么,先写什么后写什么

Prompt 写作顺序 第一步&#xff1a;画质词画风词 第一步先写“画质词”和“画风词” 画质词如下&#xff1a; 画风词如下&#xff1a; 第二步&#xff1a;画面主体描述 人物性别、年龄、发型、发色、情绪表情、衣服款式、衣服颜色、动作、饰品、身材、五官微调 第三步&…

多表联查小情景例子

这里有个需求&#xff1a; 需要给定套餐表setmeal 的 id 查询这个套餐内的所有菜品 dish 实际上如果可能&#xff0c;只需要查询套餐菜品表(setmeal_dish)&#xff0c;查看一个套餐内包含包含的所有菜品&#xff0c;然后把这些菜品全部取出即可。 看一下setmeal_dish 表&…

ZnO电阻片在低电场区域的泄漏电流及其电阻的负温度系数

在低电场区域,流过ZnO非线性电阻的泄漏电流小于1mA.泄漏电流不仅与施加的电压幅值有关,而且与温度高低有关。图2.6表示温度对泄漏电流的影响,温度越高,电子在电场作用下定向的运动就越激烈,导致泄漏电流增大。因此温度升高将导致电阳值下降,即ZnO 电阻呈现负温度特性。 一般以…

centos下创建raid6磁盘阵列

在CentOS系统中创建RAID 6阵列&#xff0c;可以使用mdadm工具。 以下是创建RAID 6阵列的基本步骤和示例代码&#xff1a; 安装mdadm工具&#xff08;如果尚未安装&#xff09;&#xff1a; sudo yum install mdadm 假设你有至少四个以上的磁盘设备&#xff08;例如 /dev/sdi…

STM32存储左右互搏 模拟U盘桥接SPI总线FATS读写FLASH W25QXX

STM32存储左右互搏 模拟U盘桥接SPI总线FATS读写FLASH W25QXX STM32的USB接口可以模拟成为U盘&#xff0c;通过FATS文件系统对连接的存储单元进行U盘方式的读写。 这里介绍STM32CUBEIDE开发平台HAL库模拟U盘桥接SPI总线FATS读写W25Q各型号FLASH的例程。 FLASH是常用的一种非易失…

maven archetype项目构架

1、设置环境变量 set MAVEN_HOMED:\SF\java\apache-maven-3.6.3 set path%path%;%MAVEN_HOME%\bin;2、制作archetype mvn -s "D:\SF\java\apache-maven-3.6.3\conf\settings.xml" archetype:create-from-project -DpackageNamecom.demo.esb-s:指定maven的setting文…

LeetCode | 28.找出字符串中第一个匹配项的下标 KMP

这是字符串匹配问题&#xff0c;朴素做法是两重遍历&#xff0c;依次从主串的i位置开始查看是否和模式串匹配&#xff0c;若不匹配就换下一个位置进行判断&#xff0c;直到找到或者遍历完&#xff0c;时间复杂度 O ( m n ) O(m \times n) O(mn) 还可以对主串进行处理&#xff…