二維數組m的元素是4個字符組成的串_串、數組和廣義表

1. 串

1.1 串的定義

ADT String{
數據對象:D={ai|ai∈CharacterSet, i=1, 2, …, n, n≧0}
數據關系:R1={|ai-1, ai∈D, i=2, …, n}
基本操作:
生成一個值等于chars的串
復制一個串
判斷串是否空串
比較串的大小
返回串元素的個數
將串清空
將串合并
返回串的指定下標的元素之后指定長度的字串
在某個串中查找規定子串,并返回指定下標的字符后第一次出現的位置
在某個串中用規定字串替代不重疊的另一規定字串
在串的指定下標的字符前插入一個指定子串
在串中刪除一個規定下標開始指定長度的字串
銷毀串
}

1.2 串的存儲結構

1.2.1 順序存儲

//----------串的定長順序存儲結構---------------

#define MAXLEN 255 //串的最大長度
typedef struct
{
char ch[MAXLEN+1]; //存儲串的一維數組,從下標為1開始存儲
int length; //串的當前長度
}SString;


//----------串的堆式順序存儲結構,按需分配長度----------------
typedef struct
{
char *ch; //如果是非空串,則按照串長分配存儲區,否則ch為null
int length; //串的當前長度
}HString;

1.2.2 鏈式存儲

#define CHUNKSIZE 80
typedef struct Chunk
{
char ch[CHUNKSIZE]; //提高空間利用率(一個結點多個字符)
struct Chunk *next; //最后一個結點不滿用非串字符填滿
}Chunk;

typedef struct
{
Chunk *head, *tail; //尾指針便于操作
int length; //串的當前長度
}LString;

1.3 模式匹配算法

1.3.1 BF算法

int Index_BF(SString S, SString T, int pos)
{//返回模式T在主串S中第pos個字符開始第一次出現的位置。若不存在,則返回值為0
//T非空,0int i=pos; int j=1; //初始化while (i<=S.length && j<=T.length) //如果兩個串均沒到串尾{if (S.ch[i]==T.ch[j]){++i; ++j;} //如果目前的字符匹配,則繼續比較下一個字符else{i=i-j+2; j=1;} //如果失配,則將i退回到主串開始比較的下一個字符,j退回到字串的開頭}if (j>T.length) return (i-T.length); //匹配成功else return 0; //匹配失敗 }

1.3.2 KMP算法

  1. 設計思想
    失配時,主串指示器i不用回溯,利用已經得到的部分匹配,將模式串指示器j向右滑動盡可能遠的距離后繼續比較

b75a91555535782eb8be5d249d495f16.pngfe31a464a7265a77eb17d10e5978859e.png

a7f9b44760c145b8521fd2769a2038c6.png
為此定義next函數,表示模式中第j個字符失配時,在模式串中需要重新與主串中該字符進行比較的字符的位置e7b53f80ff8231c5af899179513081bc.png

故算法如下

int Index_KMP(SString S, SString T, int pos)
{ //利用模式串T的next函數求T在主串S中第pos個字符之后的位置
//其中T非空,1<=pos<=S.length
int i=pos; int j=1;
while (i<S.length && j<T.length) //兩個串均未到達串尾
{
if(j==0 || S.ch[i]==T.ch[j]){++i; ++j;} //如果j為0或者目前的字符匹配,則繼續比較下一個字符
else j=next[j]; //否則就將j置為next[j]
}
if (j>T.length) return (i-T.length); //匹配成功
else return 0; //匹配失敗
}
  1. next函數求法
    遞推求值
    由定義知,

			next[1] = 0

設next[j]=k,表明有296048ea23c3d243a84ad0a078d3db8d.png
1k滿足上式,此時next[j+1]的值有以下兩種情況
(1)pk=pj,則有df057b3cec42aa013f113e47eacd15a8.png

			next[j+1]=k+1=next[j]+1

(2)pk≠pj
此時用把求next值的問題看成模式匹配的問題,模式串既是主串又是模式串
求next[j+1],第j+1個字符與主串失配,假設此時將k=next[j]及其前面的字符串滑過來與主串匹配,由于pk≠pj,此時第k個字母與主串失配,因此我們應當在它前面尋找k’=next[k]繼續與主串匹配,以此類推,直到某個字符匹配成功或p[k+1]=1

		next[j+1]=next[k]+1

算法如下:

void get_next(SString T, int next[])
{//求模式串T的next函數值并存入數組next
int i=1;next[1]=0;int j=0;
while (i<T.length)
{
if(j==0||T.ch[i]==T.ch[j]){++i; ++j; next[i]=j;} //如果j是0(開頭)或者第i個字符等于第j個字符,則next[i+1]=j+1
else j=next[j]; //如果不等于,j回溯到next[j]
}
}

但是,例如串"aaaab"與"aaabaaaab",第4個字母失配,但是還要將j=3,2,1依次與i=4比較,但由于j=1,2,3,4的字符都相等且i=4字符與j=4字符不等,因此可以直接比較i=5和j=1。
由此可見,當next[j]=k,而tj=tk時,不必比較,可以直接比較tj和tnext[k],以此類推
算法如下:

void get_nextval(SString T, int nextval[])
{//求模式串中next函數的修正值并存入數組nextval
int i=1;nextval[1]=0;int j=0;
while (i<T.length)
{
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j]; //如果第i個字符與第j個字符相等,j回溯到nextval[j]
}
else j=nextval[j];
}
}

