2023年數據結構知識點整理_第1頁
2023年數據結構知識點整理_第2頁
2023年數據結構知識點整理_第3頁
2023年數據結構知識點整理_第4頁
2023年數據結構知識點整理_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數據是信息的載體,是描述客觀事物的數、字符、以及所有能輸入到計算機中,被計算機程序辨認和解決的符號(數值、字符等)的集合。數據元素(數據成員)是數據的基本單位。在不同的條件下,數據元素又可稱為元素、結點、頂點、記錄等數據對象具有相同性質的數據元素(數據成員)的集合數據結構由某一數據對象及該對象中所有數據成員之間的關系組成。記為Data_Structure={D,R}其中,D是某一數據對象,R是該對象中所有數據成員之間的關系的有限集合。數據類型是指一種類型,以及定義在這個值集合上的一組操作的總稱。?判斷一個算法的優(yōu)劣重要標準:對的性、可使用性、可讀性、效率、健壯性、簡樸性。算法效率的衡量方法:后期測試,事前估計算法分析是算法的漸進分析簡稱數據結構涉及“邏輯結構”和“物理結構”兩個方面(層次):邏輯結構是對數據成員之間的邏輯關系的描述,它可以用一個數據成員的集合和定義在此集合上的若干關系來表達物理結構是邏輯結構在計算機中的表達和實現,故又稱“存儲結構”線性表的定義:n(30)個表項的有限序列L=(a1,a2,…,an)ai是表項,n是表長度。第一個表項是表頭,最后一個是表尾。線性表的特點:表中元素的數據類型相同;線性表中,結點和結點間的關系是一對一的,有序表和無序表線性表的存儲方式。一,順序存儲方式,二,鏈表存儲方式。順序表的存儲表達有2種方式:靜態(tài)方式和動態(tài)方式。順序表的定義是:把線性表中的所有表項按照其邏輯順序依次存儲到從計算機存儲中指定存儲位置開始的一塊連續(xù)的存儲空間中。順序表的特點:用地址連續(xù)的一塊存儲空間順序存放各表項,各表項的邏輯順序與物理順序一致,對各個表項可以順序訪問,也可以隨機訪問。單鏈表是一種最簡樸的鏈表表達,也叫線性鏈表,用她來表達線性表時,用指針表達結點間的邏輯關系。特點:是長度可以很方便地進行擴充。連續(xù)存儲方式(順序表)特點:存儲運用率高,存取速度快缺陷:插入、刪除等操作時需要移動大量數據:鏈式存儲方式(鏈表)特點:適應表的動態(tài)增長和刪除。缺陷:需要額外的指針存儲空間單鏈表的類定義:多個類表達一個概念(單鏈表)。分為:鏈表結點(ListNode)類,鏈表(List)類。循環(huán)鏈表的概念:是另一種形式的表達線性表的鏈表,它的結點結構與單鏈表相同,與單鏈表不同的是鏈表中表尾結點的LINK域中不是NULL,而是存放了一個指向鏈表開始結點的指針,這樣,只要知道表中任何一個結點的地址,就能遍歷表中其他任何一結點。雙向鏈表的概念:在雙向鏈表的沒餓結點中應有兩個鏈接指針作為它的數據成員:1LINK指示它的前驅結點,RLINK指示它的后繼結點,因此,雙向鏈表的每個結點至少有3個域:1LINK(前驅指針)DADA(數據)RLINK(后繼指針)。棧:定義為只允許在表的末端進行插入和刪除的線性表。特點是:后進先出。遞歸的定義:若一個對象部分地包含它自己,或用它自己給自己定義,則稱這個對象是遞歸的;若一個過程直接地或間接地調用自己,則稱這個過程是遞歸的過程。以下三種情況經常用到遞歸方法一。定義是遞歸的二。數據結構是遞歸的三問題的解法是遞歸的。隊列:隊列是只允許在一端刪除,在另一端插入的順序表允許刪除的一端叫做隊頭,允許插入的一端叫做隊尾。特性:先進先出。優(yōu)先級隊列:是不同于先進先出隊列的另一種隊列。每次從隊列中取出的是具有最高優(yōu)先權的元素。多維數組是一維數組的推廣。多維數組是一維數組的推廣。多維數組的特點是每一個數據元素可以有多個直接前驅和多個直接后繼。數組元素的下標一般具有固定的下界和上界,因此它比其他復雜的非線性結構簡樸。字符串是n(30)個字符的有限序列,記作S:“c1c2c3…cn”其中,S是串名字c1c2c3…cn”是串值ci是串中字符n是串的長度,廣義表是n(≥0)個表元素組成的有限序列,記作LS(a1,a2,a3,…,an),LS是表名,ai是表元素,可以是表(稱為子表),可以是數據元素(稱為原子)。n為表的長度。n=0的廣義表為空表。n>0時,表的第一個表元素稱為廣義表的表頭(head),除此之外,其它表元素組成的表稱為廣義表的表尾(tail有根樹:一棵有根樹T,簡稱為樹,它是n(n≥0)個結點的有限集合。當n=0時,T稱為空樹;否則,T是非空樹,記作T={空集n=0{r,T1,T2….Tn},n>0r是一個特定的稱為根(root)的結點,它只有直接后繼,但沒有直接前驅;根以外的其他結點劃分為m(m30)個互不相交的有限集合T1,T2,…,Tm,每個集合又是一棵樹,并且稱之為根的子樹。每棵子樹的根結點有且僅有一個直接前驅,但可以有0個或多個直接后繼二叉樹的定義:一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根結點加上兩棵分別稱為左子樹和右子樹的、互不相交的二叉樹組成。完全二叉樹:─若設二叉樹的深度為k,則共有k層。除第k層外,其它各層(1~k-1)的結點數都達成最大個數,第k層從右向左連續(xù)缺若干結點,這就是完全二叉樹二叉樹的遍歷就是按某種順序訪問樹中的結點,規(guī)定每個結點訪問一次且僅訪問一次。設訪問根結點記作V遍歷根的左子樹記作L遍歷根的右子樹記作R。則也許的遍歷順序有:前序VLR鏡像VRL;中序LVR鏡像RVL;后序LRV鏡像RLV前序遍歷二叉樹算法的框架是:若二叉樹為空,則空操作;否則訪問根結點(V);前序遍歷左子樹(L);前序遍歷右子樹(R)。遍歷結果-+a*b-cd/ef樹的后根順序遍歷:當樹非空時依次后根遍歷根的各棵子樹訪問根結點:樹后根遍歷EFBCGDA;相應二叉樹中序遍歷EFBCGDA;樹的后根遍歷結果與其相應二叉樹。表達的中序遍歷結果相同:樹的后根遍歷可以借助相應二叉樹的中序遍歷算法實現最小堆和最大堆:假如有一個關鍵碼集合K={K0,K1,K2,K3,….,Kn-1},把它的所有元素按完全二叉樹的順序存儲方式存放在一個一維數組中。并滿足Ki≤K2i+1且Ki≤K2i+2(或者Ki≥K2i+1且KiK2i+2)i=0,1,….[(n-2)/2],則稱這個集合為最小堆或最大堆。堆是最高效的一種數據結構,每次出隊列的是優(yōu)先權最高的元素。用堆實現其存儲表達,可以高效運作。堆的建立:有2種方式建立最小的堆,一種方式是通過第一個構造函數建立一個空堆,其大小通過動態(tài)存儲分派得到,另一中建立最小堆的方式是通過第二個構造函數復制一個記錄數組并對其加以調整形成一個堆。途徑:從樹中一個結點到達另一個結點之間的分支構成該兩結點之間的途徑。途徑長度:是指途徑上的分支條數,樹的途徑長度是從樹的根結點到每一個結點的途徑長度之和。由樹的定義,從根結點到達書中每一結點有且僅有一條途徑。Huffman樹:帶權途徑長度最小的二叉樹應是權值大的外結點離根結點最近的擴充二叉樹。帶途徑長度最小的擴充二叉樹不一定是完全二叉樹。集合是成員(元素)的一個群集。集合中的成員可以是原子(單元素),也可以是集合。字典是一些元素的集合,每個元素有一個稱作關鍵碼(key)的域,不同元素的關鍵碼互不相同。散列方法:抱負的搜索方法是可以不通過比較,一次直接從字典中得到要搜索的元素。假如在元素存儲位置與其關鍵碼之間建立一個擬定的相應函數關系Hash(),使得每個關鍵碼與結構中一個唯一的存儲位置相相應:Address=Hash(key)。在插入時依此函數計算存儲位置并按此位置存放。在搜索時對元素的關鍵碼進行同樣的計算,把求得的函數值當做元素存儲位置,在結構中按此位置搜索。這就是散列方法。在散列方法中所用轉換函數叫做散列函數。按此方法構造出來的表叫做散列表。使用散列方法進行搜索不必進行多次關鍵碼的比較,搜索速度比較快,可以直接到達或逼近具有此關鍵碼的表項的實際存放地址。散列函數是一個壓縮映象函數。關鍵碼集合比散列表地址集合大得多。因此有也許通過散列函數的計算,把不同的關鍵碼映射到同一個散列地址上,這就產生了沖突搜索就是在數據集合中尋找滿足某種條件的數據對象。搜索的結果通常有兩種也許:搜索成功,即找到滿足條件的數據對象。這時,作為結果,可報告該對象在結構中的位置,還可給出該對象中的具體信息。搜索不成功,或搜索失敗。作為結果,應報告一些信息,如失敗標志、位置等搜索結構通常稱用于搜索的數據集合為搜索結構,它是由同一數據類型的對象(或記錄)組成。在每個對象中有若干屬性,其中有一個屬性,其值可唯一地標記這個對象。稱為關鍵碼。使用基于關鍵碼的搜索,搜索結果應是唯一的。但在實際應用時,搜索條件是多方面的,可以使用基于屬性的搜索方法,但搜索結果也許不唯一。實行搜索時有兩種不同的環(huán)境。靜態(tài)環(huán)境,搜索結構在插入和刪除等操作的前后不發(fā)生改變。?靜態(tài)搜索表動態(tài)環(huán)境,為保持較高的搜索效率,搜索結構在執(zhí)行插入和刪除等操作的前后將自動進行調整,結構也許發(fā)生變化。?動態(tài)搜索表順序搜索重要用于在線性表中搜索。設若表中有CurrentSize個元素,則順序搜索從表的先端開始,順序用各元素的關鍵碼與給定值x進行比較若找到與其值相等的元素,則搜索成功,給出該元素在表中的位置。若整個表都已檢測完仍未找到關鍵碼與x相等的元素,則搜索失敗。給出失敗信息二叉搜索樹或者是一棵空樹,或者是具有下列性質的二叉樹:1每個結點都有一個作為搜索依據的關鍵碼(key),所有結點的關鍵碼互不相同。2左子樹(假如非空)上所有結點的關鍵碼都小于根結點的關鍵碼。3右子樹(假如非空)上所有結點的關鍵碼都大于根結點的關鍵碼。4左子樹和右子樹也是二叉搜索樹。二叉搜索樹為二叉排序樹假如對一棵二叉搜索樹進行中序遍歷,可以按從小到大的順序,將各結點關鍵碼排列起來,所以也稱二叉搜索樹為二叉排序樹在二叉搜索樹上進行搜索,是一個從根結點開始,沿某一個分支逐層向下進行比較判等的過程。它可以是一個遞歸的過程。假設想要在二叉搜索樹中搜索關鍵碼為x的元素,搜索過程從根結點開始。假如根指針為NULL,則搜索不成功;否則用給定值x與根結點的關鍵碼進行比較:若給定值等于根結點關鍵碼,則搜索成功,返回搜索成功信息并報告搜索到結點地址。若給定值小于根結點的關鍵碼,則繼續(xù)遞歸搜索根結點的左子樹;否則。遞歸搜索根結點的右子二叉搜索樹的插入算法:為了向二叉搜索樹中插入一個新元素,必須先檢查這個元素是否在樹中已經存在。在插入之前,先使用搜索算法在樹中檢查要插入元素有還是沒有。假如搜索成功,說明樹中已有這個元素,不再插入;假如搜索不成功,說明樹中本來沒有關鍵碼等于給定值的結點,把新元素加到搜索操作停止的地方。圖定義:圖是由頂點集合(vertex)及頂點間的關系集合組成的一種數據結構:Graph=(V,E)其中V={x|x?某個數據對象}是頂點的有窮非空集合;E={(x,y)|x,y?V}或E={<x,y>|x,y?V&&Path(x,y)},是頂點之間關系的有窮集合,也叫做邊(edge)集合。Path(x,y)表達從x到y的一條單向通路,它是有方向的。有向圖與無向圖:在有向圖中,頂點對<x,y>是有序的。在無向圖中,頂點對(x,y)是無序的。完全圖:若有n個頂點的無向圖有n(n-1)/2條邊,則此圖為完全無向圖。有n個頂點的有向圖有n(n-1)條邊,則此圖為完全有向圖在圖的鄰接矩陣表達中,有一個記錄各個頂點信息的頂點表,尚有一個表達各個頂點之間關系的鄰接矩陣。鄰接表是鄰接矩陣的改善形式。為此需要把鄰接矩陣的各行分別組織為一個單鏈表。在鄰接表中,同一個頂點發(fā)出的邊鏈接在同一個邊鏈表中,每一個鏈結點代表一條邊(邊結點),結點中有另一頂點的下標dest和指針link。對于帶權圖,邊結點中還要保存該邊的權值cost。頂點表的第i個頂點中保存該頂點的數據,以及它相應邊鏈表的頭指針adj最短途徑問題:假如從圖中某一頂點(稱為源點)另一頂點(稱為終點)的途徑也許不止一條,如何找到一條途徑使得沿此途徑上各邊上的權值總和達成最小。排序:將一組雜亂無章的數據按一定的規(guī)律順次排列起來。數據表(datalist):它是待排序數據元素的有限集合。排序碼(key):通常數據元素有多個屬性域,即多個數據成員組成,其中有一個屬性域可用來區(qū)分元素,作為排序依據。該域即為排序碼。每個數據表用哪個屬性域作為排序碼,要視具體的應用需要而定。插入排序基本方法是:每步將一個待排序的元素,按其排序碼大小,插入到前面已經排好序的一組元素的適當位置上,直到元素所有插入為止。鏈表1、單鏈表中的插入與刪除第一種情況:在第一個結點前插入newnode→link=first;first=newnode;第二種情況:在鏈表中間插入newnode→link=p→link; p→link=newnode;第三種情況:在鏈表末尾插入newnode→link=p→link; ?p→link=last=newnode;2、鏈表插入算法實現3、鏈表結點刪除算法intList::Insert(constintx,constinti){//在鏈表第i個結點處插入新元素xListNode*p=first;intk=0;while(p!=NULL&&k<i-1){p=p→link;k++;}//找第i-1個結點if(p==NULL&&first!=NULL){?cout<<“無效的插入位置!\n”;return0;}?ListNode*newnode=newListNode(x,NULL);//創(chuàng)建新結點,其數據為x,指針為0if(first==NULL||i==0){//插在表前newnode→link=first;???if(first==NULL)last=newnode;?first=newnode;}else{//插在表中或末尾newnode→link=p→link; if(p→link==NULL)last=newnode;p→link=newnode;}return1; ??? ?}intList::Remove(inti){//在鏈表中刪除第i個結點Node*p=first,*q;intk=0;while(p!=NULL&&k<i-1){p=p→link;k++;}//找第i-1個結點if(p==NULL||p→link==NULL){cout<<“無效的刪除位置!\n”;return0;}if(i==0){//刪除表中第1個結點q=first;//q保存被刪結點地址p=first=first→link;//修改first} ?else{??//刪除表中或表尾元素q=p→link;p→link=q→link;//重新鏈接}? ?if(q==last)last=p; //也許修改lastk=q→dat(yī)a;deleteq;//刪除qreturnk; ??}在帶表頭結點的單鏈表,第一個結點前插入新結點newnode→link=p→link;?if(p→link==NULL)last=newnode;p→link=newnode;從帶表頭結點的單鏈表中刪除第一個結點q=p→link;p→link=q→link;deleteq;if(p→link==NULL)last=p;排序直接插入排序的算法折半插入排序的算法#include"dat(yī)aList.h"template<classT>voidInsertSort(dataList<T>&L,intleft,intright){//依次將元素L.Vector[i]按其排序碼插入到有序表//L.Vector[left],…,L.Vector[i-1]中,使得//L.Vector[left]到L.Vector[i]有序。Element<T>temp;inti,j;for(i=left+1;i<=right;i++)if(L[i]<L[i-1]){temp=L[i];j=i-1;do{L[j+1]=L[j];j--;}while(j>=left&&temp<L[j]);L[j+1]=temp;}}; #include"dataList.h"template<classT>voidBinaryInsertSort(dataList<T>&L,constintleft,constintright){//運用折半搜索,在L.Vector[left]到L.Vector[i-1]中//查找L.Vector[i]應插入的位置,再進行插入。Element<T>temp;inti,low,high,middle,k;for(i=left+1;i<=right;i++){temp=L[i];low=left;high=i-1;while(low<=high){ //折半搜索插入位置middle=(low+high)/2;?//取中點if(temp<L[middle])?//插入值小于中點值high=middle-1;?//向左縮社區(qū)間elselow=middle+1;?//否則,向右縮社區(qū)間}for(k=i-1;k>=low;k--)L[k+1]=L[k];?//成塊移動,空出插入位置 L[low]=temp; //插入}};堆排序的算法直接選擇排序的算法template<classT>voidHeapSort(dataList<T>&L){//對表L.Vector[0]到L.Vector[n-1]進行排序,使得表//中各個元素按其排序碼非遞減有序inti,n=L.length();for(i=(n-2)/2;i>=0;i--) //將表轉換為堆siftDown(L,i,n-1); for(i=n-1;i>=0;i--){ ?//對表排序L.Swap(0,i);siftDown(L,0,i-1);}};#include"dataList.h"template<classT>voidSelectSort(dat(yī)aList<T>&L,constintleft,constintright){for(inti=left;i<right;i++){intk=i;/在L[i]到L[n-1]找最小排序碼元素for(intj=i+1;j<=right;j++)if(L[j]<L[k])k=j;if(k!=i)Swap(L[i],L[k]); //互換}};希爾排序的算法起泡排序的算法#include"dat(yī)aList.h"template<classT>voidShellsort(dataList<T>&L,constintleft,constintright){inti,j,gap=right-left+1;??//增量的初始值 Element<T>temp;do{gap=gap/3+1;? //求下一增量值for(i=left+gap;i<=right;i++)if(L[i]<L[i-gap]){??//逆序temp=L[i];j=i-gap;do{L[j+gap]=L[j];j=j-gap;}while(j>=left&&temp<L[j]);L[j+gap]=temp; //將vector[i]回送}}while(gap>1);};template<classT>voidBubbleSort(dataList<T>&L,constintleft,constintright){intpass=left+1,exchange=1;while(pass<=right&&exchange){exchange=0;? //標志為0假定未互換for(intj=right;j>=pass;j--)if(L[j-1]>L[j]){?//逆序Swap(L[j-1],L[j]); //互換 exchange=1;//標志置為1,有互換}pass++;}};兩路歸并算法最大堆的向下調整算

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論