日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[数据结构] - 串

發(fā)布時(shí)間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [数据结构] - 串 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

簡(jiǎn)介

字符串(String)是由字符組成有限序列,是常用的一種非數(shù)值數(shù)據(jù),串的邏輯結(jié)構(gòu)是線性表,串是一種特殊的線性表,限制其元素類型是字符,串的操作特點(diǎn)與線性表不同,主要對(duì)子串進(jìn)行操作,通常采用順序存儲(chǔ)結(jié)構(gòu)存儲(chǔ)。

?

串的基本概念

串定義:一個(gè)串是由n(n>=0) 個(gè)字符組成的有限序列 記做s="s0 s1 s2" ,其中s是串名,一對(duì)雙引號(hào)括起來(lái)的字符序列 s0 s1 s2 是串值,s1(i=0,1,n-1) 為特定字符集中的一個(gè)字符,一個(gè)串中包含的字符數(shù)稱為串的長(zhǎng)度,例如,字符串 “data” 長(zhǎng)度是4,雙引號(hào)不計(jì)入長(zhǎng)度,長(zhǎng)度為0的串稱為空串, 記做“”,由多個(gè)空格字符構(gòu)成的字符串 “” 稱為 空格串。

一個(gè)字符在串中的位置稱為該字符在串中的序號(hào)(Index),用一個(gè)整數(shù)表示,約定串中的第一個(gè)字符的序號(hào)為0,-1表示該字符不在指定串中。

?

子串:由串s中任意連續(xù)字符組成的一個(gè)子序列 sub稱為s的子串(Substring),s稱為sub的主串。例如 “at” 是“data” 的子串,特別的,空串是任意串的子串,任意串s都是他自身的子串,除了自身之外,s的其他子串稱為s的真子串。

子串序號(hào)是指該子串首字符在主串中的序號(hào)。例如 “dat” 在 “data” 中序號(hào)是0

?

串比較規(guī)則與字符比較規(guī)則有關(guān),字符比較規(guī)則猶豫所屬字符集的編碼決定,通常在字符集中同意字母的大小寫形式有不同的編碼。

兩個(gè)串相等是指,串長(zhǎng)度相等且哥哥對(duì)應(yīng)位置是上的字符也相等。

兩個(gè)串的大小由對(duì)應(yīng)位置的收個(gè)不同字符的大小決定,字符比較次序是從頭開始依次向后。當(dāng)兩個(gè)串長(zhǎng)度不等而對(duì)應(yīng)位置的字符都相同時(shí)候,較長(zhǎng)的串定義為較大。

?

串的抽象數(shù)據(jù)類型

串與線性表是不同的抽象數(shù)據(jù)類型,兩者操作不同,串的基本操作有:創(chuàng)建 求長(zhǎng)度 讀取設(shè)置字符,求子串,插入,刪除,連接,判斷等,查找,替換,其中求子串,插入,查找等操作1以子串為單位,一次操作處理多個(gè)字符。

?

串的存儲(chǔ)結(jié)構(gòu)

串有順序存儲(chǔ)鏈?zhǔn)酱鎯?chǔ)兩種存儲(chǔ)結(jié)構(gòu)。

java語(yǔ)言字符串類有常量字符串類String,和變量字符串類 StringBuffer,這兩種字符串類都采用順序存儲(chǔ)結(jié)構(gòu)。能存儲(chǔ)任意長(zhǎng)度的字符串,實(shí)現(xiàn)串的基本操作,并且能夠識(shí)別序號(hào)越界等錯(cuò)誤,對(duì)數(shù)組占用的存儲(chǔ)空間進(jìn)行控制,具有健壯,安全性好等特點(diǎn)。

順序存儲(chǔ)結(jié)構(gòu):采用字符數(shù)組將串中的字符序列一次連續(xù)存存儲(chǔ)在數(shù)組中的相鄰但愿中,常量串和變量串的存儲(chǔ)結(jié)構(gòu)不同,數(shù)組容量length分半等于或者大于串長(zhǎng)度n.

?

順序存儲(chǔ)的串具有隨機(jī)存取特效,存取指定位置字符的時(shí)間復(fù)雜度為 O(1) ,缺點(diǎn)是插入和刪除元素時(shí)需要移動(dòng)元素,平均移動(dòng)數(shù)據(jù)量是串長(zhǎng)度的一半,當(dāng)數(shù)組容量不夠時(shí),需要重新申請(qǐng)一個(gè)更大的數(shù)組,并復(fù)制原來(lái)數(shù)組中的所有元素,插入和刪除操作的時(shí)間復(fù)雜度為O(n)

