数据结构-线性结构
一.線性結(jié)構(gòu)
1.順序線性表
1.1 線性結(jié)構(gòu)是一種基本的數(shù)據(jù)結(jié)構(gòu),具有單一前驅(qū)和后繼的數(shù)據(jù)關(guān)系描述。
1.2 線性表的存儲(chǔ)結(jié)構(gòu)分為順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)。
1.3 順序線性表的元素間的邏輯關(guān)系無(wú)需占用額外的空間來(lái)存儲(chǔ)。
1.4 一般地,以LOC(a1a_1a1?)表示線性表中第一個(gè)元素的存儲(chǔ)位置,在順序存儲(chǔ)結(jié)構(gòu)中,第i個(gè)元素aia_iai?的存儲(chǔ)位置為
LOC(ai)=LOC(a1)+(i?1)?LLOC(a_i) = LOC(a_1) + (i-1)*L LOC(ai?)=LOC(a1?)+(i?1)?LL表示表中每個(gè)元素所占用空間的字節(jié)數(shù)。
1.5 順序線性表的優(yōu)點(diǎn)是可以隨機(jī)存儲(chǔ)表中的元素,缺點(diǎn)是插入和刪除元素需要移動(dòng)元素。
1.6插入刪除操作需要移動(dòng)元素個(gè)數(shù)的期望值
(1) 在長(zhǎng)度為n的線性表中插入元素時(shí),共有n+1個(gè)插入位置,在位置1處插入元素需要移動(dòng)n個(gè)元素,在n位置處插入元素,需要移動(dòng)一個(gè)元素,則可知在**位置i處插入元素,需要移動(dòng)的元素個(gè)數(shù)為n+1 - i,**假設(shè)在n+1個(gè)位置插入元素的概率相等,則概率為:
1n+1\frac{1}{n+1} n+11?則插入元素的期望為
Einsert=∑i=1n+11n+1(n+1?i)=n2E_{insert} = \displaystyle\sum_{i=1}^{n+1} \frac{1}{n+1}(n+1 - i) = \frac{n}{2} Einsert?=i=1∑n+1?n+11?(n+1?i)=2n?
(2) 刪除元素時(shí),有n個(gè)元素可刪除的元素,刪除第i個(gè)元素需要移動(dòng)的元素個(gè)數(shù)為n-i,則期望為:
Edelete=∑i=1n1n(n?i)=n?12E_{delete} = \displaystyle\sum_{i=1}^{n} \frac{1}{n}(n - i) = \frac{n-1}{2} Edelete?=i=1∑n?n1?(n?i)=2n?1?
1.7 因此,插入和刪除的時(shí)間復(fù)雜度為O(n)。
2.鏈?zhǔn)骄€性表
2.1 通過(guò)指針域來(lái)存儲(chǔ)元素之間的邏輯關(guān)系,若節(jié)點(diǎn)中只有一個(gè)指針域,則稱為線性鏈表,具有插入和刪除元素不需要移動(dòng)元素的優(yōu)點(diǎn)。
2.2 在單鏈表中,在p所指節(jié)點(diǎn)后面插入新節(jié)點(diǎn):
2.3 在單鏈表中刪除p所指節(jié)點(diǎn)的后繼節(jié)點(diǎn):
q = p->next;//記住需要?jiǎng)h除的節(jié)點(diǎn),用于其釋放內(nèi)存 p->next = p->next->next; free(q);
插入,刪除節(jié)點(diǎn)都需要從插入或刪除的節(jié)點(diǎn)入手,結(jié)合圖中所示,書(shū)寫(xiě)首尾銜接,方便快速寫(xiě)出正確的代碼。
2.4 在實(shí)際應(yīng)用中,為了簡(jiǎn)化對(duì)鏈表狀態(tài)的判定和處理,特別引入一個(gè)不存儲(chǔ)數(shù)據(jù)元素的節(jié)點(diǎn),稱之為頭節(jié)點(diǎn),將其作為鏈表的第一個(gè)節(jié)點(diǎn)并令頭指針指向該節(jié)點(diǎn)。
2.5 雙向鏈表,具有連個(gè)指針域,分別指出當(dāng)前元素的直接前驅(qū)和直接后繼。循環(huán)鏈表,在單鏈表的基礎(chǔ)上,令表尾節(jié)點(diǎn)的指針指向鏈表的第一個(gè)節(jié)點(diǎn)。注意區(qū)分兩者的區(qū)別。
2.6 雙向鏈表的刪除和插入操作,front表示前驅(qū),next表示后繼。
在p節(jié)點(diǎn)之前插入節(jié)點(diǎn)s:
s->front = p->front; p->front->next = s; s->next = p; p->front = s;刪除節(jié)點(diǎn)p:
p->front->next = p->next; p->next->front = p->front; free(p);3. 棧和隊(duì)列
3.1 在棧中進(jìn)行插入和刪除操作的一端稱為棧頂。
3.2 棧的存儲(chǔ)結(jié)構(gòu):順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)。采用順序存儲(chǔ)結(jié)構(gòu)的棧稱為順序棧,在這種存儲(chǔ)方式下,需要預(yù)新申請(qǐng)棧的存儲(chǔ)空間。
3.3 棧的典型應(yīng)用包括表達(dá)式求值,括號(hào)匹配等,其次將遞歸過(guò)程轉(zhuǎn)換成非遞歸過(guò)程,也需要利用棧來(lái)實(shí)現(xiàn)。
3.4 在對(duì)隊(duì)列中,允許插入元素的一端稱為隊(duì)尾(Rear),允許刪除元素的一端稱之為隊(duì)頭(Front)。順序存儲(chǔ)的隊(duì)列,可以通過(guò)求余運(yùn)算來(lái)實(shí)現(xiàn)環(huán)狀結(jié)構(gòu)。
元素入隊(duì)和元素出隊(duì)列;
3.5 當(dāng)頭指針和為指針相等時(shí),表示隊(duì)列為空,當(dāng)尾指針的下一個(gè)位置為頭指針是表示隊(duì)列滿,或者設(shè)置一個(gè)隊(duì)列滿的標(biāo)志是區(qū)分隊(duì)列的空與滿。
3.6 鏈?zhǔn)疥?duì)列,采用給隊(duì)列添加一個(gè)頭節(jié)點(diǎn),并令頭指針指向該節(jié)點(diǎn)。因此,當(dāng)頭指針與位置的值相等且均指向頭結(jié)點(diǎn)表示隊(duì)列空。
3.7 隊(duì)列主要用于需要排隊(duì)的場(chǎng)合,以及離散事件的計(jì)算機(jī)模擬等。
4.串的模式匹配
4.1 樸素的模式匹配算法:基本思想是從主串的第一個(gè)字符與模式串的第一個(gè)字符比較,若相等,則逐一對(duì)字符串進(jìn)行后續(xù)的比較,否則從主串第二個(gè)字符與模式串的第一個(gè)字符重新比較,直到匹配成功或則失敗。
4.2 模式匹配的算法時(shí)間復(fù)雜度
(1) 假設(shè)主串和模式串長(zhǎng)度分別為n和m,下表從0開(kāi)始,假設(shè)從主串的第i個(gè)位置匹配成功,且在前i趟中都是模式串的第一個(gè)字符與主串匹配失敗,字符比較次數(shù)為i,而第i+1趟成功匹配字符的比較次數(shù)為m,總的字符比較次數(shù)為i+ m(0<=i<=n-m),若在n-m個(gè)位置上匹配成功的概率相同,即
1n?m+1\frac{1}{n-m+1} n?m+11?
則,匹配成功時(shí)字符的平均比較次數(shù)為:
1n?m+1∑i=0n?m(i+m)=n+m2\frac{1}{n-m+1} \displaystyle\sum_{i=0}^{n-m} (i+m) = \frac{n+m}{2} n?m+11?i=0∑n?m?(i+m)=2n+m?
因此,在最好情況下匹配算法的時(shí)間復(fù)雜度為O(n+m)。
(2)假設(shè)最壞情況下,每次匹配不成功都是模式串的最后一個(gè)字符不匹配,則前i趟中字符比較了i×m次,第i+1趟也比較了m次,則:
∑i=0n?mm(i+1)n?m+1=12m(n?m+2)\displaystyle\sum_{i=0}^{n-m}\frac{m(i+1)}{n-m+1} = \frac{1}{2}m(n-m+2) i=0∑n?m?n?m+1m(i+1)?=21?m(n?m+2)
因此,在最壞情況下匹配算法的時(shí)間復(fù)雜度為O(n×m)。
5.矩陣的壓縮存儲(chǔ)
5.1 n階對(duì)稱矩陣,aija_{ij}aij?=ajia_{ji}aji?,可將n2n^2n2個(gè)元素壓縮存儲(chǔ)到n(n+1)2\frac{n(n+1)}{2}2n(n+1)?個(gè)元素的存儲(chǔ)空間。
采用行為主序存儲(chǔ)下三角包括對(duì)角線中的元素在數(shù)組A中,則A [k]與矩陣元素aija_{ij}aij?之間的一一對(duì)應(yīng)關(guān)系為:
k={i(i?1)2+ji?>=?jj(j?1)2+i,i?<?jk = \begin{cases} \frac{i(i-1)}{2}+j & \text {i >= j} \\ \frac{j(j-1)}{2}+i , & \text{i < j} \end{cases} k={2i(i?1)?+j2j(j?1)?+i,?i?>=?ji?<?j?
總結(jié)
- 上一篇: linux的常用操作——静态库
- 下一篇: java 搭建 web服务器 socke