13-數據結構-串以及KMP算法,next數組


目錄

一、串:

二、串的存儲結構:

三、模式匹配

1.簡單模式匹配(BF算法)

2.KMP算法

2.1-next(j)數組手工求解

2.2-nextval(j)數組手工求解



一、串:

內容受限的線性表,也就是相當于C語言里的字符串,只不過這里字符串從1開始存取。

此外串里包含子串,每個字串的第一個元素位置為該字串在串中的位置,每個串里面必有一個空串,此外,數串的時候,遇到重復的,只保留一個。

kmp算法就是根據相應的字串(模式串)取查找相應位置的操作,

串的長度,實際上為字符串長度。而數組長度為串的長度+1+1,從數組1開始存,因此+1,最后字符串結尾\'0’也要存。

二、串的存儲結構:

靜態順序存儲,就是定義一個固定長度的字符數組,再多一個記錄個數的變量。

堆分配存儲,就是動態數組,malloc一個空間,空間大小為sizeof(char)*(max+2);

塊鏈存儲:就是單鏈表的基礎上,多了好多存儲數據的變量,因此一塊結點,好幾個變量存進去。

串的基本操作:
SteCompare(S,T),就是C語言里的字符串比較,實際操作為:S-T,若結果小于0,則S<T,若結果大于0,則S大于T,S、T為字符串。

Concat(*T,S1,S2),給S2連接到S1后面,組成新的串,賦值給T串,返回。

SubStrin(*Sub,S,pos,len),返回串S中,第pos位置起,長度為len的字串

Index(S,T,Pos),模式匹配,S中第pos位置起,與字串T相等的串。并返回該串再S中出現的第一次的位置。

三、模式匹配

1.簡單模式匹配(BF算法)

模式匹配,就是有一個字串(模式串),取對應的主串里,找與它一樣的,并返回它在主串中的位置,

簡單模式匹配,就是主串在上,模式串在下,動主串坐標,取挨個對比。

設i為記錄主串的下標,j為模式串的下標,k則是記錄每次回溯,比對的次數。

當i和j中的值都相等時,都往后移動,當不匹配時,則進行下標的更新,主串中的i,更新為i=k+1,即主串的i從左至右,挨個比對,第一個開始,比對失敗,則第二個開始,重新比對。模式串則時更新為j=1,因為,每次重新比對,所以,模式串每次更新都是從1開始。

簡單模式匹配算法為(m*n),主串長為m,模式串為n,因為最壞的情況,每次主串都要重新比對,所以為m,而每次比對,模式串都需要從頭到尾重新遍歷,所以m*n

2.KMP算法

????????kmp時間復雜度為O(m+n),KMP算法主要是模式串下標動,更新,主串中的i會一直增加,不會出現回溯的現象。

2.1-next(j)數組手工求解

? ? ? ? 在簡單模式匹配的基礎上,優化。即next(j)數組,是記錄,每次模式串比對失敗時,模式串下標的更新的起始值。如果模式串下標j==0,則i++,j++,即簡單匹配操作,否則,主串不需要動,模式串下標更新動即可。

? ? ? ? 而next(j)數組,怎么求嘞,next數組,就是給模式串每一個位置處,匹配失敗,時,跟新的下標值都記錄下來。所以手工怎么計算呢?

? ? ? ? 分兩部分,當第一個位置處時,j直接更新為0,因為第一個位置前,無數據,沒法拿來進行找重復部分的長度。第二個位置時,則找第一個位置,然后錯一位,進行比對,比對時,下面的那一串向右移動,直到比對完重復部分,之后重復部分長度+1,便是模式串下標所更新的值。

具體看講義,不好畫圖

2.2-nextval(j)數組手工求解

? ? ? ? nextval數組,則是在,next的基礎上,再優化。即,當next數組求的坐標的內容,與原來不匹配的坐標內容一致時,可直接,給nextval中,當前不匹配情況,與所求最新的,坐標相同即可。