2. 數組

2.1 定義

ADT Array{
數據對象:ji = 0, …, bi-1, i=1,2,…,n
D = {aj?j?…jn | n>0 稱為數組的維數,bi是第i維的長度}
ji是數組元素第i維下標,aj?j?…jn∈ElemSet}
數據關系:R = {R1, R2, …, Rn}
Ri = {}}
0<=jk<=bk-1, 1<=k<=n 且k≠i
0<=ji<=bi-2
aj?…ji…jn, aj?…ji+1…jn∈D, i = 2, …, n}
基本操作:
構造數組
銷毀數組
賦值指定的元素
返回指定的元素值
}

2.2 數組的順序存儲

位置下標:LOC(i,j)=LOC(0,0)+(n*i+j)L(可推廣至n維)

2.3 特殊矩陣的壓縮

  1. 對稱矩陣(aij = aji)
    以sa[a(a+1)/2]存儲下三角,則對于下標k有de0cebc5c3942c844e61db192acc6965.png

  2. 三角矩陣(只有半邊有元素,剩下半邊元素值相等)aaee6e69803fb1c981b4c129d350a185.png

  3. 其它矩陣
    (1)對角矩陣:找規律,壓縮
    (2)稀疏矩陣:三元組表(行下標,列下標,值)

3. 廣義表

3.1 定義

  1. 一些結論
    (1)元素可以是原子或者子表
    (2)可以為其它廣義表共享,可以共享其它廣義表
    (3)廣義表是一個遞歸的表

  2. 重要運算
    (1)取表頭:取出非空廣義表的第一個元素,可以是單原子或者子表
    (2)取表尾:取出除了第一個元素之外,其余元素構成的表

3.2 存儲結構

表結點由標志域(1表示表結點,0表示原子結點),表頭結點,表尾結點組成,原子由標志域和和值組成11fb1076d1e1e21e23be1f40b4b16a30.png
(a,(b,c,d))結構圖示如下5e6227ea9b62608e5be4307a8e5a19e3.png

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

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

相關文章

流媒體測試筆記記錄之————阿里云監控、OBS、FFmpeg拉流和推流變化比較記錄...

OBS設置視頻&#xff08;512kbps&#xff09;和音頻&#xff08;128kbps&#xff09;比特率 阿里云監控結果&#xff1a; 使用FFmpeg拉流到Nginx 服務器測試比特率 第二次測試&#xff0c;修改視頻和音頻比特率 OBS設置 阿里云監控 Nginx 比特率變化 FFMPEG 拉流截圖

Java RandomAccessFile readChar()方法及示例

RandomAccessFile類readChar()方法 (RandomAccessFile Class readChar() method) readChar() method is available in java.io package. readChar()方法在java.io包中可用。 readChar() method is used to read a character value from this file and it can read character up…

python方差分析模型的預測結果怎么看_statsmodels中方差分析表結果解析

引言通常我們在對多個變量進行統計分析的時候&#xff0c;結果的匯總和整理需要耗費大量的時間和精力&#xff0c;稍有不慎還有可能出現錯誤。因此在對多個變量統計分析的時候&#xff0c;使用自動化的腳本對結果進行整理和匯總就十分的方便了。這里筆者使用Python當中的statsm…

Java PipedOutputStream connect()方法與示例

PipedOutputStream類的connect()方法 (PipedOutputStream Class connect() method) connect() method is available in java.io package. connect()方法在java.io包中可用。 connect() method is used to cause this PipedOutputStream to be connected to the given PipedInpu…

[轉載] 中國象棋軟件-引擎實現(一)概述

2005年6月我系第二批科技小組的項目正式確定為實現一款中國象棋對弈軟件。基本功能包括人機對戰、網絡對戰。我負責開發人機對戰的引擎部分&#xff0c;也就是讓計算機下棋。經過了暑假整整兩個月的學習與實踐&#xff0c;我終于初步完成了程序&#xff0c;雖然電腦的下棋水平實…

Java FilePermission getActions()方法與示例

FilePermission類的getActions()方法 (FilePermission Class getActions() method) getActions() method is available in java.io package. getActions()方法在java.io包中可用。 getActions() method is used to check whether this FilePermission and the given object are…

字符與編碼(編碼轉換)