?

串的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):有單字符串鏈表和塊鏈表兩種,但字符串鏈表是每個(gè)節(jié)點(diǎn)的數(shù)據(jù)域只包含一個(gè)字符的單鏈表,塊鏈表是每個(gè)節(jié)點(diǎn)的數(shù)據(jù)域包含若干個(gè)字符的單鏈表。

鏈?zhǔn)酱鎯?chǔ)的串,存取指定位置字符的時(shí)間復(fù)雜度為 O(n),單字符鏈表雖然插入/刪除操作不需要移動(dòng)元素,但是占用存儲(chǔ)空間太多,塊鏈表的插入和刪除操作需要移動(dòng)元素,效率低。

?

?

Java String 類

String是由雙引號(hào)括起來(lái)的字符序列,其中可包含轉(zhuǎn)義字符,如 “hello” "漢字\n" ""(空串) 等等,字符串只能在一行。

字符常量采用單引號(hào)括起來(lái)? ‘a(chǎn)’ '汗' 數(shù)據(jù)類型是char,占用2個(gè)字節(jié)存儲(chǔ)字符的 Unicode編號(hào),無(wú)論字符或者漢字,字符長(zhǎng)度都是1.注意 只有空串 “” 沒(méi)有空字符''

String字符串類,屬于引用數(shù)據(jù)類型,提供構(gòu)造串對(duì)象,求串長(zhǎng)度取字符,求子串,連接串,比較串,比較大小等,如果charAt? substring? 方法序號(hào)越界將拋出 StringIndexOutOfBoundsException 字符串序號(hào)越界異常。

String是Java的一個(gè)特殊類,java不僅為之約定了常量形式,還重載賦值運(yùn)算符 = 和 連接運(yùn)算符 +? +=? 使得String變量能夠像基本數(shù)據(jù)類型變量一樣,進(jìn)行賦值和運(yùn)算,

Java的字符串對(duì)象不是字符數(shù)組,不能以數(shù)組下表個(gè)數(shù) s[i] 對(duì)指定 I 位置的字符進(jìn)行操作

String類特點(diǎn):

String類是最終類,不能被繼承

String類以常量串方式存儲(chǔ)和實(shí)現(xiàn)字符串的操作,采用字符數(shù)組存儲(chǔ)字符序列,數(shù)組容量等于串長(zhǎng)度,串尾部沒(méi)有 \0 作為串結(jié)束符。

聲明字符數(shù)組是最終變量,串中各個(gè)字符是只讀的,當(dāng)構(gòu)造串對(duì)象時(shí)候,對(duì)字符數(shù)組進(jìn)行一次賦值后,不能修改

構(gòu)造串,求子串和連接串的操作,都是深度拷貝,重新申請(qǐng)字符串占用的字符數(shù)組,復(fù)制字符串?dāng)?shù)組,不會(huì)改變?cè)瓉?lái)的串。

?

Java StringBuffer

String類存儲(chǔ)常量字符串,一旦創(chuàng)建了實(shí)例,就不能修改它,這是線程安全的,但是每次連接等運(yùn)算結(jié)果都將創(chuàng)建新的實(shí)例,頻繁進(jìn)行連接等操作將增加使用空間并降低運(yùn)算效率,因此,java還聲明StringBuffer類,采用緩沖區(qū)存儲(chǔ)可變的字符串,避免在運(yùn)算時(shí)頻繁申請(qǐng)內(nèi)存。

提供構(gòu)造串對(duì)象,求串長(zhǎng)度,取字符,求子串,等操作 提供修改字符,插入串,刪除子串,若序號(hào)越界,將拋出字符串序號(hào)越界異常。

StringBuffer是最終類,不能被繼承

StringBuffer 類以變量串方式存儲(chǔ)和實(shí)現(xiàn)字符串操作,數(shù)組容量大于串長(zhǎng)度 串尾沒(méi)有\(zhòng)0 作為串結(jié)束符,當(dāng)數(shù)組容量不能滿足要求時(shí),將自動(dòng)擴(kuò)容。

StringBuffer類的插入,刪除等方法是線程互斥的。通過(guò)加互斥鎖,控制多個(gè)線程修改同一個(gè)共享字符串變量的次序是串行的不能并行交替的進(jìn)行修改,否則將產(chǎn)生與時(shí)間有關(guān)的錯(cuò)誤,不能保證結(jié)果的正確性。

