版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
專題九:數(shù)據(jù)構(gòu)造知識(shí)
數(shù)據(jù)構(gòu)造是計(jì)算機(jī)軟件的一門基礎(chǔ)課程,計(jì)算機(jī)科學(xué)各個(gè)領(lǐng)域及有關(guān)的應(yīng)用軟件都要用到
多種數(shù)據(jù)構(gòu)造.語言編譯要使用棧、散列表及語法樹;操作系統(tǒng)中用隊(duì)列、存儲(chǔ)管理表及目錄
樹等;數(shù)據(jù)庫系統(tǒng)運(yùn)用線性表、多鏈表及索引樹等進(jìn)行數(shù)據(jù)管理;而在人工智能領(lǐng)域,依求解
問題性質(zhì)的差異將波及到多種不一樣的數(shù)據(jù)構(gòu)造,如廣義表、集合、搜索樹及多種有向圖等等。
學(xué)習(xí)數(shù)據(jù)構(gòu)造目的是要熟悉某些最常用的數(shù)據(jù)構(gòu)造,明確數(shù)據(jù)構(gòu)造內(nèi)在的邏輯關(guān)系,懂得它們
在計(jì)算機(jī)中的存儲(chǔ)表達(dá),并結(jié)合多種經(jīng)典應(yīng)用闡明它們在進(jìn)行多種操作時(shí)的動(dòng)態(tài)性質(zhì)及實(shí)際的
執(zhí)行算法,深入提高軟件計(jì)和編程水平。通過對不一樣存儲(chǔ)構(gòu)造和對應(yīng)算法的對比,增強(qiáng)我們
根據(jù)求解問題的性質(zhì)選擇合理的數(shù)據(jù)構(gòu)造,并將問題求解算法的空間、時(shí)間及復(fù)雜性控制在一
定范圍的能力。
軟件設(shè)計(jì)師考試大綱對數(shù)據(jù)構(gòu)造部分的規(guī)定是純熟掌握常用數(shù)據(jù)構(gòu)造和常用算法,因此,
本專題從數(shù)據(jù)構(gòu)造的概述出發(fā),對基本的概念引出常用的數(shù)據(jù)構(gòu)造類型的簡介和講解,同步在
講解多種數(shù)據(jù)構(gòu)造中間采用算法與數(shù)據(jù)構(gòu)造相結(jié)合的方式,在算法環(huán)節(jié)中使用數(shù)據(jù)構(gòu)造,對數(shù)
據(jù)構(gòu)造的重點(diǎn)、難點(diǎn)進(jìn)行了分析,最終講解了與數(shù)據(jù)構(gòu)造緊密有關(guān)的排序和查找算法,以及某
些以往考試題的分析。
1.數(shù)據(jù)構(gòu)造概述
數(shù)據(jù)構(gòu)造研究了計(jì)算機(jī)需要處理的數(shù)據(jù)對象和對.象之間的關(guān)系;刻畫了應(yīng)用中波及
到的數(shù)據(jù)的邏輯組織;也描述了數(shù)據(jù)在計(jì)算機(jī)中怎樣存儲(chǔ)、傳送、轉(zhuǎn)換。
學(xué)習(xí)數(shù)據(jù)構(gòu)造注意的問題:
■系統(tǒng)掌握基本數(shù)據(jù)構(gòu)造的特點(diǎn)及其不一樣實(shí)現(xiàn)。
■理解并掌握多種數(shù)據(jù)構(gòu)造上重要操作的實(shí)現(xiàn)及其性能(時(shí)間、空間)的分析。
■掌握多種數(shù)據(jù)構(gòu)造的使用特性,在算法設(shè)計(jì)中可以進(jìn)行選擇。
■掌握常用的遞歸、回溯、迭代、遞推等措施的設(shè)計(jì)
■掌握自頂向下、逐漸求精的程序設(shè)計(jì)措施。
■掌握自頂向下、逐漸求精的程序設(shè)計(jì)措施。
在學(xué)習(xí)數(shù)據(jù)構(gòu)造的知識(shí)之前,我們要理解一下數(shù)據(jù)構(gòu)造中的基本概念。
數(shù)據(jù):對客觀事物的符號(hào)表達(dá),在計(jì)算機(jī)中就是指所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序
所處理的符號(hào)的總稱。
數(shù)據(jù)項(xiàng):是數(shù)據(jù)的不可分割的最小單位;
數(shù)據(jù)元素:是數(shù)據(jù)的基本單位,在計(jì)算機(jī)程序中一般作為一種整體進(jìn)行處理;一種數(shù)據(jù)元素
可由若干個(gè)數(shù)據(jù)項(xiàng)構(gòu)成。
數(shù)據(jù)對象:是性質(zhì)相似的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一種子集。
數(shù)據(jù)構(gòu)造上的基本操作:
?插入操作?刪除操作?更新操作?查找操作?排序操作
數(shù)據(jù)構(gòu)造是指數(shù)據(jù)對象及互相關(guān)系和構(gòu)造措施,一種數(shù)據(jù)構(gòu)造B形式上可以用一種
二元組表達(dá)為B=(A,R)o其中,A是數(shù)據(jù)構(gòu)造中的數(shù)據(jù)(稱為結(jié)點(diǎn))的#空有限集合,
R是定義在A上的關(guān)系的非空有限集合。
根據(jù)數(shù)據(jù)元素之間的關(guān)系的不一樣特性,一般有下列4類基本構(gòu)造。
>集合一一構(gòu)造中的數(shù)據(jù)元素除了“同屬于一種集合”的關(guān)系外,別無其他
關(guān)系。
>線性構(gòu)造一一構(gòu)造中的數(shù)據(jù)元素之間存在一種對一種的關(guān)系。
>樹形構(gòu)造一一構(gòu)造中的元素之間存在一種對多種的關(guān)系。
>圖狀構(gòu)造或網(wǎng)狀構(gòu)造一一構(gòu)造中的元素之間存在多種對多種的關(guān)系。
數(shù)據(jù)構(gòu)造中,結(jié)點(diǎn)與結(jié)點(diǎn)間的互相關(guān)系是數(shù)據(jù)的邏輯構(gòu)造。數(shù)據(jù)構(gòu)造在計(jì)算機(jī)中的
表達(dá)(又稱為映象)稱為數(shù)據(jù)的物理構(gòu)造,也稱存儲(chǔ)構(gòu)造。
數(shù)據(jù)元素之間的關(guān)系在計(jì)算機(jī)中有兩種不一樣的表達(dá)方式:次序映象和非次序映象,
并由此得到兩種不一樣的存儲(chǔ)構(gòu)造:次序存儲(chǔ)構(gòu)造和旌式存儲(chǔ)構(gòu)造。
任何一種算法的設(shè)計(jì)取決于選定的數(shù)據(jù)(邏輯)構(gòu)造,而算法的實(shí)現(xiàn)依賴于采用的
存儲(chǔ)構(gòu)造。
數(shù)據(jù)的邏輯構(gòu)造分為兩類:
線性構(gòu)造:線性表、棧、隊(duì)列和串
非線性構(gòu)造:樹、圖
數(shù)據(jù)的存儲(chǔ)措施有四類:
次序存儲(chǔ)措施
鏈接存儲(chǔ)措施
索引存儲(chǔ)措施
散列存儲(chǔ)措施
2.常用數(shù)據(jù)構(gòu)造
2.1線性表
在數(shù)據(jù)構(gòu)造中,線性構(gòu)造常稱為線性表,是最簡樸、最常用的一種數(shù)據(jù)構(gòu)造,它
是由n個(gè)相似數(shù)據(jù)類型的結(jié)點(diǎn)構(gòu)成的有限序歹h
其特點(diǎn)是:在數(shù)據(jù)元素的非空有限集合中,
?存在唯一的一種被稱做“第一種”的數(shù)據(jù)元素
?存在唯一的一種被稱做“最終一種”的元素?cái)?shù)據(jù)元素
?除第一種之外,集合中的每個(gè)數(shù)據(jù)元素均只有一種前驅(qū)
?除最終一種之外,集合中每個(gè)數(shù)據(jù)元素均只有一種后繼
一種由n個(gè)結(jié)點(diǎn)eO,el…,enT構(gòu)成的線性表記為:(eO,el…,en-1)。線
性表的結(jié)點(diǎn)個(gè)數(shù)稱為線怛表的K度,長度為0的線性衣稱為空的線性表,簡稱空表。對
于非空線性表,。0是線性表的第一種結(jié)點(diǎn),a?是線性表的最終一種結(jié)點(diǎn)。線性表的結(jié)
點(diǎn)構(gòu)成了一種序列,對序列中兩個(gè)相鄰結(jié)點(diǎn)ei和CL,稱前者是后者的前驅(qū)結(jié)點(diǎn),后者
是前者的后繼結(jié)點(diǎn)。
線性表最重要的性質(zhì)是線性表中結(jié)點(diǎn)和相對位置是確定的。
線性表的結(jié)點(diǎn)也稱為表元,或稱為記錄,規(guī)定線性表的結(jié)點(diǎn)一定是同一類型
的數(shù)據(jù)。線性表的結(jié)點(diǎn)可由若干個(gè)成分構(gòu)成,其中唯一標(biāo)識(shí)表元的成提成為關(guān)鍵字,簡
稱鍵。
線性表是一種相稱靈活的數(shù)據(jù)構(gòu)造,它的長度可以根據(jù)需要增長或縮短。對
線性表的基本運(yùn)算如卜.:
INITIATE(L)初始化操作
LENGTH(L)求長度函數(shù)
GET(L,i)取元素函數(shù)
PRIOR(L,elm)求前驅(qū)函數(shù)
NEXT(L,elm)求后繼函數(shù)
LOCATE(L,x)定位函數(shù)
INSERT(L,i,b)插入操作
DELETE(L,i)刪除操作
有多種存儲(chǔ)方式能將線性表存儲(chǔ)在計(jì)算機(jī)內(nèi),其中最常用的是次序存儲(chǔ)和鏈接存儲(chǔ)。
根據(jù)存儲(chǔ)方式的不一樣,其上述的運(yùn)算實(shí)現(xiàn)也不一樣樣。
?次序存儲(chǔ):是最簡樸的存儲(chǔ)方式,其特點(diǎn)是邏輯關(guān)系上相鄰的兩個(gè)元素在物理位
置上也相鄰。一般使用一種足夠大的數(shù)組,從數(shù)組的第一種元素開始,將線性表的結(jié)點(diǎn)
依次存儲(chǔ)在數(shù)組中。
次序存儲(chǔ)方式長處:能直接訪問線性表中的任意結(jié)點(diǎn)。
線性表的第i個(gè)元素a[i]的存儲(chǔ)位置可以使用如下公式求得:LOC(a.)=LOC(al)
+(i-1)*1
式中LOC(al)是線性表的第一種數(shù)據(jù)元素al的存儲(chǔ)位置,一般稱做線性表的起始位置
或基地址。
次序存儲(chǔ)的缺陷:
1)線性表的大小固定,揮霍大量的存儲(chǔ)空間,不利于節(jié)點(diǎn)的增長和減少;
執(zhí)行線性表的插入和刪除操作要移動(dòng)其他元素,不夠以便;
?鏈?zhǔn)酱鎯?chǔ)
線性表鏈接存儲(chǔ)是用鏈表來存儲(chǔ)線性表。
單鏈表(線性鏈表):
從鏈表的第一種表元開始,將線性表的結(jié)點(diǎn)依次存儲(chǔ)在鏈表的各表元中。鏈表的每
個(gè)表元除要存儲(chǔ)線性表結(jié)點(diǎn)的信息以外,還要有一種成分來存儲(chǔ)其后繼結(jié)點(diǎn)的指針。
線性鏈表的特點(diǎn)是:每個(gè)鏈表均有一種頭指針,整個(gè)鏈表的存取必須從頭指針開始,
頭指針指向第一種數(shù)據(jù)元素的位置,最終的節(jié)點(diǎn)指針為空。當(dāng)鏈表為空時(shí),頭指針為空
值;鏈表非空時(shí),頭指針指向第一種節(jié)點(diǎn)。
鏈?zhǔn)酱鎯?chǔ)的缺陷:
1)由于要存儲(chǔ)地址指針,因此揮霍空間;
直接訪問節(jié)點(diǎn)不以便;
循環(huán)鏈表:
循環(huán)鏈表是另一種形式的鏈?zhǔn)酱鎯?chǔ)構(gòu)造,是單鏈表的變形。它的特點(diǎn)就是表中最終
一種結(jié)點(diǎn)的指針域指向頭結(jié)點(diǎn),整個(gè)鏈表形成一種環(huán)。因此,從表中任意一種結(jié)點(diǎn)出發(fā)
都可以找到衣中的其他給點(diǎn)。
循環(huán)鏈表和單向鏈表基本一致,差異僅在于算法中循環(huán)的條件不是結(jié)點(diǎn)的指針與否
為空,而是他們的指針與否等于頭指針,
循環(huán)鏈表最終一種結(jié)點(diǎn)的萬〃5指針不為0(A0〃),而是指向了表的前端。
為簡化操作,在循環(huán)鏈表中往往加入表頭結(jié)點(diǎn)。
循環(huán)鏈表的特點(diǎn)是:只要懂得表中某一結(jié)點(diǎn)的地址,就可搜尋到所有其他結(jié)點(diǎn)的地址。
循環(huán)鏈表的示例:
first
帶表頭結(jié)點(diǎn)的循環(huán)鏈表:
first—^廠廠-i-IV
last
雙向鏈表:
雙向鏈表是另一種形式的鏈?zhǔn)綐?gòu)造,雙向鏈表的結(jié)點(diǎn)中有兩個(gè)指針域,其一指向直
接后繼,另一指向直接前趨。雙向鏈表克服了單鏈表的單向性的缺陷。
--------?前驅(qū)方向后繼方向
ILinkdata?Link
(左位指針)(數(shù)據(jù))(右修指針)
雙向鏈表也可以有循環(huán)表,鏈表中存在兩個(gè)環(huán)。一種結(jié)點(diǎn)的前趨的后繼和該結(jié)點(diǎn)的后繼
的前趨都是指向該結(jié)點(diǎn)的。
P-*ZLtinkP
p==p-^lLink-^rLink==p-^rLink-^lLink
2.2棧
棧(Stack)是限定僅在表尾進(jìn)行插入或刪除操作的線性表。表尾端稱棧頂(tc,p),
表頭端稱棧底(bottom)o
若有棧S=(so,Sl,…,Sn-j)則So為棧底結(jié)點(diǎn),Sn-l為棧頂結(jié)點(diǎn)。一般稱棧的結(jié)點(diǎn)
插入為進(jìn)棧,棧的結(jié)點(diǎn)刪除為出棧。由于最終進(jìn)棧的結(jié)點(diǎn)必然最先出棧,因此棧具有后
進(jìn)先出的特點(diǎn)??梢杂靡幌乱环N圖形來形象的表達(dá):
ML極
(JR入)
棧有兩種存儲(chǔ)構(gòu)造:次序棧和鏈棧
次序棧即棧的次序存儲(chǔ)構(gòu)造是,運(yùn)用?組地址持續(xù)的存儲(chǔ)單元依次寄存自棧底到棧
頂?shù)臄?shù)據(jù)元素,同步設(shè)指針top指示棧頂元素的目前位置。
棧也可以用鏈表實(shí)現(xiàn),鏈?zhǔn)酱鎯?chǔ)構(gòu)造的棧簡稱鏈棧。若同步需兩個(gè)以上的棧,則最
佳采用這種構(gòu)造。對于棧上的操作,總結(jié)如下,大家可以仔細(xì)看一下這些程序,一種大
的程序都是由某些對數(shù)據(jù)構(gòu)造的小的操作構(gòu)成的。
次序存儲(chǔ)的棧的基本操作如卜.:
判斷棧滿:
intstackful1(seqstack*s)
(
return(s->top==stacksize-l);
}
進(jìn)棧:
voidpush(seqstack*s,datatypex)
{
if(stackfull(s))
error("stackverflow");
s->data[++s->top]=x;
)
top一ktop-k
■■ee
dd
cc
top-bbb
top—?a?aaa
top—?空棧a進(jìn)棧b進(jìn)棧在進(jìn)棧l進(jìn)棧源用
判斷???
intstackempty(seqstazk*s)
return(s->top==-1)
出棧:
datatypepop(seqstack*s)
{
if(stackempty(s))
error("stackunderflowv);
x=s->data[top];
s->top一;
return(x);
.k
top?ee
dtop—?d
d???
cctop-c
bbbb
aaaa
A退棧e退棧diU棧top-ajH棧top—空棧
鏈接存儲(chǔ)棧:用鏈表實(shí)現(xiàn)的棧,鏈表第一種元素是枝頂元素,鏈表的末尾是棧底節(jié)點(diǎn),
鏈表的頭指針就是棧頂指針,棧頂指針為空則是空棧。若同步需要兩個(gè)以上的棧,最佳
采用鏈表作存儲(chǔ)構(gòu)造
top
鏈接存儲(chǔ)的棧的操作如下:
進(jìn)棧:
Voidpush(linkstack*p,datatypex)
(
stacknode*qq=(stacknode*)malloc(sizeo:(stacknode));
q->data=x;
q->next=p->top;
P->top=q;
)
出棧:
Datatypepop(linkstack*p)
(
datatypex;
stacknode*q=p->top;
if(stackempty(p)
error(wstackunderflow.n);
x=q->data;
p->top=q->next;
free(q);
returnx;
)
多棧處理?xiàng)8?dòng)技術(shù):
n個(gè)棧共享一種數(shù)組空間r[同
n設(shè)置棧頂指針數(shù)組t[〃+1]和棧底指針數(shù)組b[山1]
,H力和瓦力分別指示第/個(gè)棧的棧頂與棧底,瓦,]作為控制量,指到數(shù)組最高下標(biāo)
各棧初始分派空間s=m/n指針初始值t[0]=Z>[0]=-1b\_n\=nr\
t\_/]=b\_/]=A[/-l]+s,i-1,2,,,,,n~\
maxSke1
初始狀態(tài)
40)UHt[2]t[3]W
maxSiuJ
V某時(shí)刻狀態(tài)
t
MO]一川]T[4]
maxSi"1
插入力之后
2.3隊(duì)列
隊(duì)列是只容許在一端進(jìn)行插入,另一端進(jìn)行刪除運(yùn)算的線性表。容許刪除的那一端
稱為隊(duì)首(front),容許插入運(yùn)算的另一端稱為隊(duì)尾(rear)<,一般稱隊(duì)列的結(jié)點(diǎn)插
入為進(jìn)隊(duì),隊(duì)列的結(jié)點(diǎn)刪除為出隊(duì)。若有隊(duì)列
Q=(qo,q”…,qi)則q0為隊(duì)首結(jié)點(diǎn),qi為隊(duì)尾結(jié)點(diǎn)。因最先進(jìn)入隊(duì)列的結(jié)點(diǎn)將
最先出隊(duì),因此隊(duì)列具有先進(jìn)先出的特性。
frontrear
可以用次序存儲(chǔ)線性表來表達(dá)隊(duì)列,也可以用鏈表實(shí)現(xiàn),用鏈表實(shí)現(xiàn)的隊(duì)列稱為鏈隊(duì)
列。
隊(duì)列操作:
①inipush(PNODE*top,inte)是進(jìn)棧函數(shù),形參lop是棧頂指針的指針,形參e
是入棧元素。
②intpop(PNODE*top,intoe)是出棧函數(shù),形參top是棧頂指針的指針,形參e
作為返回出棧元素使用。
③intenQucue(PNODE*tail,inte)是入隊(duì)函數(shù),形參tail是隊(duì)尾指針的指針,
形參c是入隊(duì)元素。
?intdeQueue(PNODE*tail,int*e)是出隊(duì)函數(shù),形參tail是隊(duì)尾指針的指針,
形參e作為返回出隊(duì)元素使用。
front二front-front-fronts
空網(wǎng)做隊(duì)B進(jìn)隊(duì)CD進(jìn)隊(duì)A出隊(duì)B出隊(duì)EF進(jìn)隊(duì)
定義結(jié)點(diǎn)的構(gòu)造如下:
typedefstructnode{
intvalue;
structnode*next:
INODE,*PNODE;
[函數(shù)①]
intpush(PNODE*top,inte)
PNODEp=(PNODE)malloc(sizeof(NODE));
if(!p)return-1;
p->value=e;
p->noxt=*top;〃指向棧頂指針
*top=p;
return0;
)
[函數(shù)②]
intpop(PNODE*top;int*e)
{
PNODEp=*top;
if(p==NULL)return-1;
*o=p->value;
*top=p->ncxl;〃棧頂指向取出的數(shù)的指針
free(p);
return0;
)
[函數(shù)③]
intenQueue(PNODE火tail,inte)
{PNODEp,t:
t=*tail;
p=(PNODE)ma11oc(sizeof(NODE));
if(!p)return_1;
p->value=e;
p->next=t—>next;
t->next=p;〃將元素加在尾指針后
*tail=p;
return0;
)
[函數(shù)④]
intdeQueue(PNODE-tail,inte)
{
PNODEp,q;
if((*tail)->next==*tail)return-1;〃隊(duì)列已經(jīng)空
p=(*tail)->next;〃p獲得尾指針
q=p->next;
e=q->value;
p->next-q->ncxt;
if(*tai1=q)
*tail=p;//'尾指針指向最終節(jié)點(diǎn)
free(q);
return0;
)
循環(huán)隊(duì)列(CircularQueue):
存儲(chǔ)隊(duì)列的數(shù)組被當(dāng)作首尾相接的表處理。
隊(duì)頭、隊(duì)尾指針加1時(shí)從rS/ze-1直接進(jìn)到0,可用語言的取模(余數(shù))運(yùn)算實(shí)現(xiàn)。
隊(duì)頭指針進(jìn)1:front-(front+1)%maxSize\
隊(duì)尾指針進(jìn)1:real'=(rear+1)%maxSize;
隊(duì)列初始化:front=rear=0:
隊(duì)空條件:front==rear,
隊(duì)滿條件:{rear+1)%maxSize==front
循環(huán)隊(duì)列的進(jìn)隊(duì)和出隊(duì):
優(yōu)先級(jí)隊(duì)列:是不一樣于先進(jìn)先出隊(duì)列的另一-種隊(duì)列。每次從隊(duì)列中取出的是具有最
高優(yōu)先權(quán)的元素
2.4串
字符串是非數(shù)值處理應(yīng)用中重要的處理對象。字符串是由某字符集上的字符所構(gòu)成
的任何有限字符序列。
當(dāng)一種字符串不包括任何字符時(shí),稱它為空字符自。一?種字符串所包括的有效字符
個(gè)數(shù)稱為這個(gè)字符串的長度。一種字符串中任一持續(xù)的子序列稱為該字符串的子串。包
括子串的字符串對應(yīng)稱為主串。一般稱該字符在序列中的序號(hào)為該字符在串中的位置。
字符串的串值必須用單引號(hào)括,'C&C3…Cn起來,但單引號(hào)自身不屬于串,它的作
用是為了防止于變量名和數(shù)的常量混淆。在C語言中,字符串常量是用一對雙引號(hào)括住
若干字符來表達(dá),如“Iamastudent"
字符串一般存于字符數(shù)組中,每個(gè)字符串最終一種有效字符后跟一種字符串結(jié)束符
“\0”.系統(tǒng)提供的庫函數(shù)形成的字符串會(huì)自動(dòng)加結(jié)束符號(hào),而顧客的應(yīng)用程序中形成
的字符串必須由程序自行負(fù)責(zé)添加字符串結(jié)束符號(hào)。
兩個(gè)串相等當(dāng)且僅當(dāng)兩個(gè)串的值相等,長度相等并且各個(gè)對應(yīng)位置的字符都相等。
常用的字符串的基本操作有7種。
ASSING(s,t)和CREAT(s,ss)賦值操作
EQUAL(s,t)判等函數(shù)
LENGTH(s)求長度函數(shù)
CONCAT(s,t)聯(lián)接函數(shù)
SUBSTR(s,start,len)求子串函數(shù)
INDEX(s,t)定位函數(shù)
REPLACE(s,t,v)置換函數(shù)
INSERT(s,pos,t)插入函數(shù)
DELETE(s,pos,t)刪除函數(shù)
(1)求字符串長,intstrlen(chars)
(2)串復(fù)制(copy)
char*strcpy(charto,charfrom);
該函數(shù)將串from復(fù)制到串to中,并且返回一種指向串to的開始處的指針。
(3)聯(lián)接(concatenation)
charstrcat(charto,charfrom)
該函數(shù)將串from復(fù)制到串to的末尾,并且返回一種指向串to的開始處的指針。
(4)串比較(compare)
intstrcmp(chars1,chars2);
該函數(shù)比較串si和串s2的大小,當(dāng)返回值不不小于0,等于0或不小于0時(shí)分別
表達(dá)sl<s2或sl=s2或sl>s2
例如:result:strcmp("baker","Bakerw)result>0
result=strcmp(“12","12");result=0
result=strcmp(“Joe”Joseph");result<0
(5)字符定位(index)
charstrehr(chars,charc);
該函數(shù)是找c在字符串中第一次出現(xiàn)的位置,若找到則返回該位置,否則返回NULL。
字符串的靜態(tài)存儲(chǔ):次序存儲(chǔ)、用一組地址持續(xù)的地址單元存儲(chǔ)率的字符序列,尤其是
在PASCAL程序語言中還可以采用緊縮數(shù)組來實(shí)現(xiàn)。
字符串的動(dòng)態(tài)存儲(chǔ):采用鏈表的方式存儲(chǔ)字符串,節(jié)點(diǎn)的大小可以不一樣,即每個(gè)節(jié)點(diǎn)
可以寄存的字符數(shù)是不一樣的。對于節(jié)點(diǎn)大小不小于1的鏈表,需要設(shè)置頭指針和尾指
針來定位和串連接。
存儲(chǔ)密度:串值所站的存儲(chǔ)位/實(shí)際分派的存儲(chǔ)位
實(shí)際應(yīng)用的串處理系統(tǒng)中采用的是動(dòng)態(tài)存儲(chǔ)構(gòu)造,每個(gè)串的值各自存儲(chǔ)在一組地址
持續(xù)的存儲(chǔ)單元中,存儲(chǔ)地址布程序執(zhí)行過程中動(dòng)態(tài)分派。運(yùn)用串名和串值之間的的對
應(yīng)關(guān)系來建立存儲(chǔ)吠象來訪問串。
2.5數(shù)組
數(shù)組是最常用的數(shù)據(jù)構(gòu)造之一,在程序中,數(shù)組常用來實(shí)現(xiàn)次序存儲(chǔ)的線性表。數(shù)
組由固定個(gè)數(shù)的元素構(gòu)成,所有元素的類型相似,元素依次次序存儲(chǔ)。每個(gè)元素對應(yīng)一
種下標(biāo),數(shù)組元素按數(shù)組名和元素的下標(biāo)引用,引用數(shù)組元素的下標(biāo)個(gè)數(shù)稱為數(shù)組的維
數(shù)。
在C語言中,n個(gè)元素的數(shù)組中,第一種元素的下標(biāo)為0,最終一種的下標(biāo)為nT;
數(shù)組可以分為一維、二維……N維數(shù)組,取決于引用數(shù)組元素的下標(biāo)的個(gè)數(shù);
一維數(shù)組:
O____12345678____9
?[35廠27I4廠]18I石(J廠%I77I8丁丁”廠I(J21
IIIIll\lll
l?W+4Ti-
二維數(shù)組和三維數(shù)組:
數(shù)組可以分為靜態(tài)數(shù)組和動(dòng)態(tài)數(shù)組兩類,所謂靜態(tài)就是指數(shù)組的空間存儲(chǔ)分派是在
使用之前還是在程序運(yùn)行當(dāng)中分派,靜態(tài)數(shù)組就是在定義時(shí)必須進(jìn)行空間分派,也就是
固定數(shù)組的大小,這樣就不利于數(shù)組的擴(kuò)展。同樣動(dòng)態(tài)數(shù)組就是在程序運(yùn)行過程中進(jìn)行
數(shù)組的賦值或者是空間的分派,動(dòng)態(tài)數(shù)組一般采用鏈表的存儲(chǔ)構(gòu)造,而靜態(tài)數(shù)組一般采
用次序存儲(chǔ)構(gòu)造。
數(shù)組元素可以是任何類型的,當(dāng)元素白身又是數(shù)紐時(shí),就構(gòu)成多維數(shù)組。多維數(shù)組
是一維數(shù)組的推廣,多維數(shù)組中最常用的是二維數(shù)組c多維數(shù)組的所有元素并未排在一
種線性序列里.,要次序存儲(chǔ)多維數(shù)組按需要按一定次序把所有的數(shù)組元素排在一種線性
序列里,常用的排列次序有行優(yōu)先次序和列優(yōu)先次序.對于多維數(shù)組,C語言按行優(yōu)先
次序寄存。
對于數(shù)組,一般只有兩種操作:
?給定一種下標(biāo),存取對應(yīng)的數(shù)據(jù)元素
?給定一組下標(biāo),修改對應(yīng)數(shù)據(jù)元素的某一種或兒種數(shù)據(jù)項(xiàng)的值。
一般用多維數(shù)組表達(dá)矩隴,詳細(xì)有如下幾種類型:
對稱矩陣:A[i,j]==A[j,i]
三角矩陣:以主對角線劃分,三角矩陣有上三角和下三角兩種。
上三角矩陣中,它的下三角(不包括主對角線)中的元素均為常數(shù)。下三角矩陣恰好相
反,它的主對角線上方均為常數(shù),在大多數(shù)狀況下,三角矩陣常數(shù)為零。
三角矩陣可壓縮存儲(chǔ)到向量sa[0..n(n+l)/2]中,sa[k]和aij的對應(yīng)關(guān)系是:
fi(2n-i+l)/2+j-i當(dāng)iMj時(shí)
k=|n(n4-1)/2當(dāng)1>」時(shí)
3、對角矩陣
對角矩陣中,所有的非零元素集中在以主對角線為了中心的帶狀區(qū)域中,即除
了土對角線和主對角線相鄰兩側(cè)的若干條對角線上的元素之外,其他元素皆為零。
當(dāng)時(shí),元素二0。
LOC(i,j)=L0C(0,0)+[3*i-l+(j-i+1)]=L0C(0,0)+(2i+j)
4.稀疏矩陣
簡樸說,設(shè)矩陣A中有s個(gè)非零元素,若s遠(yuǎn)遠(yuǎn)不不小于矩陣元素的總數(shù)(即s^mXn),
并且分布沒有一定規(guī)律。用次序存儲(chǔ)構(gòu)造的三元組對稀疏矩陣進(jìn)行存儲(chǔ),分別記錄行、
列和值
彳r5J
|<>|o322
111oG1與
|2|111
11-7
23<?
3手
|C|<>?>1
§2
0000910
0110000<<,<>/>
轉(zhuǎn)置矩陣
0000028l<>1<>
111111
220?6000|2|N2K
000000|3|322
川3
01703900
1^1不1~7
1500000IEr
|7|61<?
十字鏈表:
由于非零元的位置和個(gè)數(shù)變化,因此用鏈表存儲(chǔ)更恰當(dāng);在這種狀況下采用十字鏈
表來表達(dá),每個(gè)非零元用一種節(jié)點(diǎn)表達(dá),節(jié)點(diǎn)中有行、列尚有向下的域和線右的域;
此外還需要一種指向列鏈表的表頭節(jié)點(diǎn)和指向行鏈表的表頭節(jié)點(diǎn)。還可以設(shè)置i種指向
整個(gè)十字鏈表的表頭節(jié)點(diǎn)。還可以把列表頭和行表頭節(jié)點(diǎn)構(gòu)成數(shù)組,便于操作;
多種廣義表達(dá)意圖
2.6樹
2.6.1概述
樹型構(gòu)造是一類重要的非線性數(shù)據(jù)構(gòu)造。其中以樹和二叉樹最為常用,直觀看來,樹是
以分支關(guān)系定義的層次構(gòu)造。
樹是由一種或多種結(jié)點(diǎn)構(gòu)成的有限集7\它滿足如下兩個(gè)條件:
I.有一種特定的結(jié)點(diǎn),成為根結(jié)點(diǎn)
II.其他的結(jié)點(diǎn)提成/〃(加>=0)個(gè)互不相交的有限集以刀,…,北大其中每個(gè)集合又
都是一棵樹,稱T。,刀,…,北”為根結(jié)點(diǎn)的子樹。
這里可以看出樹的定義是遞歸的,即一棵樹由子樹構(gòu)成,子樹又由更小的子樹構(gòu)成。一
種結(jié)點(diǎn)的子樹數(shù)目,稱為結(jié)點(diǎn)的度。樹中各結(jié)點(diǎn)的度的最大值則稱為樹的度。樹中結(jié)點(diǎn)
的最大層次稱為樹的深度。
假如將樹中結(jié)點(diǎn)的各子樹當(dāng)作從左到右是有次序的(即不能互換),則稱該樹為有序樹,
否則為無序樹。森林是m(m>=0)棵互不相交的樹的集合。
存儲(chǔ)構(gòu)造
樹是非線性的構(gòu)造,不能簡樸地用結(jié)點(diǎn)的線性衣來表達(dá)。樹有多種形式地存儲(chǔ)構(gòu)造,最
常用的是原則存儲(chǔ)形式和帶逆存儲(chǔ)形式。在樹的原則存儲(chǔ)構(gòu)造中,樹中的結(jié)點(diǎn)可提成兩
部分:結(jié)點(diǎn)的數(shù)據(jù)和指向子結(jié)點(diǎn)的指針。當(dāng)程序需從結(jié)點(diǎn)返回到其父結(jié)點(diǎn)時(shí),需要在樹
的結(jié)點(diǎn)中存儲(chǔ)其父結(jié)點(diǎn)的位置信息,這種存儲(chǔ)形式就是帶逆存儲(chǔ)構(gòu)造。
詳細(xì)使用的鏈表構(gòu)造有:
?雙親表達(dá)法:運(yùn)用每個(gè)節(jié)點(diǎn)只有一種雙親的特點(diǎn);求節(jié)點(diǎn)的孩子時(shí)要遍歷整個(gè)
向帚
?孩子表達(dá)法:把每個(gè)節(jié)點(diǎn)的孩子都排列起來,一單鏈表存儲(chǔ),則n個(gè)節(jié)點(diǎn)有n
個(gè)孩子鏈表,而n個(gè)頭指針又構(gòu)成了一種線性表。
?孩子兄弟表達(dá)法(又稱二叉樹表達(dá)法,或二叉鏈表表達(dá)法):節(jié)點(diǎn)兩個(gè)指針分
別指向該節(jié)點(diǎn)的第一種孩子和下一種兄弟節(jié)點(diǎn)。
樹的遍歷
在應(yīng)用樹構(gòu)造時(shí),常規(guī)定按某種次序獲得樹中所有結(jié)點(diǎn)的信息、,這可通過樹
的遍歷操作來實(shí)現(xiàn)。常用的樹的遍歷措施有:
樹的前序遍歷:首先訪問根結(jié)點(diǎn),然后從左到右遍歷根結(jié)點(diǎn)的各棵子樹。
樹的后序遍歷:首先從左到右按后序遍歷根結(jié)點(diǎn)的各棵子樹,然后訪問根結(jié)
點(diǎn)。
樹的層次遍歷:首先訪問處在0層上的根結(jié)點(diǎn),然后從左到右依次訪問處在
1層、2層……上的結(jié)點(diǎn),即自上而下從左到右逐層訪問樹各層上
的結(jié)點(diǎn)。
2.6.2二叉樹
概述
與一般的樹的構(gòu)造比較,二叉樹在構(gòu)造上更規(guī)范和更有確定性,應(yīng)用也比樹更為廣
泛。
二叉樹的特點(diǎn)是每個(gè)結(jié)點(diǎn)至多只有二棵子樹(即二叉樹中不存在度不小于2的結(jié)點(diǎn)),
并且,二叉樹的子樹有左右之分,另一方面序不能任意顛倒。二叉樹與樹不一樣的地方
在于,首先一叉樹可認(rèn)為空,空的一叉樹沒有結(jié)點(diǎn);比外,在一叉樹中,結(jié)點(diǎn)的子樹是
有序的,分左右兩棵子二叉樹。
二叉樹采用類似樹的原則存儲(chǔ)形式來存儲(chǔ)。
二叉樹的性質(zhì):
二叉樹具有下列重要特性。
?在二叉樹的第i層至多有個(gè)結(jié)點(diǎn)(i>=1)o
?深度為k的二叉樹至多有22-1個(gè)結(jié)點(diǎn)(k>=Do
?對任何一棵二叉樹T,假如其終端結(jié)點(diǎn)數(shù)為no,度為2的結(jié)點(diǎn)數(shù)為n2,則nO=n2+l.
?具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為U°g2〃」+L
二叉樹的遍歷
樹的所有遍歷措施都合用于二叉樹,常用的二叉樹遍歷措施有3種。
#include<stdio.h>
#include<stdlib.h>
^defineNULL0
Typedefstructnode(
chardata;
structnode*lchild,*rchild;
}TREENODE;
TREENODE*root;
前序遍歷:
?訪問根結(jié)點(diǎn),
?按前序遍歷根結(jié)點(diǎn)的左子樹,
?按前序遍歷根結(jié)點(diǎn)的右子樹。
中序遍歷:
?按中序遍歷根結(jié)點(diǎn)的左子樹,
?訪問根結(jié)點(diǎn),
?按中序遍歷根結(jié)點(diǎn)的右子樹。
中序遍歷算
法:
Voidinorder(TREENODE*p)
(
if(p!=NULL)
{inorder(p->lchild);
printf(a%cw,p->data)
inorder(p->rchild);
)
)
后序遍歷:
?按后序遍歷根結(jié)點(diǎn)的左子樹,
?按后序遍歷根結(jié)點(diǎn)的右子樹,
?訪問根結(jié)點(diǎn)。
以上3種遍歷措施都是遞歸定義的。
哈夫曼及其應(yīng)用:又稱為最優(yōu)樹,是一類帶權(quán)途徑長度最短的樹
途徑長度:從樹中一種干點(diǎn)到另一種節(jié)點(diǎn)之間的分支構(gòu)成的這兩個(gè)節(jié)點(diǎn)之間的途徑,途
徑上的分支樹木就稱為途徑長度;
樹的途徑長度:從樹根到每一節(jié)點(diǎn)的途徑長度之和;
樹的帶權(quán)途徑長度:樹中所有葉子節(jié)點(diǎn)的帶權(quán)途徑長度之和;
哈夫曼樹就是一棵n個(gè)P-子節(jié)點(diǎn)的二義樹,所有葉子節(jié)點(diǎn)的帶權(quán)之和最小。
算法描述:
給定n個(gè)節(jié)點(diǎn)的集合,每個(gè)節(jié)點(diǎn)都帶權(quán)值;
選兩個(gè)權(quán)值最小的節(jié)點(diǎn)構(gòu)造一棵新的二叉樹,新二叉樹的根節(jié)點(diǎn)的權(quán)值就是兩個(gè)子節(jié)點(diǎn)
權(quán)值之和;
從n個(gè)節(jié)點(diǎn)中刪除剛剛使用的兩個(gè)節(jié)點(diǎn),同步將新產(chǎn)生的二叉樹根節(jié)點(diǎn)放在節(jié)點(diǎn)集合中。
反復(fù)2,3步,懂得只有一棵樹為止。
I*'t<7><5><2><4>I**t<7><5><6>
田田田卬ELJ(D看\
<n)初始
<?>>令用{2〉<4>
<<l><111
例題:己知節(jié)點(diǎn)的前序序列和中序序列分別為:
前序序列:ABCDEFG
中序序列:CBEDAFG
求出整個(gè)一叉樹,以及構(gòu)造過程
2.7圖
基本概念:
圖是一種較線性表和樹更為復(fù)雜的數(shù)據(jù)構(gòu)造。在圖形構(gòu)造中,結(jié)點(diǎn)之間的關(guān)系可以是任
意的,圖中任意兩個(gè)數(shù)據(jù)元素之間都也許有關(guān)。
一種圖G由非空有限的頂點(diǎn)集合V和有限的邊的集合E構(gòu)成,記為G=(V,E)。圖一般
分為兩種類型。
無向圖
無向圖的邊是頂點(diǎn)的無序偶,用(i,j)來表達(dá)頂點(diǎn)i和j之間的邊。
有向圖
有向圖的邊是頂點(diǎn)的有序偶,有向圖的邊也成為弧,用<i,j〉來表達(dá)頂點(diǎn)i和j之間的
弧。
其中,有2條邊的無向圖稱為完全圖,而具有n(n-l)條弧的有向圖成為有向完全
圖。
有時(shí)圖的邊或弧具有與它有關(guān)的樹,這種與圖的邊或弧有關(guān)的數(shù)稱作權(quán)。帶權(quán)圖也簡稱
為網(wǎng)。
假如同為無向圖或同為有向圖的兩個(gè)圖Gl=(V.,Ei)和G2=(V2,E2)滿足
V.CV.E二GEI則稱圖G2是圖
G1的子圖。
頂點(diǎn)的度就是指和頂點(diǎn)有關(guān)聯(lián)的邊的數(shù)目。在有向圖中,以頂點(diǎn)v為頭的弧的數(shù)據(jù)成為
v的入度;以v為尾的弧成為v的出度。這里有一種重要的公式反應(yīng)了頂點(diǎn)和邊的關(guān)系。
1?
其中,e表達(dá)邊的數(shù)目,n表達(dá)頂點(diǎn)個(gè)數(shù),TD(Vi)表達(dá)頂點(diǎn)明的度。
在圖G=(V,E)中,假如存在頂點(diǎn)序列(vo,V),???,v。,其中Vo=p,vk=q,
且(vo,V)),(vi,v2)—>(Vk-i,vk)都在E中,則稱頂點(diǎn)p到頂點(diǎn)q有一條途
徑,并用(V。,v?Vk)表達(dá)這條途徑,途徑的長度就是途徑上的邊或弧的數(shù)目,
這條途徑的長度為k。假如第一種頂點(diǎn)和最終一種頂點(diǎn)相似的途徑稱為回路或
環(huán)。序列中頂點(diǎn)不反復(fù)出現(xiàn)的途徑稱為簡樸途徑。
對無向圖而言,假如從任意兩個(gè)不一樣頂點(diǎn)i和j之間均有途徑,則該無向圖是連
通的。無向圖中的極大連通子圖為該圖的連通分量。
對有向圖而言,假如任意兩個(gè)不一樣頂點(diǎn)i到j(luò)有途經(jīng),同步j(luò)到i也有途徑,則該有
向圖是強(qiáng)連通的。同樣,無向圖中的極大連通強(qiáng)子圖為該圖的強(qiáng)連通分量。
存儲(chǔ)構(gòu)造:最常用的存儲(chǔ)構(gòu)造是有兩種。
鄰接矩陣:
這是反應(yīng)頂點(diǎn)間鄰接關(guān)系的矩陣。定義如下:
設(shè)6=(V,E)是具有n(n21)個(gè)頂點(diǎn)的圖,G的鄰接矩陣M是一種n行n列的矩陣,
若(i,j)或<i,j>£E,5WM[i][j]=l;否則M[i][j]=O°
鄰接表:這是圖的鏈?zhǔn)酱鎯?chǔ)構(gòu)造。
圖的每個(gè)頂點(diǎn)都建立了一種鏈表,且第i個(gè)鏈表口的結(jié)點(diǎn)代表與頂點(diǎn)i有關(guān)聯(lián)的一
條邊或由頂點(diǎn)i出發(fā)的一條弧。而這些鏈表的頭指針則構(gòu)成一種次序線性表。
此外,尚有其他的某些存儲(chǔ)構(gòu)造,如十字鏈表和鄰接多重表,分別用來存儲(chǔ)有向圖和無
向圖。
圖的遍歷:
圖的遍歷是指從圖中的某個(gè)頂點(diǎn)出發(fā),沿著圖中的邊或弧訪問圖中的每個(gè)頂點(diǎn),并
且每個(gè)頂點(diǎn)只被訪問一次。圖的遍歷算法是求解圖的連通性問題、拓?fù)渑判蚝颓箨P(guān)鍵途
徑等算法的基礎(chǔ)。
一般有兩種措施,它們對無向圖和有向圖都合用。
深度優(yōu)先搜索:
類似于樹的先根遍歷。
廣度優(yōu)先搜索:
類似于樹的層次遍歷。
這兩種算法的時(shí)間復(fù)雜度相似,不一樣之處僅僅在于對頂點(diǎn)訪問的次序不一樣。
■圖的有關(guān)算法
波及到圖的有關(guān)算法比較多,這里只簡樸歸納簡介一下,詳細(xì)算法但愿大家參照有關(guān)
資料。
?求最小代價(jià)生成樹
設(shè)G=(V,E)是一種連通的無向圖,若Gi是包括G中所有頂點(diǎn)的一種無回路的連通子圖,
則稱Gi為G的一棵生成樹。其中代價(jià)最小(各條邊的權(quán)值之和最小)的生成樹就稱為最小
代價(jià)牛.成樹(簡稱最小生成樹)。
這里提供兩種算法來求解這一問題:普里姆(Prim)算法和克魯斯卡爾(Kruskal)算法。
分別合用于求邊稠密的網(wǎng)的最小生成樹和邊稀疏的網(wǎng)的最小生成樹,其時(shí)間復(fù)雜度分別是
0(/)和O(eloge)(e為網(wǎng)中邊的數(shù)目)。
其中prim算法基本思想:任選一種頂點(diǎn)V。開始,連接與v。近來的頂點(diǎn)力,得子樹
T.,再連接與「近來的頂點(diǎn)V2,得子樹%,如此進(jìn)行下去,直到所有頂點(diǎn)都用到為止。
L(v):v到子樹T。的直接距離。E是邊集合。
輸入加權(quán)連通圖的帶權(quán)鄰接矩陣C=(CG的.
(1)To?空集,C(To)<-0,Vi={v0}
(2)對每一點(diǎn)v屬于V-Vi,L(v)<-C(v,Vo);[假如(v,Vo)不屬于E,則C(v,%)=無
窮大]
(3)若%=V,則輸出T。,C(To),停機(jī)°否則轉(zhuǎn)到下一步;
(4)在V-%中找一點(diǎn)u,使L(炎=min{L(v)|v屬于(V-%)},并記在%中與u相鄰的點(diǎn)
為w,e=(w,u)
⑸To<-T0U,C(L)<-C(To)+C(e),%T】U{〃)
(6)對所有的v屬于V-%,若C(v,u)〈L(v),則L(v)<-C(v,u),否則L(v)不
變。
⑺轉(zhuǎn)3
克魯斯卡爾(Kruskal)算法基本思想:最初把圖的n個(gè)頂點(diǎn)看作n個(gè)分離的部分樹,
每個(gè)樹具有一種頂點(diǎn),算法的每一步選擇可連接兩分離樹的邊中權(quán)最小的邊連接兩個(gè)部
分樹,合二為一,部分樹逐漸減少,直到只有一種部分樹,便得到最小生成樹。
克魯斯卡爾(Kruskal)算法環(huán)節(jié):
T。:寄存生成樹的邊的集合,初態(tài)為空;
C(To):最小生成樹的權(quán),初值為0:
VS:部分樹的頂點(diǎn)集合,其初值為{{v0}{v.}……{V.)}
輸入邊的端點(diǎn)數(shù)組A(e),邊的權(quán)值w(e);
(1)T。為空,C(T0)<-O;VS為空,將E中的邊按從小到大的次序排列成隊(duì)列Q;
(2)對所有的v屬于V,VS<-{v};
(3)若|VS|=1,輸出To,C(T。),停止,否則轉(zhuǎn)下一步;
(4)從Q中取出排頭邊(u,v),并從Q中刪除(u,v);
(5)如u,v雜VS的同一種元素集V,中,則轉(zhuǎn)4,否則分屬于兩個(gè)幾種1丫2,
進(jìn)行下一步;
(6)T0<-T。U{(〃,")},v<-ViUy2>C(L)<-C(To)+C(u,v),轉(zhuǎn)3
?求最短途徑
在圖中求最短途徑問題有兩種提法,一是求從某個(gè)源點(diǎn)到其他頂點(diǎn)的最短途徑,二是求每一對
頂點(diǎn)之間的最短途徑■>
對于前者,一般采用迪杰斯特拉(Dijkstra)算法,按途徑長度遞增的次序產(chǎn)生最短途徑。時(shí)
間復(fù)雜度為0(/)。
迪杰斯特拉(Dijkstra)算法的基本思想:生長一棵以V。為根的最短路樹,在這棵樹上
每一頂點(diǎn)與根之間的途徑都是最短途徑。由于網(wǎng)絡(luò)不存在負(fù)權(quán),最短路樹的生長過程中
各頂點(diǎn)將按照距V。的遠(yuǎn)近及頂點(diǎn)的相鄰關(guān)系,逐次長入樹中,先近后遠(yuǎn),直至所有頂點(diǎn)
都已經(jīng)在樹中。
處理背面一種問題的措施是:每次以一種頂點(diǎn)為源點(diǎn),反復(fù)執(zhí)行迪杰斯特拉算法n次。
此外還可以使用一種弗洛伊德(Floyd)算法,其時(shí)叵復(fù)雜度也是0(n,
弗洛伊德(Floyd)算法基本思想:直接在圖的帶權(quán)鄰接矩陣中用插入頂點(diǎn)的措施依次
構(gòu)造出n個(gè)矩陣,口”刀,2,..。句,使最終得到的矩陣。<"成為圖的距離矩陣,同步也求出
插入點(diǎn)矩陣以便得到兩點(diǎn)見的最短途徑。
?拓?fù)渑判?/p>
拓?fù)渑判虻乃惴ㄔ韺?shí)后很簡樸。
I.在有向圖中選i種沒芍前驅(qū)的頂點(diǎn)且輸出之
II.從圖中刪除該頂點(diǎn)和所有以它為尾的弧
反復(fù)執(zhí)行以上兩步,直至所有頂點(diǎn)均已輸出,或者目前圖中不存在無前驅(qū)的頂點(diǎn)為
止。后一種狀況則闡明有向圖中存在環(huán)。
?求關(guān)鍵途徑
在AOE網(wǎng)絡(luò)中的某些活動(dòng)可以并行的進(jìn)行,因此完畢工程的至少時(shí)間是從開始頂點(diǎn)到
結(jié)束頂點(diǎn)的最長途徑K度,稱從開始頂點(diǎn)到結(jié)束頂點(diǎn)的最K途徑為關(guān)鍵途徑,關(guān)鍵途徑
上的活動(dòng)即為關(guān)鍵活動(dòng)。
3.數(shù)據(jù)構(gòu)造有關(guān)算法
3.1排序算法
基本概念
排序(Sorting)是計(jì)算機(jī)程序設(shè)計(jì)中的一種重要操作,其功能是對一種數(shù)據(jù)元素集合
或序列重新排列成一種按數(shù)據(jù)元素某個(gè)項(xiàng)值有序的序列。作為排序根據(jù)的數(shù)據(jù)項(xiàng)稱為
“排序碼”,也即數(shù)據(jù)元素的關(guān)鍵碼。為了便于查找,一般但愿計(jì)算機(jī)中的數(shù)據(jù)表是按
關(guān)鍵碼有序的。如有序表的折半查找,查找效率較高。尚有,二叉排序樹、B-樹和B+
樹的構(gòu)造過程就是一種排序過程。若關(guān)鍵碼是主關(guān)鍵碼,則對于任意待排序序列,經(jīng)排
序后得到的成果是唯一的;若關(guān)鍵碼是次關(guān)鍵碼,排序成果也許不唯一,這是由于具有
相似關(guān)鍵碼的數(shù)據(jù)元素,這些元素在排序成果中,它們之間的的位置關(guān)系與排序前不能
保持。
若對任意的數(shù)據(jù)元素序列,使用某個(gè)排序措施,對它按關(guān)鍵碼進(jìn)行排序:若相似關(guān)
鍵碼元素間的位置關(guān)系,排序前與排序后保持一致,稱此排序措施是穩(wěn)定的;而不能保
持一致的排序措施則稱為不穩(wěn)定的。
排序分為兩類:內(nèi)排序和外排序。
內(nèi)排序:指待排序列完全寄存在內(nèi)存中所進(jìn)行的排序過程,適合不太大的元素序列。
外排序:指排序過程中還需訪問外存儲(chǔ)器,足夠大的元素序列,因不能完全放入內(nèi)存,
只能使用外排序。
對于有n個(gè)結(jié)點(diǎn)的線性表(cO,el,en-1),將結(jié)點(diǎn)中某些數(shù)據(jù)項(xiàng)的值按遞增
或遞減的次序,重新排列線性表結(jié)點(diǎn)的過程,稱為排序。排序時(shí)參照的數(shù)據(jù)項(xiàng)稱為排序
碼,?般選擇結(jié)點(diǎn)的鍵值作為排序碼。
若線性表中排序碼相等的結(jié)點(diǎn)經(jīng)某種排序措施進(jìn)行排序后,仍能保持它們在排序之前的
相對次序,稱這種排序措施是穩(wěn)定的;否則,稱這種排序措施是不穩(wěn)定的。
在排序過程中,線性表的所有結(jié)點(diǎn)都在內(nèi)存,并在內(nèi)存中調(diào)整它們在線性表中的存儲(chǔ)次
序,稱為內(nèi)排序。在排序過程中,線性表只有部分結(jié)點(diǎn)被調(diào)入內(nèi)存,并借助內(nèi)存調(diào)整結(jié)
點(diǎn)在外存中的寄存次序的排序措施成為外排序。
下面通過一種表格簡樸簡介幾種常見的內(nèi)排序措施,以及比較一下它們之間的性能特
點(diǎn)。
排序措施簡介平均時(shí)最壞狀輔助存與否穩(wěn)
間況儲(chǔ)定
反復(fù)從尚未排好序的那部分線
性表中選出鍵值最小的結(jié)點(diǎn),并
按從線性表中選出的次序排列
選擇
結(jié)點(diǎn),重料構(gòu)成線性表。直至未0(吟。(爐)0(1)不穩(wěn)定
排序
排序的那部分為空,則重新形成
的線性表是一種有序的線性表。
(單項(xiàng)選擇擇排序)
假設(shè)線性表的前面I個(gè)結(jié)點(diǎn)序列
eO,el,…,el-1是已排序的。對
簡結(jié)點(diǎn)在這有序結(jié)點(diǎn)ei序列中找插
直接
樸入位置,并將ei插入,而使i+1
插入0(吟0(*0(1)穩(wěn)定
排個(gè)結(jié)點(diǎn)序列eO,el,…,ei也變
排序
序成排序的。依次對i=l>2,…,
n-1分別執(zhí)行這樣的播入環(huán)節(jié),最
然眼照榭姍序。
對目前尚未排好序的范圍內(nèi)的
所有結(jié)點(diǎn),自上而下對相鄰的兩
個(gè)結(jié)點(diǎn)依次進(jìn)行比較和調(diào)整,讓
冒泡
鍵值大的結(jié)點(diǎn)往下沉,鍵值小的0(*0(*0(1)穩(wěn)定
排序
結(jié)點(diǎn)往上冒。即,每當(dāng)兩相鄰比
較后發(fā)現(xiàn)它們的排列次序與排
序規(guī)定相反時(shí),就將它們互換。
對直接才由入排序一種改善,又稱
“縮小增量排序”。為1有整個(gè)副F
序列分割成為若干子序列分別進(jìn)
行直接插入排序,待整個(gè)序列中的
希爾排序knInnO(logn)不穩(wěn)定
記錄“基本有序”時(shí),再對全體記。(*
錄進(jìn)行一次直接插入排序。,假如
待排序記錄序列為“正序”時(shí),復(fù)
雜度可至肱O(n)
對冒泡排序的一種木質(zhì)的改善。通
過使副F序序列的長
度能大幅度的減少。在一趟掃視
后,使某個(gè)結(jié)點(diǎn)移到中間的對的位
置,并便在它左邊序列的結(jié)點(diǎn)的鍵
值都比它的小,而它右邊序列的結(jié)
點(diǎn)的鍵值都不比它的小。稱這樣一
迅速排序O(nlogn)0(*O(logn)不穩(wěn)定
冽個(gè)財(cái)“劃分”。每彼吩(吏一
利張序列變成兩個(gè)新的較小子序
列,對這兩個(gè)小的子序列分別作同
樣的劃分,直至新的子序列的長度
為1使才不再劃分。當(dāng)所有子序列
長度都為1時(shí),序列已是排好序的
了。
一種樹形選擇排序,是對直接
堆排序(有兩選擇排序的有效改善。一種堆
種狀況:堆頂是這樣一棵次序存儲(chǔ)的二叉
元素是最大樹,它的所有父結(jié)點(diǎn)(e[ij)O(nlogn)O(nlogn)0(1)不穩(wěn)定
值和堆頂元的鍵值均不不不小于它的左
素是最小值)子結(jié)點(diǎn)(e[2*i+l])和右子結(jié)
點(diǎn)(e[2*i+2])的鍵值。初始
時(shí),若把待排序序列的n個(gè)結(jié)
點(diǎn)看作是一棵次序存儲(chǔ)的二
叉樹;調(diào)整它們的存儲(chǔ)次序,
使之成為一種堆,這時(shí)堆的根
結(jié)點(diǎn)鍵值是最大者。然后將根
結(jié)點(diǎn)與堆的最終一種結(jié)點(diǎn)互換,
并對少了一種結(jié)點(diǎn)后的n-1結(jié)點(diǎn)
重新作調(diào)整,使之再次成為堆。
這樣,在根結(jié)點(diǎn)得到結(jié)點(diǎn)序列鍵
值次最大值。依次類推,直到只
有兩個(gè)結(jié)點(diǎn)的堆,并對它們作互
換,最終得到有序的n個(gè)結(jié)點(diǎn)序
歹1」。
將兩個(gè)或兩個(gè)以上的有序子表
合并成一種新的有序表。對于兩
個(gè)有序子表合并一種有序表的
兩路合并排序來說,初始時(shí),把
含n個(gè)結(jié)點(diǎn)的待排序序列看作有
歸并排序O(nlogn)O(nlogn)O(n)稔定
n個(gè)長度都為1的有序子表所構(gòu)
成,將它們依次兩兩合并得到長
度為2的若干有序子表,再對它
們作兩兩合并……直到得到長
度為n的有序表,排序即告完畢。
背面根據(jù)多手?排序算法,給出了C語言的實(shí)現(xiàn),大家在復(fù)習(xí)的時(shí)候可以做下參照。
?選擇排序
voidss_sort(inte[l,intn)
{inti,j,k,t;
for(i=0;i<n-1;i++)(
for(k=i,j=i+1;j<n;j++)
if(e[k]>e[j])k=j;
if(k!=i){
t=e[il;e[i]=e[k];e[k]=t;
}
)
?直接插入排序
voidsi_sort(inte[J.intn)
{inli,j,t;
for(i=0;i<n;i++){
for(t=e[i],j=i-l;j>=O&&t<e[j];j-)
e[j+l]=e[j];
c[j+1]=t;
)
)
?冒泡排序
voidsb_sort(inte[],intn)
{intj,p,h
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車工高級(jí)工考試題及答案
- 中藥學(xué)解剖學(xué)試題及答案
- 浪漫的英文詩詞
- 1-3單元英語語音題目及答案
- 心肌梗塞病人的家庭護(hù)理
- 腸道微生物代謝產(chǎn)物與IBD癌變的相關(guān)性
- 衛(wèi)生執(zhí)法美容院管理制度
- 衛(wèi)生院犬傷門診工作制度
- 衛(wèi)生院防火安全管理制度
- 衛(wèi)生保潔防疫制度
- 學(xué)校教師情緒管理能力提升
- 2026年中國郵政儲(chǔ)蓄銀行招聘試題含答案
- 2025年度電氣工程師述職報(bào)告
- 檔案館機(jī)房設(shè)施設(shè)備管理制度
- 2025年中國抑郁障礙防治指南
- 2024年輕工行業(yè)經(jīng)濟(jì)運(yùn)行報(bào)告
- 電解銅銷售合同范本
- FGR的基因檢測策略與臨床解讀
- 建筑施工工地安全隱患排查清單
- 電力工程安全培訓(xùn)課件
- 中糧貿(mào)易錄用通知書
評(píng)論
0/150
提交評(píng)論