作為一名程序員&#xff0c;肯定有被亂碼困擾的時候&#xff0c;真到了百思不得其解的時候&#xff0c;就會覺得&#xff1a;英文程序員真幸福。但其實只要明白編碼之間的轉換規律&#xff0c;其實亂碼還是很好解決的。我們都知道字符串在保存和傳輸的時候需要先經過編碼成二進…

mysql 刷新二進制日志_使用binlog日志恢復MySQL數據庫刪除數據的方法

binlog日志簡介:binlog 就是binarylog&#xff0c;二進制日志文件&#xff0c;這個文件記錄了MySQL所有的DDL和DML(除了數據查詢語句)語句&#xff0c;以事件形式記錄&#xff0c;還包含語句所執行的消耗的時間。binlog日志包括兩類文件&#xff1a;1)二進制日志索引文件(文件名…

Java FileInputStream available()方法與示例

FileInputStream類的available()方法 (FileInputStream Class available() method) available() method is available in java.io package. available()方法在java.io包中可用。 available() method is used to return the number of bytes left that can be read from this Fi…

mysql 輸出參數 sql語句_MySQL: 詳細的sql語句

1添1.1【插入單行】insert [into] (列名) values (列值)例&#xff1a;insert into Strdents (姓名,性別,出生日期) values (開心朋朋,男,1980/6/15)1.2【將現有表數據添加到一個已有表】insert into (列名) select from 例&#xff1a;insert into tongxunlu (姓名,地址,電子郵…

執行git push出現Everything up-to-date

在github上git clone一個項目&#xff0c;在里面創建一個目錄&#xff0c;然后git push的時候&#xff0c;出現報錯"Everything up-to-date" 原因&#xff1a;1&#xff09;沒有git add .2&#xff09;沒有git commit -m "提交信息"如果上面兩個步驟都成功…

Java File類boolean delete()方法(帶示例)

文件類布爾型delete() (File Class boolean delete()) This method is available in package java.io.File.delete(). 軟件包java.io.File.delete()中提供了此方法。 This method is used to delete file or directory by using delete() method and this method is accessible…

Unity3D Adam Demo的學習與研究

1.簡述 這篇文章是對Adam各種相關資料了解后進行一些精簡的內容。如果你想仔細研究某個技術請跳轉至unity相關頁面。 Adam官方頁面: https://unity3d.com/cn/pages/adam 搬運視頻以及資源包網盤下載: http://pan.baidu.com/s/1jH6NF86 Adam這個demo由8個人的團隊耗時6個月(part…

Java File類boolean isFile()方法(帶示例)

File類boolean isFile() (File Class boolean isFile()) This method is available in package java.io.File.isFile(). 軟件包java.io.File.isFile()中提供了此方法。 This method is used to check whether the file is specified by filepath is a file or not. 此方法用于檢…

要加油!

現實中我容易佩服一個人。 一個頑強的女人&#xff0c;一個艱苦奮斗的男人..... 但是在網絡的世界里&#xff0c;我沒有佩服過幾個&#xff0c;但是不得不說的就是冰河。同樣的年齡人家做的事情和我們做的事情差距是多么的大&#xff0c;真的想想心里都是天壤之別。 比一比才知…

Java DataOutputStream writeInt()方法及示例

DataOutputStream類writeInt()方法 (DataOutputStream Class writeInt() method) writeInt() method is available in java.io package. writeInt()方法在java.io包中可用。 writeInt() method is used to write the given integer value to the basic DataOutputStream as 4 b…

python安卓自動化實現方法_uiautomator +python 實現安卓UI自動化

簡單實例注&#xff1a;安卓6.0以上的手機不會自動安裝app-uiautomator.apk和app-uiautomator-test.apk&#xff0c;需要手動安裝&#xff0c;否則報錯ioerror RPC server not starteduiautomator pythonHTMLTestRunner 安卓UI自動化實現#coding:utf-8from uiautomator importD…

ES6特性之:Spread操作符

Spread操作符(...)&#xff0c;也稱作展開操作符&#xff0c;作用是將可迭代的(Iterable)對象進行展開。 比如有2個數組&#xff0c;我們要將其中一個數組中所有元素插入到另一個數組中&#xff0c;通過Spread操作符&#xff0c;就可以這樣進行&#xff1a; var fruits ["…

Java類class isMemberClass()方法及示例

類的類isMemberClass()方法 (Class class isMemberClass() method) isMemberClass() method is available in java.lang package. isMemberClass()方法在java.lang包中可用。 isMemberClass() method is used to check whether the underlying class is a member class or not.…

velocity自定義函數_velocity基本語法和總結

一&#xff1a;基本語法&#xff1a;1、#set(#a "a")$a ##輸出語句時直接寫變量的名稱即可2、判斷語句&#xff1a;#if($a "a") ##判斷語句沒有括號&#xff0c;也是直接輸出$a3、數組&#xff1a;#set($arry [0..10])$foreach($i in $arry)$i ##換行#e…