?

模式匹配算法:

在進(jìn)行文本編輯時(shí)候,我們經(jīng)常查找和替換,在文檔的指定范圍內(nèi)查找一個(gè)單詞的位置,用另一個(gè)單詞替換,替換操作的前提是查找操作,如果查找到指定單詞,則確定了操作位置,可以將指定單詞用另一個(gè)單詞替換掉,否則不能進(jìn)行替換操作,每進(jìn)行一次替換操作,都需要執(zhí)行一次查找操作,那么如何快速查找指定單詞在文檔中的位置呢,就是串的模式批評(píng)算法需要姐姐的問(wèn)題,

設(shè)有2個(gè)串,目標(biāo)串target 和模式串 pattern ,在目標(biāo)串target中查找與模式串pattern相等的一個(gè)子串并確定該子串的操作稱為 串的模式批評(píng),兩個(gè)子串相等指的是:長(zhǎng)度相等且對(duì)應(yīng)各個(gè)字符相同,匹配結(jié)果有兩種? 如果target存在pattern相等的子串,則批評(píng)成功 獲得該子串在target中的位置,否則匹配失敗給出失敗信息。

?

模式匹配應(yīng)用:

要對(duì)目標(biāo)串target 與模式串pattern 匹配的子串進(jìn)行刪除或者替換操作,必須先執(zhí)行串的模式匹配算法,在target串中查找與pattern匹配的子串序號(hào),確定刪除或者替換操作的起始位置,如果匹配失敗,則不進(jìn)行替換或者刪除操作,因此,串的模式匹配算法是替換和刪除子串的基礎(chǔ)。

?

Brute - force 算法描述

已知目標(biāo)串,target = "t0,t1,t2,tn-1" , 模式串 pattern = "p0 p1 p2 pn-1"? , 0 < m <= n? Brute-Force 算法將目標(biāo)串中的每個(gè)長(zhǎng)度為 m的子串? “t0 tm-1” "t1? tm-1" ...? "tn-m? tn-1"? 依次與模式串進(jìn)行匹配操作,設(shè) target="aababcd" pattern = "abcd"? 匹配四次,? 匹配層高返回子串序號(hào)3 ,字符比較10次。

?

KMP算法簡(jiǎn)介:

KMP是一種無(wú)回溯的模式匹配算法,他改進(jìn)了Brute-Force 算法,目標(biāo)串不回溯。

已知目標(biāo)串 “t0 t1 t2 tn-1” 與模式串 pattern = "p0 p1 p2 pn-1" 0<m<=n KMP算法每次匹配依次比較p1 與pj, (0<=i<n 0<=j<m).

若t=p 則繼續(xù)比較 t+1 與 p+1,直到ti+m+1...ti = p0...pm-1 則匹配成功,返回模式串在目標(biāo)串中匹配子串序號(hào) i-m+1.

若ti!=pj 表示ti-j ...ti 與 p0...pj? 匹配失敗,目標(biāo)串不回溯,下次匹配ti 將與模式串pk(0<=k<j)比較,對(duì)于每個(gè)pj, k取值不同,因此,如何求得這個(gè)k,就成了KMP算法核心問(wèn)題。

? 目標(biāo)不回溯:

Brute-Force算法的目標(biāo)串存在回朔,兩個(gè)串逐級(jí)比較,如果t1!=p1 (0<=i<n ||? 0<=j<m)則下次匹配目標(biāo)串從ti 退回到 ti-j+1,開始于模式串p0 比較,實(shí)際上 目標(biāo)串回朔是不必要的,ti-j+1 與p0 的比較結(jié)果可由前一次匹配結(jié)果得到.

設(shè)t0 t1 t2 與 p0 p1 p2 匹配一次,有t0 = p0? t1 = p1? t2 != p2

1.若p1 != p0? 那么 t1 也不等于 p0 下次匹配從t2 與 p0 開始匹配。

2.若p1 = p0? 那么 t1 = p0? 下次匹配 從 t2 與 p1 開始。

總之,當(dāng)t2 != p2 時(shí),無(wú)論p1 p0 是否相等,目標(biāo)下次匹配都從t2開始比較,不回溯,而模式串要根據(jù)p1 和p0 是否相同,確定從p0或者p1 開始比較。

轉(zhuǎn)載于:https://www.cnblogs.com/gwyy/p/11033077.html

總結(jié)

以上是生活随笔為你收集整理的[数据结构] - 串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。