數據結構進階 - 第四,五章 串、數組和廣義表

數據結構進階 - 串、數組和廣義表

第四章 串(String)

4.1 串的基本概念

4.1.1 串的定義
  • 串是受限的線性表:組成串的元素只能為字符
  • 串的特點
    • 操作位置受限
    • 元素類型受限(只能是字符)
    • 是線性表的推廣和受限形式
4.1.2 串的基本操作
  • 串比較
  • 連接
  • 求子串
  • 模式匹配等
4.1.3 串的存儲方式
  1. 定長順序串
  2. 堆串
  3. 塊鏈串

4.2 模式匹配算法

4.2.1 BF算法(暴力匹配算法)

算法思想:逐個字符進行匹配,匹配失敗時回退到主串的下一個位置重新開始匹配。

int StrIndex(SString s, SString t) {int i, j;if (t.len == 0) return(0);i = 0; j = 0;while (i < s.len && j < t.len) {if (s.ch[i] == t.ch[j]) {i++; j++;} else {// 匹配失敗,i、j回退i = i - j + 1;j = 0;}}if (j == t.len) return i - j;else return -1;
}

時間復雜度分析

  • 最壞情況:S = ‘AAAAAAAAAAAAAAAAAAAAAAA’(長度為n),T = ‘AAAAAAAB’(長度為m)
  • 時間復雜度:T(n) = O(n×m)

算法示例

  • 主串 s = “ababcabcacbab”
  • 模式串 t = “abcac”
4.2.2 KMP算法

算法來由分析
當匹配失敗時,不需要完全回退,而是利用已經匹配的信息,跳過一些不可能匹配成功的位置。

核心思想

  • 找到模式串T[0]~T[j-1]的最長相同前綴和后綴子串
  • 當匹配失敗時,j指針移動到合適的位置,i指針不回退

字符串的前綴和后綴

  • 如果字符串A和B,存在A=BS,其中S是任意的非空字符串,那就稱B為A的前綴
  • 例如:"Harry"的前綴包括 {“H”, “Ha”, “Har”, “Harr”}
  • 同理"Potter"的后綴包括 {“otter”, “tter”, “ter”, “er”, “r”}
  • 注意:字符串本身并不是自己的前綴或后綴

next數組定義

  • next[j]:模式串[0~j-1]的最長相同前綴和后綴的長度

next數組計算示例

j01234567
模式串abaabcac
next[j]-10011201
j0123456
模式串ABCDABD
next[j]-1000012

KMP算法實現

while (i < s.len && j < t.len) {if (j == -1 || s[i] == t[j]) {i++; j++;} else {// i不需要回溯了j = next[j]; // j回到指定位置}
}
if (j == t.len) return i - j; 
else return -1;

時間復雜度:T(n) = O(n+m)

4.2.3 KMP算法的改進(修正)

問題分析
在某些情況下,KMP算法仍存在不必要的比較。例如:

  • S:AAABAAAAAAABA
  • T:AAAABA
  • next[]:-1 0 1 2 3 0

當s(3)、t(2)匹配失敗后,又從s(3)、t(1)開始匹配,匹配再次失敗后從s(3)、t(0)開始匹配,依舊匹配失敗。這個過程存在沒有必要的回退,因為t[3]=t[2]=t[1]=t[0]=‘A’,都注定了匹配會失敗。

nextval數組定義
nextval[j]中存放模式串t中,t[j]位置前最長相同前綴和后綴且滿足后續字符不同的子串長度。

next→nextval轉換規則

  • nextval[0] = -1
  • 當t[j] = t[next[j]]時:nextval[j] = nextval[next[j]]
  • 當t[j] ≠ t[next[j]]時:nextval[j] = next[j]

nextval數組計算示例

j012345
模式串aabaab
next-101012
nextval-1-11-1-11

4.3 課堂練習題解析

題目1:采用KMP算法在某主串S中進行模式串t='ababaaababaa’的模式匹配,next[]數組為()(下標從0開始)

答案:-1 0 0 1 2 3 1 1 2 3 4 5

題目2:采用KMP算法進行模式匹配,模式串t='ababaababaa’的next[]數組為()

答案:-1 0 0 1 2 3 1 1 2 3 2 3


第五章 數組和廣義表

5.1 數組

5.1.1 數組的基本概念
  • 數組定義:數組可以看成是一般線性表的擴充
    • 一維數組即為線性表
    • 二維數組可以定義為"其數據元素為一維數組(線性表)"的線性表
    • 多維數組依次類推
5.1.2 數組的基本操作
  • 獲取指定位置元素
  • 修改指定位置元素
5.1.3 數組的存儲方式
  • 順序存儲:可按行或按列存儲
5.1.4 數組元素地址計算

一維數組

  • 數組A[1…n],每個元素占k個字節
  • Loc(A[i]) = Loc(A[1]) + (i-1) × k

二維數組

  • 數組A[1…m][1…n],每個元素占k個字節
  • 按行存儲Loc(A[i][j]) = Loc(A[1][1]) + ((i-1) × n + j-1) × k
  • 按列存儲Loc(A[i][j]) = Loc(A[1][1]) + ((j-1) × m + i-1) × k

三維數組

  • 數組A[1…m][1…n][1…r],每個元素占k個字節
  • 按行-列-縱存儲Loc(A[i][j][k]) = Loc(A[1][1][1]) + ((i-1) × n × r + (j-1) × r + k-1) × k
5.1.5 練習題解析

題目1:設二維數組A[6][10],每個數組元素占4個存儲單元,若按行優先順序存放的數組元素A[3][5]的存儲地址是1000,則A[0][0]的存儲地址為()。

解答

  • A[3][5]在數組中的位置:第3行第5列(從0開始)
  • 從A[0][0]到A[3][5]共有:3×10 + 5 = 35個元素
  • 地址差:35 × 4 = 140
  • A[0][0]的地址 = 1000 - 140 = 860

答案:860

5.2 特殊矩陣的壓縮存儲

5.2.1 基本概念

特殊矩陣:元素分布有規律或非零元素很多(2/3以上)的矩陣

  • 上三角矩陣
  • 下三角矩陣
  • 對稱矩陣
  • 帶狀矩陣
  • 稀疏矩陣

壓縮原則

  • 值相同的元素且分布有規律的元素只分配一個空間
  • 零元素不分配空間
5.2.2 對稱矩陣

對于n×n的對稱矩陣,只需存儲下三角部分(含對角線):

  • 存儲空間:n(n+1)/2個單元
  • 地址計算(下標從1開始):
    • 當i ≥ j時:k = i(i-1)/2 + j-1
    • 當i < j時:k = j(j-1)/2 + i-1
5.2.3 帶狀矩陣

對角帶狀矩陣(d為半個帶狀寬度):

  • 非零元素總個數:(2d+1)×n - (1+d)×d
  • 地址計算:需要根據具體的帶狀寬度來確定
5.2.4 稀疏矩陣

三元組表示法

typedef struct {int row, col;  // 行號、列號int value;     // 元素值
} Triple;

快速轉置算法

  1. 統計每列非零元素個數:num[]
  2. 計算每列第一個非零元素在轉置矩陣中的位置:pos[]
  3. 按行掃描原矩陣,依次放置元素

算法示例

  • 原矩陣的三元組按行序排列
  • 轉置后按列序排列
  • 利用num[]和pos[]數組實現一次定位

5.3 廣義表

5.3.1 廣義表的定義

廣義表:特殊的線性表,其特殊性在于廣義表中的元素既可以是單個元素,還可以是一個廣義表。

5.3.2 廣義表的基本概念
  • 表頭:廣義表中的第一個元素
  • 表尾:除了第一個元素外,其余元素構成的廣義表
5.3.3 廣義表的存儲結構
  • 頭尾鏈表存儲
  • 同層結點鏈存儲
5.3.4 練習題解析

題目1:廣義表((a,b,c,d))的表尾是()。
答案:( )(空表)

題目2:已知廣義表LS=((a,b,c),(d,e,f)),運用head和tail函數取出LS中原子e的運算是()。
答案:head(tail(head(tail(LS))))

分析

  • tail(LS) = ((d,e,f))
  • head(tail(LS)) = (d,e,f)
  • tail(head(tail(LS))) = (e,f)
  • head(tail(head(tail(LS)))) = e

總結

重要知識點回顧

  1. 串的模式匹配

    • BF算法:簡單但效率低,時間復雜度O(n×m)
    • KMP算法:利用next數組避免回退,時間復雜度O(n+m)
    • KMP改進:利用nextval數組進一步優化
  2. 數組地址計算

    • 掌握一維、二維、三維數組的地址計算公式
    • 注意下標起始位置(0或1)
  3. 特殊矩陣壓縮存儲

    • 對稱矩陣:存儲下三角,地址映射關系
    • 帶狀矩陣:根據帶寬確定存儲方式
    • 稀疏矩陣:三元組表示法,轉置算法
  4. 廣義表

    • 理解表頭、表尾概念
    • 掌握head、tail函數的使用

考試重點

  • next數組和nextval數組的計算
  • 各種矩陣的地址計算公式
  • 稀疏矩陣的轉置算法
  • 廣義表的基本操作

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

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

相關文章

【力扣 困難 C】940. 不同的子序列 II

目錄 題目 解法一&#xff1a;動態規劃 題目 解法一&#xff1a;動態規劃 int distinctSubseqII(char* s) {const int mod 1000000007;int dp[26] {0};int cnt 1;int len strlen(s);for (int i 0; i < len; i) {int new (cnt - dp[s[i] - a] mod) % mod;cnt (cnt…

【用戶權限】chmod的簡單使用(一)

一、用戶和權限的基本概念 用戶是 Linux 系統工作中重要的一環&#xff0c;用戶管理包括用戶與組管理。在 Linux 系統中&#xff0c;不論是由本機或是遠程登錄系統&#xff0c;每個系統都必須擁有一個賬號&#xff0c;并且對于不同的系統資源擁有不同的使用權限。在Linux中&am…

Electron桌面程序初體驗

Electron 是網頁應用 (web apps) 的一個原生包裝層&#xff0c;在 Node.js 環境中運行。所以需要開發者對 Node.js 和前端 Web 開發有一定地了解。下面我們就來初始化一個項目&#xff0c;試試看。 提示&#xff1a;本人使用的是npm命令&#xff0c;yarn命令也是可以的 1.初…

生信軟件47 - 超低測序深度的全基因組測序cfDNA腫瘤分數估計工具ichorCNA

1. ichorCNA簡介 ichorCNA是一種用于估計來自超低測序深度的全基因組測序&#xff08;ULP-WGS&#xff0c;0.1x覆蓋率&#xff09;的cfDNA中腫瘤分數的工具。ichorCNA使用概率模型&#xff0c;應用隱馬爾可夫模型&#xff08;HMM&#xff09;&#xff0c;以同時分割基因組&…

Python 解壓縮(支持.zip/.rar/.7z格式)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Python 解壓縮&#xff08;支持.zip/.rar/.7…

龍虎榜——20250627

上證指數放量收陰線&#xff0c;回踩5天均線&#xff0c;但個股總體漲多跌少。 深證指數縮量收十字星&#xff0c;在前期壓力位震蕩。 2025年6月27日龍虎榜行業方向分析 1. 金融科技&#xff08;跨境支付數字安全&#xff09; 代表標的&#xff1a;吉大正元&#xff08;跨境認…

三步實現B站緩存視頻轉MP4格式

本期我們來實現如何將B站緩存的視頻轉成MP4格式&#xff0c;直接在本地播放。 首先我們在Bilibili客戶端緩存一個視頻&#xff0c;保存的文件如下&#xff1a; 這里有兩個m4s文件&#xff0c;大的哪個是視頻文件&#xff0c;小的是音頻文件&#xff0c;這里我們用視頻播放軟件…

MySQL 與 Oracle 事務:深度解析與全面對比

在數據庫管理領域&#xff0c;事務是確保數據一致性和完整性的核心機制&#xff0c;它允許用戶將一系列操作視為一個不可分割的整體&#xff0c;要么全部成功執行&#xff0c;要么全部回滾。MySQL 和 Oracle 作為兩款廣泛使用的關系型數據庫管理系統&#xff0c;它們在事務處理…

麒麟系統如何輸出啟動日志到串口

1、臺式機系統啟動日志輸出到串口 &#xff08;1&#xff09;GRUB配置 編輯GRUB配置文件&#xff08;如/etc/default/grub&#xff09;&#xff0c;添加或修改以下參數&#xff1a; GRUB_CMDLINE_LINUX“consoletty0 consolettyS0,115200n8” tty0&#xff1a;表示將日志輸出…

JUC:2棧和棧幀的定義

這部分內容雖然是JVM中的定義&#xff0c;但是在juc中屬于底層知識&#xff0c;必須要學習 每個線程在創建時&#xff0c;就會將自身的資源存儲在棧中&#xff0c;將線程需要運行的方法存放在方法區。 棧中會存儲方法的局部變量、方法的參數以及方法返回的地址&#xff0c;這…

阿里云OSS上傳文件Utils (@PostConstruct注解配置+Environment )

首先在 application.yaml 配置bucketName, endpoint, accessKeyId, accessKeySecret這里利用的是 spring 的生命周期, 在 bean 實例化后,使用PostConstruct注解 Environment 屬性 進行spring上下文環境賦值 package com.shuai.utils;import com.aliyun.oss.*; import com.aliy…

Jetson家族橫向對比:如何選擇你的邊緣計算設備

Jetson家族橫向對比&#xff1a;如何選擇你的邊緣計算設備 一、邊緣計算設備選型核心維度 在選擇Jetson平臺前&#xff0c;需明確以下關鍵指標&#xff1a; 算力需求&#xff1a;TOPS(INT8) / FP16精度功耗限制&#xff1a;被動散熱/主動散熱接口擴展&#xff1a;CSI攝像頭數…

《聊一聊ZXDoc》之汽車服務導向SOME/IP

ZXDoc支持SOME/IP功能&#xff0c;通過服務導向架構實現跨域通信標準化&#xff0c;降低系統耦合&#xff0c;支持動態服務發現與調用&#xff0c;提升分布式系統擴展性和維護效率。 什么是SOME/IP&#xff1f; SOME/IP&#xff08;Scalable service-Oriented MiddlewarE ov…

Learning Semantic-Aware Knowledge Guidance for Low-Light Image Enhancement 論文閱讀

學習語義感知知識引導用于低光照圖像增強 摘要 低光圖像增強&#xff08;LLIE&#xff09;研究如何改善照明并生成正常光照的圖像。大多數現有方法通過全局和均勻的方式改進低光圖像&#xff0c;而沒有考慮不同區域的語義信息。如果沒有語義先驗&#xff0c;網絡可能會容易偏…

【(Topk問題及其二叉樹遍歷】

Topk問題及其二叉樹遍歷 1.Topk問題2.二叉樹的前序&#xff0c;中序&#xff0c;后序3.求二叉樹的個數&#xff08;TreeSize&#xff09;。4.求二叉樹的最大深度&#xff08;maxDepth&#xff09;。5.求二叉樹的第K層的節點個數&#xff08;TreeKLevel&#xff09;。6.查找二叉…

AI+實時計算如何賦能金融系統?DolphinDB 在國泰君安期貨年度中期策略會的演講

6月25日&#xff0c;國泰君安期貨2025年度中期策略會在上海順利開幕。本次策略會以“觀勢明變&#xff0c;本固枝榮”為主題&#xff0c;特邀15位重量級行業嘉賓和52位明星分析師發表精彩觀點&#xff0c;DolphinDB 受邀出席會議并作主題演講。 實時計算如何賦能量化投研交易 …

PHP Protobuf 手寫生成器,

? 以下是一個純 PHP 編寫的通用 Protobuf 二進制生成器&#xff0c;支持&#xff1a; varint fixed32 fixed64 length-delimited&#xff08;如字符串、嵌套 message&#xff09; 嵌套結構 (nested) 多字段 repeated ? 封裝器代碼&#xff08;可直接用&#xff09; &…

喜訊 | Mediatom斬獲2025第十三屆TopDigital創新營銷獎「年度程序化廣告平臺」殊榮

6月27日&#xff0c;2025第十三屆TopDigital創新營銷盛典在上海圓滿落幕&#xff0c;TopDigital創新營銷獎獲獎結果也已正式揭曉。本屆TopDigital創新營銷獎共有694家參展企業&#xff0c;3326件案例&#xff0c;AdMergeX旗下Mediatom媒體變現SaaS及服務平臺在眾多作品中脫穎而…

SQL 中 EXISTS 的原理與作用詳解

平常也一直在用EXISTS 來進行邏輯判斷&#xff0c;但是從來沒有正經理解它&#xff0c;只知道找到有就返回True&#xff0c;沒有就返回False。那么今天詳細的理解一下&#xff08;主要借鑒了CSDN 其他博客文章&#xff0c;以及自己做的一個小例子&#xff09; 一、EXISTS是什么…

【Docker】解決:構建(docker build)或重新運行容器時,丟失apt-get update問題

一、解決&#xff1a;構建&#xff08;docker build&#xff09;或重新運行容器時&#xff0c;丟失apt-get update問題 在 Docker 容器中&#xff0c;每次構建&#xff08;docker build&#xff09;或重新運行容器時&#xff0c;默認情況下所有更改都會丟失&#xff0c;因為容…