《大话数据结构》参考
參考:數(shù)據(jù)結(jié)構(gòu)與算法系列?https://mp.csdn.net/postlist/list/all?undefined=all&cate=8660447
【筆記】《大話數(shù)據(jù)結(jié)構(gòu)》https://blog.csdn.net/jianbinzheng/article/details/79858736
寫(xiě)在前面
第1章 數(shù)據(jù)結(jié)構(gòu)緒論
第2章 算法
第3章 線性表
第4章 棧與隊(duì)列
第5章 串
第6章 樹(shù)
第7章 圖
第8章 查找
第9章 排序
寫(xiě)在前面
快速的過(guò)了一遍,對(duì)于初學(xué)者來(lái)說(shuō)講的很細(xì),很有助于理解;對(duì)于有一定基礎(chǔ)的人可能會(huì)覺(jué)得敘述太墨跡。。。
第1章 數(shù)據(jù)結(jié)構(gòu)緒論
程序設(shè)計(jì)=數(shù)據(jù)結(jié)構(gòu)+算法
數(shù)據(jù):是描述客觀事物的符號(hào),是計(jì)算機(jī)中可以操作的對(duì)象,是能被計(jì)算機(jī)識(shí)別,并輸入給計(jì)算機(jī)處理的符號(hào)集合。
數(shù)據(jù)元素:是組成數(shù)據(jù)的、有一定意義的基本單元,在計(jì)算機(jī)中通常作為整體處理,也稱為記錄
數(shù)據(jù)項(xiàng):一個(gè)數(shù)據(jù)元素可以由若干個(gè)數(shù)據(jù)項(xiàng)組成,是數(shù)據(jù)不可分割的最小單位
數(shù)據(jù)對(duì)象:是性質(zhì)相同(同數(shù)量類型的數(shù)據(jù)項(xiàng))的數(shù)據(jù)元素的集合,是數(shù)據(jù)的子集
數(shù)據(jù)結(jié)構(gòu):是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合
邏輯結(jié)構(gòu):是指數(shù)據(jù)對(duì)象中數(shù)據(jù)元素之間的相互關(guān)系。集合結(jié)構(gòu)、線性結(jié)構(gòu)、樹(shù)形結(jié)構(gòu)、圖形結(jié)構(gòu)
物理結(jié)構(gòu):是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)形式。順序存儲(chǔ)結(jié)構(gòu)、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
數(shù)據(jù)類型:是指一組性質(zhì)相同的值的集合及定義再此集合上的一些操作的總稱
抽象數(shù)據(jù)類型(Abstract Data Type, ADT):是指一個(gè)數(shù)學(xué)模型及定義在該模型上的一組操作
第2章 算法
算法是解決特定問(wèn)題求解步驟的描述,在計(jì)算機(jī)中表現(xiàn)為指令的有限序列,并且每條指令表示一個(gè)或多個(gè)操作
算法的特性:輸入輸出(輸入>=0個(gè),輸出>=1個(gè));有窮性;確定性;可行性
算法的設(shè)計(jì)要求:正確性、可讀性、健壯性
算法的效率度量:事后統(tǒng)計(jì)、事前估算
算法的時(shí)間復(fù)雜度定義:進(jìn)行算法分析時(shí),語(yǔ)句總的執(zhí)行次數(shù)T(n)是關(guān)于問(wèn)題規(guī)模n的函數(shù),進(jìn)而分析T(n)隨n的變化情況并確定T(n)的數(shù)量級(jí),算法的時(shí)間復(fù)雜度,也就是算法的時(shí)間量度,計(jì)作T(n)=O(f(n))T(n)=O(f(n))。它表示隨問(wèn)題規(guī)模n的增大,算法執(zhí)行時(shí)間的增長(zhǎng)率和f(n)的增長(zhǎng)率相同,稱作算法的漸進(jìn)時(shí)間復(fù)雜度,簡(jiǎn)稱為時(shí)間復(fù)雜度。其中f(n)是問(wèn)題規(guī)模n的某個(gè)函數(shù)。
推導(dǎo)大O階的方法:用1替換加法;只保留最高階項(xiàng);最高階項(xiàng)系數(shù)為1
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1)<O(log?n)<O(n)<O(nlog?n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
第3章 線性表
線性表(List):零個(gè)或多個(gè)數(shù)據(jù)元素的有限序列(順序)
線性表的抽象數(shù)據(jù)類型Operation:InitList/ListEmpty/ClearList/GetElem/LocateElem/ListInsert/ListDelete/ListLength
線性表的順序存儲(chǔ)結(jié)構(gòu):指的是用一段地址連續(xù)的存儲(chǔ)單元以此存儲(chǔ)線性表的數(shù)據(jù)元素——一維數(shù)組;插入刪除為O(n),查詢?yōu)镺(1)
線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):數(shù)據(jù)域、指針域、結(jié)點(diǎn)、頭指針、后繼指針地址;
每個(gè)結(jié)點(diǎn)只包含一個(gè)指針域的叫做單鏈表;插入刪除為O(1),查詢?yōu)镺(n)
靜態(tài)鏈表:用數(shù)組描述的鏈表。每個(gè)元素存儲(chǔ)數(shù)據(jù)和指向下一個(gè)位置的索引
循環(huán)鏈表:頭尾相接的單鏈表稱為單循環(huán)鏈表,建成循環(huán)鏈表(circular linked list)
雙向鏈表:每個(gè)結(jié)點(diǎn)分別指向前驅(qū)和后繼的鏈表——空間換時(shí)間
第4章 棧與隊(duì)列
棧(stack)是限定僅在表尾進(jìn)行插入和刪除操作的線性表;棧頂(top)、棧底(bottom)、后進(jìn)先出(Last In First Out, LIFO);入棧、出棧
棧的抽象數(shù)據(jù)類型Operation:InitStack/DestroyStack/ClearStack/StackEmpty/GetTop/Push/Pop/StackLength
棧的順序存儲(chǔ)結(jié)構(gòu)——順序棧
兩棧空間共享,top1+1=top2則棧滿,用于同類型、空間需求相反的關(guān)系
棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)——鏈棧,單鏈表的頭結(jié)點(diǎn)作為棧頂
棧的應(yīng)用——遞歸:斐波那契數(shù)列
棧的應(yīng)用——四則運(yùn)算表達(dá)式:1)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式;2)后綴表達(dá)式(逆波蘭,RPN)運(yùn)算求結(jié)果;
9+(3?1)×3+10÷29+(3?1)×3+10÷2
9?3?1???3?×+?10?2÷+9?3?1???3?×+?10?2÷+
隊(duì)列(queue)是只允許在一端進(jìn)行插入操作,在另一端進(jìn)行刪除操作的線性表;先進(jìn)先出(FIrst In First Out, FIFO)
隊(duì)列的抽象數(shù)據(jù)類型
Operation:InitQueue/DestroyQueue/ClearQueue/QueueEmpty/GetHead/EnQueue/DeQueue/QueueLength
循環(huán)隊(duì)列,頭尾相接的順序存儲(chǔ)結(jié)構(gòu),解決存儲(chǔ)空間問(wèn)題,front表示隊(duì)頭、rear表示隊(duì)尾;
QueueLen=(rear?front+QueueSize)%QueueSizeQueueLen=(rear?front+QueueSize)%QueueSize
隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)——鏈隊(duì)列
第5章 串
串(string)是由零個(gè)或多個(gè)字符組成的有限序列,又名字符串
串的抽象數(shù)據(jù)類型Operation:StrAssign/StrCopy/ClearString/StringEmpty/StrLength/StrCompare/Concat/SubString/Index/Replace/StrInsert/StrDelete
串的順序存儲(chǔ)結(jié)構(gòu)、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)(每個(gè)結(jié)點(diǎn)多個(gè)字符)
串的模式匹配算法——子串的定位操作。1)樸素方法,每次推進(jìn)一格;2)KMP模式匹配,跳過(guò)子串中前幾個(gè)與第一個(gè)字符不一致的;3)KMP模式匹配改進(jìn),再跳過(guò)子串本身與第一個(gè)字符串一致的
第6章 樹(shù)
樹(shù)(Tree)是n(n≥0)個(gè)結(jié)點(diǎn)的有限集。n=0時(shí)稱為空樹(shù)。在任意一棵非空樹(shù)種:(1)有且僅有一個(gè)特定的稱為根(Root)的結(jié)點(diǎn);(2)當(dāng)n>1時(shí),其余結(jié)點(diǎn)可分為m(M>0)個(gè)互不相交的有限集T1,T2,...,TmT1,T2,...,Tm,中每一個(gè)集合本身又是一棵樹(shù),并且稱為根的子樹(shù)(SubTree)
度:結(jié)點(diǎn)擁有的子樹(shù)數(shù)稱為結(jié)點(diǎn)的度(Degree)。度為0的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)(Leaf)或終端結(jié)點(diǎn);度不為0的結(jié)點(diǎn)稱為非終端結(jié)點(diǎn)或分支結(jié)點(diǎn)。除根結(jié)點(diǎn)之外,分支結(jié)點(diǎn)也成為內(nèi)部結(jié)點(diǎn)。樹(shù)的度是樹(shù)內(nèi)各結(jié)點(diǎn)的度的最大值。
結(jié)點(diǎn)的子樹(shù)的根稱為該結(jié)點(diǎn)的孩子(Child),相應(yīng)地,該結(jié)點(diǎn)稱為孩子的雙親(Parent)
同一個(gè)雙親的孩子之間互稱兄弟(Sibling),結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn)。
以某結(jié)點(diǎn)為根的子樹(shù)中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫
結(jié)點(diǎn)的層次(Level)從根開(kāi)始定義起,根為第一層,根的孩子為第二層。
雙親再同一層的結(jié)點(diǎn)互為堂兄弟
樹(shù)中結(jié)點(diǎn)的最大層次稱為樹(shù)的深度(Depth)或高度
森林(Forest)是m(m≥0)棵互不相交的樹(shù)的集合
樹(shù)的抽象數(shù)據(jù)類型Operation:InitTree/DestroyTree/CreateTree/ClearTree/TreeEmpty/TreeDepth/Root/Value/Assign/Parent/LeftChild/RightSibling/InsertChild/DeleteChild
樹(shù)的存儲(chǔ)結(jié)構(gòu):雙親表示法、孩子表示法、孩子兄弟表示法
二叉樹(shù)(Binary Tree)是n(n≥0)個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集(稱為空二叉樹(shù)),或者由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的、分別稱為根結(jié)點(diǎn)的左子樹(shù)和右子樹(shù)的二叉樹(shù)組成
二叉樹(shù)的五個(gè)基本結(jié)構(gòu)
斜樹(shù),所有結(jié)點(diǎn)都只有左子樹(shù)或都只有右子樹(shù)的二叉樹(shù)
滿二叉樹(shù),二叉樹(shù)所有結(jié)點(diǎn)都存在左子樹(shù)和右子樹(shù),所有葉子結(jié)點(diǎn)都在同一層,稱為滿二叉樹(shù)
完全二叉樹(shù),對(duì)一棵具有n個(gè)結(jié)點(diǎn)的二叉樹(shù)按層序編號(hào),如果編號(hào)為i(1≤i≤n)的結(jié)點(diǎn)與同樣深度的滿二叉樹(shù)中編號(hào)為i的結(jié)點(diǎn)再二叉樹(shù)中位置完全相同,則這棵二叉樹(shù)稱為完全二叉樹(shù)
二叉樹(shù)性質(zhì)1:在二叉樹(shù)的第i層上至多有2i?12i?1個(gè)結(jié)點(diǎn)(i≥1)
二叉樹(shù)性質(zhì)2:深度為k的二叉樹(shù)至多有2k?12k?1個(gè)結(jié)點(diǎn)(k≥1)
二叉樹(shù)性質(zhì)3:對(duì)任何一棵二叉樹(shù)T,如果其終端結(jié)點(diǎn)數(shù)為n0n0,度為2的結(jié)點(diǎn)數(shù)為n2n2,則n0=n2+1n0=n2+1
二叉樹(shù)性質(zhì)4:具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度為?log2n?+1?log2?n?+1
二叉樹(shù)性質(zhì)5:如果一棵有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的結(jié)點(diǎn)按層序編號(hào),對(duì)任一結(jié)點(diǎn)i有:
1)i=1,根結(jié)點(diǎn);i>1,雙親結(jié)點(diǎn)為?i2??i2?
2)若2i>n2i>n,則i無(wú)左孩子;否則左孩子為2i2i
3)若2i+1>n2i+1>n,則i無(wú)右孩子;否則右孩子為2i+12i+1
二叉樹(shù)的順序存儲(chǔ)結(jié)構(gòu),一般用于完全二叉樹(shù)
二叉樹(shù)的遍歷(traversing binary tree)是指從根結(jié)點(diǎn)出發(fā),按照某種次序依次訪問(wèn)二叉樹(shù)中所有結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)被訪問(wèn)一次或僅被訪問(wèn)一次
前序遍歷:中左右;中序遍歷:左中右;后序遍歷:左右中;層序遍歷:按層從左至右;
已知前序遍歷和后序遍歷,是不能確定一顆二叉樹(shù)的
按某種遍歷順序,指向前驅(qū)或后繼的指針?lè)Q為線索,加上線索的二叉樹(shù)鏈表稱為線索鏈表,相應(yīng)的二叉樹(shù)稱為線索二叉樹(shù);把二叉樹(shù)已某種次序變?yōu)榫€索二叉樹(shù)的過(guò)程稱為線索化
線索二叉樹(shù)等于把二叉樹(shù)變?yōu)橐粋€(gè)雙向鏈表,如中序遍歷
樹(shù)轉(zhuǎn)二叉樹(shù):加線、去線、層次調(diào)整
森林轉(zhuǎn)二叉樹(shù):每棵樹(shù)轉(zhuǎn)二叉樹(shù)、分別作為前一個(gè)的根結(jié)點(diǎn)的右子樹(shù)
從樹(shù)中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的分支構(gòu)成兩個(gè)結(jié)點(diǎn)之間的路徑,路徑上的分支數(shù)目稱做路徑長(zhǎng)度。樹(shù)的路徑長(zhǎng)度就是從樹(shù)根到每一結(jié)點(diǎn)的路徑長(zhǎng)度之和。
帶權(quán)路徑長(zhǎng)度WPL最小的二叉樹(shù)稱做哈夫曼樹(shù)
按照頻率從小到大排序,兩兩合并組成二叉樹(shù)新結(jié)點(diǎn),最后合并為哈夫曼樹(shù)。左分支為0,右分支為1,對(duì)應(yīng)編碼為哈夫曼編碼
第7章 圖
圖(Graph)是由頂點(diǎn)的有窮非空集合和頂點(diǎn)之間的集合組成,通常表示為:G(V,E),其中,G表示一個(gè)圖,V是頂點(diǎn)集合,E是邊的集合
無(wú)向邊:頂點(diǎn)之間的邊沒(méi)有方向,用()表示,組成無(wú)向圖
有向邊:頂點(diǎn)之間有方向,也稱弧,用<>表示,組成有向圖
無(wú)向完全圖,無(wú)向圖中任意兩點(diǎn)都存在邊。共n×(n?1)2n×(n?1)2條邊
有向完全圖,任意兩個(gè)頂點(diǎn)間存在互為相反的兩條弧
有很少條邊的稱為稀疏圖,反之稱為稠密圖
帶權(quán)的圖稱為網(wǎng)
子圖
同一條邊的兩個(gè)點(diǎn)互為鄰接點(diǎn);邊依附/關(guān)聯(lián)于這兩個(gè)點(diǎn);度是頂點(diǎn)關(guān)聯(lián)的邊的數(shù)目;入度是有向圖中指向該點(diǎn)的邊的數(shù)目;出度是發(fā)射出的數(shù)目;
路徑是點(diǎn)到點(diǎn)之間的頂點(diǎn)序列;路徑的長(zhǎng)度是路徑上邊/弧的數(shù)目;第一個(gè)點(diǎn)點(diǎn)和最后一個(gè)頂點(diǎn)相同的路徑稱為回路/環(huán);頂點(diǎn)不重復(fù)的路徑稱為簡(jiǎn)單路徑;只在首尾點(diǎn)不重復(fù)的回路稱為簡(jiǎn)單回路/簡(jiǎn)單環(huán);
無(wú)向圖中,存在點(diǎn)到點(diǎn)之間的路徑則稱為兩點(diǎn)連通,圖中任意兩點(diǎn)連通的稱為連通圖;最大連通子圖稱為連通分量;有向圖中稱為強(qiáng)連通圖、強(qiáng)連通分量
無(wú)向圖中連通且有n個(gè)頂點(diǎn)n-1條邊叫生成樹(shù),有向圖中一個(gè)頂點(diǎn)入度為0其余頂點(diǎn)入度為1的叫有向樹(shù),一個(gè)有向圖由若干棵有向樹(shù)構(gòu)成生成森林
圖的抽象數(shù)據(jù)類型Operation:CreateGraph/DestroyGraph/LocateVex/GetVex/PutVex/FirstAdjVex/NextAdjVex/InsertVex/DeleteVex/InsertArc/DeleteArc/DFSTraverse/HFSTraverse
圖的存儲(chǔ)結(jié)構(gòu)
1)鄰接矩陣:點(diǎn)數(shù)組+二維矩陣
2)鄰接表:數(shù)組+鏈表
3)十字鏈表:有向圖nice
4)鄰接多重表:
5)邊集數(shù)組
圖的遍歷:從圖中某一頂點(diǎn)出發(fā)遍歷圖中其余頂點(diǎn),且使每一個(gè)頂點(diǎn)僅被訪問(wèn)一次
深度優(yōu)先遍歷,DFS;適合找到精確目標(biāo);
廣度優(yōu)先遍歷,BFS;適合找到相對(duì)優(yōu)解;
最小生成樹(shù):把構(gòu)造聯(lián)通網(wǎng)的最小代價(jià)生成樹(shù)稱為最小生成樹(shù)
Prim算法:假設(shè)N=(P,{E})N=(P,{E})是連通網(wǎng),TE是N上最小生成樹(shù)中邊的集合。算法從U={u0}?(u0∈V),TE={}U={u0}?(u0∈V),TE={}開(kāi)始,重復(fù)執(zhí)行:在所有u∈U,v∈V?Uu∈U,v∈V?U的邊(u,v)∈E(u,v)∈E中找一條代價(jià)最小的邊(u0,v0)(u0,v0)并入集合TE,同時(shí)v0v0并入U(xiǎn),直至U=VU=V為止。此時(shí)TE中必有n-1條邊,則T=(V,TE)T=(V,TE)為N的最小生成樹(shù);O(n2)O(n2)
Kruskal算法:假設(shè)N=(V,{E})N=(V,{E})是連通網(wǎng),則令最小生成樹(shù)的初始狀態(tài)為只有n個(gè)頂點(diǎn)的無(wú)邊的非連通圖T={V,{}}T={V,{}},圖中每個(gè)頂點(diǎn)自成一個(gè)連通分量。在E中選擇代價(jià)最小的邊,若該邊依附的頂點(diǎn)落在T中不同的連通分量上,則將此邊加入到T中,否則舍去此邊而選擇下一條代價(jià)最小的邊。直至T中所有頂點(diǎn)都在同一連通分量上為止;O(eloge)O(elog?e)
克魯斯卡爾算法適合邊少的稀疏圖;普里姆算法適合稠密圖
最短路徑:兩頂點(diǎn)之間經(jīng)過(guò)的邊上權(quán)值之和最少的路徑,并且我們稱路徑上的第一個(gè)頂點(diǎn)是源點(diǎn),最后一個(gè)頂點(diǎn)時(shí)終點(diǎn)
Dijkstra算法:求解點(diǎn)到點(diǎn)的最短距離。用數(shù)組D表示距離和數(shù)組P表示前驅(qū),通過(guò)迭代更新點(diǎn)到起點(diǎn)的最短距離實(shí)現(xiàn)。復(fù)雜度O(n2)O(n2)
Floyd算法:求解所有的任意兩點(diǎn)間的最短距離,用三層循環(huán)迭代更新點(diǎn)和點(diǎn)之間的最短距離。復(fù)雜度O(n3)O(n3)
在一個(gè)表示工程的有向圖中,用頂點(diǎn)表示活動(dòng),用弧表示活動(dòng)之間的有限關(guān)系,這樣的有向圖為頂點(diǎn)表示活動(dòng)的網(wǎng),稱為AOV網(wǎng)(Activity On Vertex Network)。網(wǎng)中點(diǎn)序列,從頂點(diǎn)V1到頂點(diǎn)V2有路徑,則V1必在V2前面,這樣的頂點(diǎn)序列稱為一個(gè)拓?fù)湫蛄?br />拓?fù)渑判?#xff0c;就是對(duì)一個(gè)有向圖構(gòu)造拓?fù)湫蛄械倪^(guò)程,可能的結(jié)果包括頂點(diǎn)全部輸出——不存在環(huán)的AOV網(wǎng);頂點(diǎn)未全部輸出,存在環(huán),非AOV網(wǎng)。方法:從入度為0的頂點(diǎn)開(kāi)始輸出,并刪除此點(diǎn)和相關(guān)弧,直至不存在入度為0的點(diǎn)為止。
帶權(quán)的有向圖中,用頂點(diǎn)表示事件,用有向邊表示活動(dòng),用邊上的權(quán)值表示活動(dòng)的持續(xù)時(shí)間,這種有向圖的邊表示活動(dòng)的網(wǎng),稱為AOE網(wǎng)(Activity On Edge Network)
路徑上各個(gè)活動(dòng)所持續(xù)的時(shí)間之和稱為路徑長(zhǎng)度,從源點(diǎn)到匯點(diǎn)具有最大長(zhǎng)度的路徑叫關(guān)鍵路徑,關(guān)鍵路徑上的活動(dòng)叫關(guān)鍵活動(dòng)。縮短整個(gè)工序工期必須從從縮短關(guān)鍵路徑入手
第8章 查找
查找(Searching)就是根據(jù)給定的某個(gè)值,在查找表中確定一個(gè)起關(guān)鍵字等于給定值的數(shù)據(jù)元素(或記錄)
查找表(Searching Table)是由同一類型的數(shù)據(jù)元素(或記錄)構(gòu)成的集合
關(guān)鍵字(Key)是數(shù)據(jù)元素中某個(gè)數(shù)據(jù)項(xiàng)的值,也稱鍵值;若關(guān)鍵詞可以唯一標(biāo)識(shí)一個(gè)記錄稱為主關(guān)鍵字,識(shí)別多個(gè)的稱為次關(guān)鍵字
靜態(tài)查找表(Static Search Table)只作查找操作的查找表
動(dòng)態(tài)查找表(Dynamic Search Table)在查找過(guò)程中同時(shí)插入查找表中不存在的數(shù)據(jù)元素,或者從查找表中刪除已經(jīng)存在的某個(gè)數(shù)據(jù)元素
順序查找(Sequential Search)又叫線性查找,即逐個(gè)的查找,時(shí)間復(fù)雜度最好/最差/平均:O(1)/O(n)/O(n)O(1)/O(n)/O(n)
有序表——折半查找(Binary Search),又稱二分查找:每次中中點(diǎn)分割縮小范圍;時(shí)間復(fù)雜度O(logn)O(log?n)
有序表——插值查找(Interpolation Search),根據(jù)插值公式確定分割點(diǎn),插值公式key?a[low]a[high]?a[low]key?a[low]a[high]?a[low];時(shí)間復(fù)雜度O(logn)O(log?n);適合表教長(zhǎng)且關(guān)鍵字分布均勻
有序表——斐波那契查找(Fibonacci Search),根據(jù)斐波那契數(shù)列確定分割點(diǎn);時(shí)間復(fù)雜度O(logn)O(log?n)
索引:就是把一個(gè)關(guān)鍵字與它對(duì)應(yīng)的記錄相關(guān)聯(lián)的過(guò)程,索引由若干索引項(xiàng)組成,索引項(xiàng)應(yīng)包含關(guān)鍵字和其對(duì)應(yīng)的記錄在存儲(chǔ)器中的位置
線性索引就是將索引項(xiàng)集合組織為線性結(jié)構(gòu),也稱為索引表
稠密索引:指在線性索引中,將數(shù)據(jù)集中的每個(gè)記錄對(duì)應(yīng)一個(gè)索引項(xiàng);數(shù)據(jù)可能無(wú)序,索引項(xiàng)有序
分塊索引:對(duì)分塊有序的數(shù)據(jù)集,每塊對(duì)應(yīng)一個(gè)索引項(xiàng);其中塊內(nèi)無(wú)序、塊間有序;索引項(xiàng)包括最大關(guān)鍵碼、塊內(nèi)記錄個(gè)數(shù)、塊首指針
倒排索引:索引項(xiàng)包括次關(guān)鍵碼、記錄號(hào)表;記錄號(hào)表存儲(chǔ)具有相同次關(guān)鍵字的所有記錄的記錄號(hào)(可以指向記錄的指針或者是該記錄的主關(guān)鍵字)
二叉排序樹(shù)(Binary Sort Tree),又稱二叉查找樹(shù),具有性質(zhì):左子樹(shù)為空或所有結(jié)點(diǎn)的值小于根結(jié)點(diǎn);右子樹(shù)為空或所有結(jié)點(diǎn)的值大于根結(jié)點(diǎn);其左右子樹(shù)也是二叉排序樹(shù)
中序遍歷二叉排序樹(shù)即為有序序列
二叉排序樹(shù)若為平衡,則查找效率同折半;若嚴(yán)重入斜樹(shù),則同順序查找
平衡二叉樹(shù)(Self-Balancing Binary Search Tree),是一種二叉排序樹(shù),其中每一個(gè)結(jié)點(diǎn)的左子樹(shù)和右子樹(shù)高度差最多為1,也稱AVL樹(shù)
左子樹(shù)的深度減去右子樹(shù)的深度稱為平衡因子BF(Balance Factor)
距離插入點(diǎn)最近的,且平衡因子的絕對(duì)值大于1的結(jié)點(diǎn)為根的子樹(shù),稱為最小不平衡子樹(shù);插入新值后需要調(diào)整樹(shù)的平衡性
多路查找樹(shù)(multi-way search tree)其每個(gè)結(jié)點(diǎn)的孩子樹(shù)可以多于兩個(gè),且每個(gè)結(jié)點(diǎn)可以存儲(chǔ)多個(gè)元素
2-3樹(shù):每個(gè)結(jié)點(diǎn)由兩個(gè)(2結(jié)點(diǎn))或三個(gè)(3結(jié)點(diǎn))孩子,2結(jié)點(diǎn)有一個(gè)元素,3結(jié)點(diǎn)有兩個(gè)元素;且所有葉子結(jié)點(diǎn)在同一層上
2-3-4樹(shù):相比2-3樹(shù),包括了4結(jié)點(diǎn)——三個(gè)元素四個(gè)孩子
B樹(shù)(B-tree)是一種平衡的多路查找樹(shù),2-3樹(shù)和2-3-4樹(shù)是B樹(shù)的特例,結(jié)點(diǎn)最大的孩子數(shù)目是B樹(shù)的階(order)
B樹(shù)的應(yīng)用:處理的數(shù)據(jù)量很大,無(wú)法一次性裝入內(nèi)存,使B樹(shù)的階數(shù)與硬盤(pán)存儲(chǔ)的頁(yè)面大小相匹配;則可以根結(jié)點(diǎn)存于內(nèi)存,查找時(shí)只需讀取兩次硬盤(pán)即可;B樹(shù)的數(shù)據(jù)結(jié)構(gòu)就是為內(nèi)外存數(shù)據(jù)交互準(zhǔn)備的
B+樹(shù),解決B樹(shù)遍歷的時(shí)候也面來(lái)回跳轉(zhuǎn)的問(wèn)題,適合范圍查找;在葉結(jié)點(diǎn)上保存父節(jié)點(diǎn)的值(葉子結(jié)點(diǎn)包含全部信息);葉子結(jié)點(diǎn)指向下一個(gè)葉子結(jié)點(diǎn)
散列技術(shù)是在記錄的存儲(chǔ)位置和它的關(guān)鍵字之間建立一個(gè)確定的對(duì)應(yīng)關(guān)系f,使得每個(gè)關(guān)鍵字key對(duì)應(yīng)一個(gè)存儲(chǔ)位置f(key);f稱為散列函數(shù),又稱哈希(Hash)函數(shù);采用散列技術(shù),將記錄存儲(chǔ)在一塊連續(xù)的存儲(chǔ)空間中,這塊連續(xù)存儲(chǔ)空間稱為散列表或哈希表(Hash Table)
散列技術(shù)是一種存儲(chǔ)方法,也是一種查找方法,記錄之間不存在邏輯關(guān)系,適合于查找與給定值相等的記錄;不適合一個(gè)關(guān)鍵字對(duì)應(yīng)多個(gè)記錄的查找、不適合范圍查找
若兩個(gè)關(guān)鍵字key1≠key2,f(key1)=f(key2)key1≠key2,f(key1)=f(key2),這種現(xiàn)場(chǎng)稱為沖突(collision)把key1和key2稱為散列函數(shù)的同義詞
散列函數(shù)構(gòu)造——直接定址法,適合查找表較小的且連續(xù)的情況,取關(guān)鍵字的線性函數(shù)值做散列地址,如
f(key)=a×key+bf(key)=a×key+b
散列函數(shù)構(gòu)造——數(shù)字分析法,適合處理關(guān)鍵字位數(shù)較大且若干位分布均勻的情況,抽取關(guān)鍵字的一部分作為散列存儲(chǔ)位置
散列函數(shù)構(gòu)造——平方取中法,適合于不知道關(guān)鍵字分布且位數(shù)不大的情況,關(guān)鍵字取平方在截取部分,如1234,平方1522756,取中227
散列函數(shù)構(gòu)造——折疊法,適合不知道關(guān)鍵字分布且位數(shù)較大的情況,折疊求和,如9876543210分為四組求和987+654+321+0=1962
散列函數(shù)構(gòu)造——除余留數(shù)法,最常用,p常取不大于m的最大質(zhì)數(shù)
f(key)=key?mod?p?(p≤m)f(key)=key?mod?p?(p≤m)
散列函數(shù)構(gòu)造——隨機(jī)數(shù)法,適合關(guān)鍵字長(zhǎng)度不等
散列沖突處理——開(kāi)放定址法,沖突時(shí),尋找下一個(gè)空的散列地址,也稱線性探測(cè)法。容易造成堆積現(xiàn)象(非同義詞爭(zhēng)奪一個(gè)地址),可采用二次探測(cè)法;或采用隨機(jī)探測(cè)法
fi(key)=(f(key)+di)?mod?m?(di=1,2,3,...,m?1)fi(key)=(f(key)+di)?mod?m?(di=1,2,3,...,m?1)
fi(key)=(f(key)+di)?mod?m?(di=12,?12,22,?22,...,q2,?q2,q≤m/2)fi(key)=(f(key)+di)?mod?m?(di=12,?12,22,?22,...,q2,?q2,q≤m/2)
fi(key)=(f(key)+di)?mod?m?(di為隨機(jī)數(shù)列)fi(key)=(f(key)+di)?mod?m?(di為隨機(jī)數(shù)列)
散列沖突處理——再散列函數(shù)法,通過(guò)多個(gè)散列函數(shù)進(jìn)行,一個(gè)沖突換一個(gè)
散列沖突處理——鏈地址法,沖突位置用鏈表接續(xù)
散列沖突處理——公共溢出區(qū)法,為沖突關(guān)鍵字簡(jiǎn)歷一個(gè)公共的溢出區(qū)來(lái)存放,適合沖突數(shù)據(jù)少的情況
如果沒(méi)有沖突,散列的查找時(shí)間為O(1)
第9章 排序
假設(shè)含有n個(gè)記錄的序列為{r1,r2,...,rn}{r1,r2,...,rn},其相應(yīng)的關(guān)鍵字分別為{k1,k2,...,kn}{k1,k2,...,kn},需確定1,2,…,n的一種排列p1,p2,...,pnp1,p2,...,pn,使其相應(yīng)的關(guān)鍵字滿足kp1≤kp2≤...≤kpnkp1≤kp2≤...≤kpn(非遞增或非遞減)關(guān)系,即使得序列稱為一個(gè)按關(guān)鍵字有序的序列{rp1,rp2,...,rpn}{rp1,rp2,...,rpn},這樣的操作就稱為排序
排序的穩(wěn)定性:關(guān)鍵字相同的兩條記錄,排序后順序保持不變即為穩(wěn)定,否則不穩(wěn)定
內(nèi)排序是整個(gè)排序過(guò)程都在內(nèi)存中進(jìn)行;外排序是排序過(guò)程再內(nèi)外村之間多次交換數(shù)據(jù)進(jìn)行
基本有序:小的關(guān)鍵字基本在前面,大的基本在后邊,不大不小的基本在中間
內(nèi)排序分類:
1)插入排序:直接插入排序、希爾排序
2)交換排序:冒泡排序、快速排序
3)選擇排序:簡(jiǎn)單選擇排序、堆排序
4)歸并排序
冒泡排序
1)思想:兩輛比較相鄰記錄,反序交換,直至沒(méi)有反序記錄;
2)優(yōu)化:若某一次迭代中,后續(xù)未發(fā)生過(guò)交換,則全部停止;
3)復(fù)雜度:平均O(n2)O(n2),最好O(n)O(n),最壞O(n2)O(n2),空間O(1)O(1),穩(wěn)定
簡(jiǎn)單選擇排序
1)思想:每次從剩余序列中找最小的數(shù)值,置換到最前面
2)復(fù)雜度:平均O(n2)O(n2),最好O(n2)O(n2),最壞O(n2)O(n2),空間O(1)O(1),穩(wěn)定
直接插入排序
1)思想:逐漸擴(kuò)充有序表,每次為記錄尋找插入位置,即依次后移有序表中較大數(shù)字
2)復(fù)雜度:平均O(n2)O(n2),最好O(n)O(n),最壞O(n2)O(n2),空間O(1)O(1),穩(wěn)定
希爾排序
1)思想:步長(zhǎng)大于1的插入排序,并逐漸降低步長(zhǎng)至1
2)復(fù)雜度:平均O(nlogn)~O(n2)O(nlog?n)~O(n2),最好O(n1.3)O(n1.3),最壞O(n2)O(n2),空間O(1)O(1),不穩(wěn)定
堆:完全二叉樹(shù);每個(gè)結(jié)點(diǎn)的值都小于或等于其左右孩子結(jié)點(diǎn)的值,為大頂堆;每個(gè)結(jié)點(diǎn)值都小于或等于其左右孩子結(jié)點(diǎn)的值,為小頂堆
堆排序
1)思想:如大頂堆,每次將堆頂元素移走(或和末尾交換),剩余元素重新構(gòu)造堆,反復(fù)執(zhí)行直至有序序列
2)復(fù)雜度:平均O(nlogn)O(nlog?n),最好O(nlogn)O(nlog?n),最壞O(nlogn)O(nlog?n),空間O(1)O(1),不穩(wěn)定
3)分析:構(gòu)建堆需要O(n),之后每次調(diào)整需要O(logi)
歸并排序
1)思想:將序列二分拆分為子序列為1的大小,兩兩排序歸并,直到重新獲得n長(zhǎng)度的有序序列
2)復(fù)雜度:平均O(nlogn)O(nlog?n),最好O(nlogn)O(nlog?n),最壞O(nlogn)O(nlog?n),空間O(n)O(n),穩(wěn)定
快速排序
1)思想:每次排序?qū)⒂涗浄指顬閮刹糠?#xff0c;一部分均比另一部分小,再分別對(duì)兩部分排序
2)復(fù)雜度:平均O(nlogn)O(nlog?n),最好O(nlogn)O(nlog?n),最壞O(n2)O(n2),空間O(nlogn)~O(n2)O(nlog?n)~O(n2),不穩(wěn)定
3)優(yōu)化:三數(shù)取中、尾遞歸
排序的總結(jié):
1)最好情況看,若待排序列基本有序,則不考慮4中復(fù)雜算法,考慮冒泡和插入
2)最壞情況看,堆排序與歸并排序更好
3)空間復(fù)雜度看,在乎內(nèi)存使用時(shí),不應(yīng)選擇歸并和快排
4)穩(wěn)定性看,在乎穩(wěn)定性時(shí),歸并好
5)數(shù)量上看,n越小越簡(jiǎn)單,n越大越改進(jìn)
6)要減少移動(dòng)次數(shù)時(shí),簡(jiǎn)單選擇才比較好
---------------------
作者:煎餅證
來(lái)源:CSDN
原文:https://blog.csdn.net/jianbinzheng/article/details/79858736
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
?
大話數(shù)據(jù)結(jié)構(gòu)與算法 https://blog.csdn.net/qq_22820783/article/details/86815112
轉(zhuǎn)載于:https://www.cnblogs.com/highpointengineer/p/10953953.html
總結(jié)
以上是生活随笔為你收集整理的《大话数据结构》参考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何使用Hulu观看晚会与朋友一起看电视
- 下一篇: 学而当自强