數據結構——串、數組和廣義表

串、數組和廣義表

1. 串

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412021944459.png

1.1 串的定義

串(string)是由零個或多個字符組成的有限序列。一般記為

S = a 1 a 2 . . . a n ( n ≥ 0 ) S=a_1a_2...a_n(n\geq0) S=a1?a2?...an?(n0)

其中,S是串名,單引號括起來的字符序列是串的值, a i a_i ai?可以是字母、數字或其他字符;串中字符的個數n稱為串的長度。n=0時的串稱為空串(用表示)。

1.2 串的模式匹配

1.2.1 樸素模式匹配

使用暴力求解的方法,一直遍歷,但時間復雜度過高。

int ViolentMatch(string &s, string &t)
{int i = 0, j = 0;while (i < s.size() && j < t.size()){if (s[i] == t[j]){i++;j++;}else{i = i - j + 1;j = 0;}}if (j == t.size())return i - j;elsereturn -1;
}

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022043282.png

1.2.2 KMP算法

vector<int> make_next(const string &s)
{int i = 0, j = -1;vector<int> next(s.size() + 1, 0); // Initialize the vector with the correct sizenext[0] = -1;                      // Set the first element to -1while (i < s.size()){if (j == -1 || s[i] == s[j]){i++;j++;next[i] = j;}elsej = next[j];}return next;
}
int KMP(const string &s, const string &t)
{int i = 0, j = 0;vector<int> next = make_next(t);while (i < s.size() && j < (int)t.size()){if (j == -1 || s[i] == t[j]) // Fix the logic error here{i++;j++;}elsej = next[j];}if (j == t.size())return i - j;return -1;
}

2. 數組和廣義表

2.1 數組

2.1.1 數組的定義

數組是由n(n>1)個相同類型的數據元素構成的有限序列,每個數據元素稱為一個數組元素,每個元素在n個線性關系中的序號稱為該元素的下標,下標的取值范圍稱為數組的維界。

數組與線性表的關系:數組是線性表的推廣。一維數組可視為一個線性表;二維數組可視為其元素是定長數組的線性表,以此類推。數組一旦被定義,其維數和維界就不再改變。因此,除結構的初始化和銷毀外,數組只會有存取元素和修改元素的操作。

2.1.2 數組的存儲結構

大多數計算機語言都提供了數組數據類型,邏輯意義上的數組可采用計算機語言中的數組數據類型進行存儲,一個數組的所有元素在內存中占用一段連續的存儲空間。

以一維數組 A[0…n-1]為例,其存儲結構關系式為

L O C ( a i , j ) = L O C ( a 0 , 0 ) + i × L ( 0 ≤ i ≤ n ) LOC(a_{i,j})=LOC(a_{0,0})+i\times L (0\leq i\leq n) LOC(ai,j?)=LOC(a0,0?)+i×L(0in)

其中L是每個存儲單元的大小。

對于多維數組,有兩種映射方法:按行優先和按列優先。以二維數組為例,按行優先存儲的基本思想是:先行后列,先存儲行號較小的元素,行號相等先存儲列號較小的元素。設二維數組的行下標與列下標的范圍分別為[0, h 1 h_1 h1?]與[0, h 2 h_2 h2?],則存儲結構關系式為

L O C ( a i , j ) = L O C ( a 0 , 0 ) + [ i × ( h 2 + 1 ) + j ) × L LOC(a_{i,j})=LOC(a_{0,0})+[i\times (h_2+1)+j)\times L LOC(ai,j?)=LOC(a0,0?)+[i×(h2?+1)+j)×L

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022102961.png

2.2 特殊矩陣的壓縮存儲

壓縮存儲:指為多個值相同的元素只分配一個存儲空間,對零元素不分配空間。

特殊矩陣:指具有許多相同矩陣元素或零元素,并且這些相同矩陣元素或零元素的分布有一定規律性的矩陣。常見的特殊矩陣有對稱矩陣、上(下)三角矩陣、對角矩陣等。

特殊矩陣的壓縮存儲方法:找出特殊矩陣中值相同的矩陣元素的分布規律,把那些呈現規律性分布的、值相同的多個矩陣元素壓縮存儲到一個存儲空間中。

2.2.1 對稱矩陣

對于矩陣 A A A元素滿足性質 a i , j = a j , i ? a_{i,j}=a_{j,i}? ai,j?=aj,i??,則其為對稱矩陣。

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022108424.png

由于其上三角與下三角元素相同,使用二維數組會浪費空間,故使用一維數組存儲來壓縮空間。如下圖所示,數組下標從0開始。

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022112698.png

2.2.2 三角矩陣

下三角矩陣:

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022114196.png

上三角矩陣:

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022115595.png

2.2.3 三對角矩陣

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022116892.png

2.2.4 稀疏矩陣

https://cdn.jsdelivr.net/gh/junmoxiao6661/pigo_image@main/202412022119078.png

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

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

相關文章

無再暴露源站!群聯AI云防護IP隱匿方案+防繞過實戰

一、IP隱藏的核心原理 群聯AI云防護通過三層架構實現源站IP深度隱藏&#xff1a; 流量入口層&#xff1a;用戶訪問域名解析至高防CNAME節點&#xff08;如ai-protect.example.com&#xff09;智能調度層&#xff1a;基于AI模型動態分配清洗節點&#xff0c;實時更新節點IP池回…

1.5.3 掌握Scala內建控制結構 - for循環

Scala的for循環功能強大&#xff0c;支持單重和嵌套循環。單重for循環語法為for (變量 <- 集合或數組 (條件)) {語句組}&#xff0c;可選篩選條件&#xff0c;循環變量依次取集合值。支持多種任務&#xff0c;如輸出指定范圍整數&#xff08;使用Range、to、until&#xff0…

【MySQL基礎-9】深入理解MySQL中的聚合函數

在數據庫操作中&#xff0c;聚合函數是一類非常重要的函數&#xff0c;它們用于對一組值執行計算并返回單個值。MySQL提供了多種聚合函數&#xff0c;如COUNT、SUM、AVG、MIN和MAX等。這些函數在數據分析和報表生成中扮演著關鍵角色。本文將深入探討這些聚合函數的使用方法、注…

windows版本的時序數據庫TDengine安裝以及可視化工具

了解時序數據庫TDengine&#xff0c;可以點擊官方文檔進行詳細查閱 安裝步驟 首先找到自己需要下載的版本&#xff0c;這邊我暫時只寫windows版本的安裝 首先我們需要點開官網&#xff0c;找到發布歷史&#xff0c;目前TDengine的windows版本只更新到3.0.7.1&#xff0c;我們…

Web測試

7、Web安全測試概述 黑客技術的發展歷程 黑客基本涵義是指一個擁有熟練電腦技術的人&#xff0c;但大部分的媒體習慣將“黑客”指作電腦侵入者。 黑客技術的發展 在早期&#xff0c;黑客攻擊的目標以系統軟件居多。早期互聯網Web并非主流應用&#xff0c;而且防火墻技術還沒有…

華為OD機試 - 最長的完全交替連續方波信號(Java 2023 B卷 200分)

題目描述 給定一串方波信號,要求找出其中最長的完全連續交替方波信號并輸出。如果有多個相同長度的交替方波信號,輸出任意一個即可。方波信號的高位用1標識,低位用0標識。 說明: 一個完整的信號一定以0開始并以0結尾,即010是一個完整的信號,但101,1010,0101不是。輸入的…

游戲引擎學習第163天

我們可以在資源處理器中使用庫 因為我們的資源處理器并不是游戲的一部分&#xff0c;所以它可以使用庫。我說過我不介意讓它使用庫&#xff0c;而我提到這個的原因是&#xff0c;今天我們確實有一個選擇——可以使用庫。 生成字體位圖的兩種方式&#xff1a;求助于 Windows 或…

7、什么是死鎖,如何避免死鎖?【高頻】

&#xff08;1&#xff09;什么是死鎖&#xff1a; 死鎖 是指在兩個或多個進程的執行時&#xff0c;每個進程都持有資源 并 等待其他進程 釋放 它所需的資源&#xff0c;如果此時所有的進程一直占有資源而不釋放&#xff0c;就會陷入互相等待的一種僵局狀態。 死鎖只有同時滿足…

Compose 實踐與探索十四 —— 自定義布局

自定義布局在 Compose 中相對于原生的需求已經小了很多&#xff0c;先講二者在本質上的邏輯&#xff0c;再說它們的使用場景&#xff0c;兩相對比就知道為什么 Compose 中的自定義布局的需求較小了。 原生是在 xml 布局文件不太方便或者無法滿足需求時才會在代碼中通過自定義 …

【C++】:C++11詳解 —— 入門基礎

目錄 C11簡介 統一的列表初始化 1.初始化范圍擴展 2.禁止窄化轉換&#xff08;Narrowing Conversion&#xff09; 3.解決“最令人煩惱的解析”&#xff08;Most Vexing Parse&#xff09; 4.動態數組初始化 5. 直接初始化返回值 總結 聲明 1.auto 類型推導 2. declty…

oracle刪除表中重復數據

需求&#xff1a; 刪除wfd_procs_nodes_rwk表中&#xff0c;huser_id、dnode_id、rwk_name字段值相同的記錄&#xff0c;如果有多條&#xff0c;只保留一條。 SQL&#xff1a; DELETE FROM wfd_procs_nodes_rwk t WHERE t.rowid > (SELECT MIN(t1.rowid)FROM wfd_procs_n…

ESP32學習 -從STM32工程架構進階到ESP32架構

ESP32與STM32項目文件結構對比解析 以下是對你提供的ESP32項目文件結構的詳細解釋&#xff0c;并與STM32&#xff08;以STM32CubeIDE為例&#xff09;的常見結構進行對比&#xff0c;幫助你理解兩者的差異&#xff1a; 1. ESP32項目文件解析 文件/目錄作用STM32對應或差異set…

整形在內存中的存儲(例題逐個解析)

目錄 一.相關知識點 1.截斷&#xff1a; 2.整形提升&#xff1a; 3.如何 截斷&#xff0c;整型提升&#xff1f; &#xff08;1&#xff09;負數 &#xff08;2&#xff09;正數 &#xff08;3&#xff09;無符號整型&#xff0c;高位補0 注意&#xff1a;提升后得到的…

HTML中滾動加載的實現

設置div的overflow屬性&#xff0c;可以使得該div具有滾動效果&#xff0c;下面以div中包含的是table來舉例。 當table的元素較多&#xff0c;以至于超出div的顯示范圍的話&#xff0c;觀察下該div元素的以下3個屬性&#xff1a; clientHeight是div的顯示高度&#xff0c;scrol…

Netty基礎—7.Netty實現消息推送服務二

大綱 1.Netty實現HTTP服務器 2.Netty實現WebSocket 3.Netty實現的消息推送系統 (1)基于WebSocket的消息推送系統說明 (2)消息推送系統的PushServer (3)消息推送系統的連接管理封裝 (4)消息推送系統的ping-pong探測 (5)消息推送系統的全連接推送 (6)消息推送系統的HTTP…

人工智能助力家庭機器人:從清潔到陪伴的智能轉型

引言&#xff1a;家庭機器人進入智能時代 過去&#xff0c;家庭機器人只是簡單的“工具”&#xff0c;主要用于掃地、拖地、擦窗等單一任務。然而&#xff0c;隨著人工智能&#xff08;AI&#xff09;技術的迅猛發展&#xff0c;家庭機器人正經歷從“機械助手”向“智能管家”甚…

ssh轉發筆記

工作中又學到了&#xff0c;大腦轉不過來 現有主機A&#xff0c;主機B&#xff0c;主機C A能訪問B&#xff0c;B能訪問C&#xff0c;A不能訪問C C上80端口有個服務&#xff0c;現在A想訪問這個服務&#xff0c;領導讓用ssh轉發&#xff0c;研究半天沒找到理想的語句&#xf…

清晰易懂的Miniconda安裝教程

小白也能看懂的 Miniconda 安裝教程 Miniconda 是一個輕量級的 Python 環境管理工具&#xff0c;適合初學者快速搭建 Python 開發環境。本教程將手把手教你如何在 Windows 系統上安裝 Miniconda&#xff0c;并配置基礎環境&#xff0c;確保你能夠順利使用 Python 進行開發。即…

Flume詳解——介紹、部署與使用

1. Flume 簡介 Apache Flume 是一個專門用于高效地 收集、聚合、傳輸 大量日志數據的 分布式、可靠 的系統。它特別擅長將數據從各種數據源&#xff08;如日志文件、消息隊列等&#xff09;傳輸到 HDFS、HBase、Kafka 等大數據存儲系統。 特點&#xff1a; 可擴展&#xff1…

破解企業內部盜版軟件管理難題的技術方案

引言&#xff1a;盜版軟件——企業數字化轉型的“隱形地雷” 據BSA《全球軟件調查報告》顯示&#xff0c;37%的企業存在員工私自安裝盜版軟件的行為&#xff0c;由此引發的法律訴訟、數據泄露及罰款風險年均增長28%。LMT基于“預防-檢測-治理”三位一體技術框架&#xff0c;為…