具體看講義,不好畫圖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法 標記清除&#xff08;Mark Sweep&#xff09; 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分&#xff0c;比如說我們的應用程序本身。 mutator的職責一般是NEW(分配內存)、READ(從內存中讀取內容)、WRITE(將內容寫入內…

將多個單獨的 Excel 文件合并成一個,并添加標題行

要將多個單獨的 Excel 文件合并成一個&#xff0c;并添加標題行&#xff0c;可以使用 Python 的 pandas 庫。以下是一個示例代碼&#xff0c;假設要合并的 Excel 文件都在同一個文件夾中&#xff1a; import os import pandas as pd # 指定文件夾路徑 folder_path path/to/fo…

vscode搭建c語言環境問題

c語言環境搭建參考文章:【C語言初級階段學習1】使用vscode運行C語言&#xff0c;vscode配置環境超詳細過程&#xff08;包括安裝vscode和MinGW-W64安裝及后續配置使用的詳細過程&#xff0c;vscode用戶代碼片段的使用&#xff09;[考研專用]_QAQshift的博客-CSDN博客 問題如下:…

[C++ 網絡協議] 套接字和地址族、數據序列

目錄 1. 套接字 1.1 在Linux平臺下構建套接字 1.1.1 用于接聽的套接字(服務器端套接字) 1.1.2 用于發送請求的套接字(客戶端套接字) 1.2 在Windows平臺下構建套接字 1.2.1 Winsock的初始化 1.2.2 用于接聽的套接字(服務器端套接字) 1.2.3 用于發送請求的套接字(客戶端套…

pytest框架快速進階篇-pytest前置和pytest后置,skipif跳過用例

一、Pytest的前置和后置方法 1.Pytest可以集成unittest實現前置和后置 importunittestimportpytestclassTestCase(unittest.TestCase):defsetUp(self)->None:print(unittest每個用例前置)deftearDown(self)->None:print(unittest每個用例后置)classmethoddefsetUpClass…

jmeter中用戶參數和用戶定義的變量的區別

如果使用jmeter做過參數化的人都知道&#xff0c;參數化的方式有多種&#xff0c;其中一種就是使用用戶定義的變量&#xff0c;還有一種是使用用戶參數。那么&#xff0c;這兩個有什么異同呢&#xff1f; 一、先說相同的點&#xff1a; 1、都可以參數化&#xff0c;以供sample…

allure測試報告

使用pytest結合Allure進行測試報告生成的簡單教程 allure測試報告 Allure基于Java開發&#xff0c;因此我們需要提前安裝Java 8或以上版本的環境。 ◆安裝allure-pytest插件在DOS窗口輸入命令“pip3 install allure-pytest”&#xff0c;然后按“Enter”鍵。 下載安裝Allure…

使用 Docker 部署 canal 服務實現MySQL和ES實時同步

文章目錄 0. 環境介紹0. 前置步驟1. 安裝Kibana和Elasticsearch2. 安裝Canal和Canal Adapter2.1 修改數據庫配置2.1.1 修改配置2.1.2 驗證mysql binlog配置2.1.3 查看日志文件2.1.4 用JDBC代碼插入數據庫 2.2 安裝Canal Server2.3 安裝Canal Adapter修改兩處配置文件配置文件取…

Linux 命令篇

一、啟動網絡命令 ip addr 查看網卡信息 service network start 啟動網卡 service network stop 關閉網卡 service network restart 重啟網絡 二、pwd 命令 查看當前目錄的路徑 linux 下所有的絕對路徑都是從根目錄 "/" 開始 root:是linux下root用戶的根目…

初識mysql數據庫之引入mysql客戶端庫

目錄 一、下載第三方庫 1. 準備工作 1. 使用mysql官網提供的庫 2. yum源安裝 二、測試第三方庫是否可用 三、mysql常用接口介紹 1. 查看官方文檔 2. 初始化 3. 關閉mysql 4. 連接mysql 5. 下達sql指令 四、一個簡單的C客戶端庫連接mysql程序 1. 頭文件 2. 初始化…

FFmpeg接收UDP碼流

一、FFmpeg參數初始化&#xff1a; //在打開碼流前指定各種參數比如:探測時間/超時時間/最大延時等//設置緩存大小,1080p可將值調大av_dict_set(&options, "buffer_size", "8192000", 0);//以tcp方式打開,如果以udp方式打開將tcp替換為udpav_dict_set(…

Could not resolve host: mirrorlist.centos.org; Unknown error解決方法

今天服務器安裝完CentOS系統后&#xff0c;安裝網絡的時候&#xff0c;出現無法聯網yum yum -y install net-tools 以上代碼無法運行并報錯&#xff0c;這里我要提醒大家&#xff0c;如果在初始安裝的時候選中安裝網絡工具模塊就不用在安裝net-tools了&#xff0c;因為我選中…

Angular 性能優化實戰

Angular 性能優化實戰 Angular 是一個非常強大的前端框架&#xff0c;但是如果不注意性能優化&#xff0c;應用程序可能會變得非常慢并增加加載時間。 以下是一些Angular性能優化經驗的實戰建議&#xff1a; 1. 使用 OnPush 變更檢測策略 默認情況下&#xff0c;Angular檢查…

vite跨域配置踩坑,postman鏈接后端接口正常,但是前端就是不能正常訪問

問題一&#xff1a;怎么都鏈接不了后端地址 根據以下配置&#xff0c;發現怎么都鏈接不了后端地址&#xff0c;proxy對了呀。 仔細看&#xff0c;才發現host有問題 // 本地運行配置&#xff0c;及反向代理配置server: {host: 0,0,0,0,port: 80,// cors: true, // 默認啟用并允…

爆肝整理,性能測試方法與關鍵指標以及瓶頸定位思路,一篇貫通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 性能測試方法 1、…

Python編程實現百度AI開放平臺的接口對接方法,詳解和實踐指南

Python編程實現百度AI開放平臺的接口對接方法,詳解和實踐指南 引言 百度AI開放平臺提供了豐富的人工智能接口,包括語音識別、圖像識別、自然語言處理等功能。本文將通過Python編程,詳解如何對接百度AI開放平臺的接口,并提供實際代碼示例。準備工作 在開始之前,我們需要先完…

智能家居(1)---工廠模式實現燈光控制(繼電器組)以及火災報警模組的封裝

采用工廠模式以面向對象的方式來封裝各種設備模塊&#xff0c;方便整合項目以及后期的維護和擴展 mainPro.c&#xff08;主函數&#xff09; #include <stdio.h> #include "controlDevice.h"struct Devices *pdeviceHead NULL; //設備工廠鏈…

抓包工具Fiddler下載與安裝

一、Fiddler介紹 1.Fiddler簡介 Fiddler 是一款免費、靈活、操作簡單、功能強大的 HTTP 代理工具&#xff0c;是目前最常用的 HTTP 抓包工具之一。可以抓取所有的 HTTP/HTTPS 包、過濾會話、分析請求詳細內容、偽造客戶端請求、篡改服務器響應、重定向、網絡限速、斷點調試等…

數據結構刷題訓練:隊列實現棧

目錄 前言 1. 題目&#xff1a;使用隊列實現棧 2. 思路 3. 分析 3.1 創建棧 3.2入棧 3.3 出棧 3.4 棧頂數據 3.5 判空和 “ 棧 ” 的銷毀 4. 題解 總結 前言 我們已經學習了棧和隊列&#xff0c;也都實現了它們各自的底層接口&#xff0c;那么接下我們就要開始棧和隊列的專項刷…

go內存管理機制

golang內存管理基本是參考tcmalloc來進行的。go內存管理本質上是一個內存池&#xff0c;只不過內部做了很多優化&#xff1a;自動伸縮內存池大小&#xff0c;合理切割內存塊。 基本概念&#xff1a; Page&#xff1a;頁&#xff0c;一塊 8 K大小的內存空間。Go向操作系統申請和…