版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 數據結構</b></p><p><b> 課程設計報告</b></p><p> 題 目 SkipList基本操作 </p><p> 專業(yè)年級 </p><p> 組 員
2、 </p><p> 指導教師 </p><p><b> 目錄</b></p><p> 一.問題描述………………………………………………3</p><p> 二.系統(tǒng)概要設計…………………………………………3</p><p> 1類的
3、設計………………………………………3</p><p> 2主要函數設計…………………………………3</p><p> 三.詳細設計………………………………………………4</p><p> 四.系統(tǒng)測試………………………………………………13</p><p> 五.時間復雜度分析……………………………………… 14</p>
4、<p> 1查找的時間復雜度分析………………………14</p><p> 2插入和刪除的時間復雜度分析………………14</p><p> 六.任務分配………………………………………………14</p><p> 七.參考文獻………………………………………………14</p><p> 八.總結及心得體會……………………………
5、…………15</p><p><b> 一.問題描述</b></p><p> 跳躍表(Skip List)簡單地說是增加了向前指針的鏈表.它是1987年才誕生的一種嶄新的數據結構,通過在有序鏈表上的全部或部分節(jié)點增加額外的指針,來提高搜索性能。在進行查找、插入、刪除等操作時的期望時間復雜度均為O(logn),有著近乎替代平衡樹的本領。而且最重要的一點,就是它的編
6、程復雜度較同類的AVL樹,紅黑樹等要低得多,這使得其無論是在理解還是在推廣性上,都有著十分明顯的優(yōu)勢。</p><p> 跳躍表由多條鏈構成(S0,S1,S2 ……,Sh),且滿足如下三個條件:</p><p> 每條鏈必須包含兩個特殊元素:+∞ 和 -∞</p><p> S0包含所有的元素,并且所有鏈中的元素按照升序排列。</p><p
7、> 每條鏈中的元素集合必須包含于序數較小的鏈的元素集合,即:</p><p> 要求:編程實現跳躍表的初始化、查找、刪除、插入等操作。</p><p><b> 二.系統(tǒng)概要設計</b></p><p><b> 1.類的設計</b></p><p> ?。?)跳表結點類SkipNod
8、e</p><p> ?。?)跳表類SkipList</p><p><b> 私有成員: </b></p><p> maxLevel 允許的跳表最高級別</p><p> level 當前非空鏈的最高級別</p><p> TailKey 最
9、后一個結點里放的正無窮</p><p> SkipNode<T>* head 附加頭結點指針</p><p> SkipNode<T>* tail 附加尾結點指針</p><p> SkipNode<T>** last 每條鏈上的最后一個元素的指針</p><p> setGrad
10、e(int* grade,int L,int H,int lev) 為從L到H之間的元素分配lev級別</p><p> randLevel() 在[0,level]之間隨機產生一個級別</p><p><b> 公有成員: </b></p><p> SkipList(T large,int maxLev) 構造函數
11、</p><p> CreateSkipList(T* A,int n) 創(chuàng)建跳表</p><p> ~SkipList() 析構函數</p><p> Display() 顯示各級鏈表</p><p> SkipNode<T>* Search(T x) 搜索指定元素</p><p>
12、Exist(T x) 判斷元素在跳表中是否存在</p><p> Insert(T x) 跳表中插入元素</p><p> Remove(T x) 刪除跳表中指定值的結點</p><p><b> 2主要函數設計</b></p><p> CreateSkipList(T* A,int n)</p>
13、<p><b> 作用:創(chuàng)建跳表</b></p><p> 參數表:A[] 創(chuàng)建跳躍表的數組</p><p> n 數組元素個數</p><p> 算法思想:跳表的最下層組成一普通單鏈表,第21,2?21, 3?21,…結點鏈接成為第一層鏈接,第22,2?22, 3?22,…成為第二層鏈接…一個有n個元素的跳表有級數
14、level=int(log(n)/log(2)).</p><p> 利用setGrade()函數為每個結點分配級別,并把級別存入grade數組。將A 中數建立各級鏈表。</p><p> (2)Search(T x)</p><p> 作用:搜索指定值的x的結點指針</p><p> 參數表:x 要搜索的元素</p>
15、<p> 算法思想:游標指針從最高級鏈的第一個元素開始,如果找到就返回當前指針,如果x比當前結點大就繼續(xù)向后,如果比當前結點小就降級,若未找到就返回尾指針的值。</p><p> (3)Exist(T x)</p><p> 作用:判斷元素是否存在</p><p> 參數表:x 要判斷的元素</p><p> 算法思想
16、:原理同Search(T x),返回值不同。</p><p> ?。?)Insert(T x)將</p><p><b> 作用:元素插入跳表</b></p><p> 參數表:x 要插入的元素</p><p> 算法思想:從最高級別開始向下搜索,如果x小于ptr下個結點的值,將當前ptr記錄到數組中,到下級搜索
17、,如果大于則繼續(xù)搜索,為插入的結點分配級別后插入各級鏈表中</p><p> ?。?)Remove(T x)</p><p> 作用:從鏈表中刪除元素</p><p> 參數表:x要刪除的元素</p><p> 算法思想:從最高級別開始向下搜索,找到后記錄下當前刪除節(jié)點的前驅指針,繼續(xù)降級,從各級鏈表中刪除</p><
18、;p><b> 三.詳細設計</b></p><p> #include<iostream.h></p><p> #include<stdlib.h></p><p> #include<cmath></p><p> #include<ctime><
19、;/p><p> #define DefaultSize 12</p><p> //SkipNode結構 跳表的結點聲明和定義,E為結點數據域類型,K為關鍵碼的類型</p><p> template<class T></p><p> struct SkipNode</p><p><b&g
20、t; {</b></p><p> T data; //數據域</p><p> SkipNode<T>** link; //指針域數組</p><p> SkipNode(T x,int size=DefaultSize)//構造函數</p>
21、<p><b> {</b></p><p><b> data=x;</b></p><p> link=new SkipNode<T>*[size];</p><p> //如果內存分配失敗</p><p> if(link==NULL)</p>
22、<p><b> {</b></p><p> cout<<"內存分配失敗!"<<endl;</p><p><b> exit(1);</b></p><p><b> };</b></p><p> //把指
23、針數組初始化為NULL</p><p> for(int i=0;i<size;i++)</p><p> link[i]=NULL;</p><p><b> };</b></p><p> ~SkipNode() //析構函數</p><p&
24、gt; {delete [] link;};</p><p><b> };</b></p><p> //SkipList類模板 跳表的類模板即通過多級鏈表的組織方式提高搜索的效率,0級鏈表的排列順序是從左到右升序</p><p> template<class T></p><p> clas
25、s SkipList</p><p><b> {</b></p><p><b> private:</b></p><p> int maxLevel; //允許的跳表最高級別</p><p> int level; //當前非空鏈的最高級別</p
26、><p> T TailKey; //最后一個結點里放的正無窮</p><p> SkipNode<T>* head; //附加頭結點指針</p><p> SkipNode<T>* tail; //附加尾結點指針</p><p> SkipNode<T>** last;
27、//每條鏈上的最后一個元素的指針</p><p> //為從L到H之間的元素分配lev級別</p><p> void setGrade(int* grade,int L,int H,int lev);</p><p> //在[0,level]之間隨機產生一個級別</p><p> int randLevel();</p>
28、;<p><b> public:</b></p><p><b> //構造函數</b></p><p> SkipList(T large,int maxLev);</p><p> //通過描述數組來創(chuàng)建一個跳表</p><p> void CreateSkipList
29、(T* A,int n);</p><p><b> //析構函數</b></p><p> ~SkipList();</p><p> //顯示各級鏈表的內容</p><p> void Display();</p><p> //搜索指定內容x的結點</p><p
30、> SkipNode<T>* Search(T x);</p><p> //判斷元素在跳表中是否存在</p><p> bool Exist(T x);</p><p> //把指定的元素x插入到當前的跳表中去</p><p> bool Insert(T x);</p><p> //
31、刪除跳表中指定值的結點</p><p> bool Remove(T x);</p><p><b> };</b></p><p> //構造函數 構造一個空鏈表</p><p> template<class T></p><p> SkipList<T>:
32、:SkipList(T large,int maxLev)</p><p><b> {</b></p><p> maxLevel=maxLev; //初始化最高級別</p><p> level=0; //當前初始級別為0級</p><p> TailKey=large;
33、 //為結點中的最大關鍵碼</p><p><b> //創(chuàng)建附加頭結點</b></p><p> head=new SkipNode<T>(-1000,maxLevel+1);</p><p> //創(chuàng)建一個附加尾結點</p><p> tail=new SkipNode<T>(T
34、ailKey,maxLevel+1);</p><p> //為last數組開辟內存,并進行初始化</p><p> last=new SkipNode<T>*[maxLevel];</p><p> for(int i=0;i<=maxLevel;i++)</p><p> last[i]=head;</p&
35、gt;<p> //讓head附加頭結點里的指針全部指向tail,表示鏈表空</p><p> for(i=0;i<=maxLevel;i++)</p><p> head->link[i]=tail;</p><p><b> };</b></p><p> //析構函數,釋放跳表的
36、內存空間</p><p> template<class T></p><p> SkipList<T>::~SkipList()</p><p><b> {</b></p><p><b> //游標指針</b></p><p> Ski
37、pNode<T>* ptr=head;</p><p> SkipNode<T>* pre=head;</p><p> //依次刪除每個結點</p><p> while(pre!=NULL)</p><p><b> {</b></p><p> //把ptr
38、先移到后面的鏈表頭</p><p> ptr=ptr->link[0];</p><p> //釋放pre結點的空間</p><p> delete pre;</p><p><b> pre=ptr;</b></p><p><b> };</b></
39、p><p><b> };</b></p><p> //Display()公有成員函數,顯示各級鏈表的內容</p><p> template<class T></p><p> void SkipList<T>::Display()</p><p><b>
40、; {</b></p><p><b> //游標指針</b></p><p> SkipNode<T>* ptr=head;</p><p><b> //遍歷各級鏈表</b></p><p> for(int i=0;i<=level;i++)</p
41、><p><b> {</b></p><p> cout<<i<<"級鏈:";</p><p> ptr=head->link[i];</p><p> while(ptr!=tail)</p><p><b> {</b&
42、gt;</p><p> cout<<ptr->data<<" ";</p><p> ptr=ptr->link[i];</p><p><b> }</b></p><p> cout<<endl;</p><p>&
43、lt;b> };</b></p><p><b> };</b></p><p> //CreateSkipList()公有成員函數,通過描述數組串創(chuàng)建跳表</p><p> template<class T></p><p> void SkipList<T>::Cr
44、eateSkipList(T* A,int n)</p><p><b> { </b></p><p> int* grade=new int[n]; //存放級數的數組</p><p> for(int i=0;i<n;i++) //把級別數組初始化為0</p><p> grade[
45、i]=0;</p><p> level=int(log(n)/log(2));//根據n求最大級別</p><p> //為每個結點分配級別,并把級別存入grade數組</p><p> setGrade(grade,0,n-1,level);</p><p> //先把A中的取出來建立各級鏈表</p><p&g
46、t; for(i=0;i<n;i++)</p><p><b> {</b></p><p><b> //新建一個結點</b></p><p> SkipNode<T>* newNode=new SkipNode<T>(A[i]);</p><p> //建
47、立第i個結點的各級鏈表</p><p> for(int j=0;j<=grade[i];j++)</p><p><b> {</b></p><p><b> //掛入第j級鏈中</b></p><p> last[j]->link[j]=newNode;</p>
48、<p> //第j級游標指針向后推進</p><p> last[j]=newNode;</p><p><b> };</b></p><p><b> };</b></p><p><b> //掛上附加尾結點</b></p><
49、p> for(i=0;i<=level;i++)</p><p> last[i]->link[i]=tail;</p><p> //釋放grade數組的空間</p><p> delete [] grade;</p><p><b> };</b></p><p>
50、 //Search()公有成員函數,在跳表中搜索指定值x的元素的結點指針</p><p> template<class T></p><p> SkipNode<T>* SkipList<T>::Search(T x)</p><p><b> {</b></p><p>
51、 //游標指針從最高級鏈的第一個元素開始</p><p> SkipNode<T>* ptr=head->link[level];</p><p> //當前級別鏈表的回溯指針</p><p> SkipNode<T>* base=head;</p><p> int grade=level;</p
52、><p> //從最高級鏈開始依次往下搜索</p><p> //在第grade級鏈中進行搜索</p><p> while(base!=tail && grade!=-1)</p><p><b> {</b></p><p> //如果找到就返回當前結點指針</p&
53、gt;<p> if(x==ptr->data)</p><p> return ptr;</p><p> //如果x比當前結點大,就繼續(xù)向后</p><p> else if(x>ptr->data)</p><p><b> {</b></p><p&g
54、t;<b> base=ptr;</b></p><p> ptr=ptr->link[grade];</p><p><b> }</b></p><p> //如果x比當前結點小,就降級</p><p> else if(x<ptr->data)</p>
55、<p><b> {</b></p><p> //從次級的base重新開始搜索</p><p><b> grade--;</b></p><p> ptr=base->link[grade];</p><p><b> };</b></p&
56、gt;<p><b> };</b></p><p> //如果沒有找到就返回尾指針的值</p><p> return tail;</p><p><b> };</b></p><p> //Exist()公有成員函數,判斷元素x在當前跳表中是否存在</p>
57、<p> template<class T></p><p> bool SkipList<T>::Exist(T x)</p><p><b> {</b></p><p> //游標指針從最高級鏈的第一個元素開始</p><p> SkipNode<T>* p
58、tr=head->link[level];</p><p> //當前級別鏈表的回溯指針</p><p> SkipNode<T>* base=head;</p><p> int grade=level;</p><p> //從最高級鏈開始依次往下搜索</p><p> //在第grad
59、e級鏈中進行搜索</p><p> while(base!=tail && grade!=-1)</p><p><b> {</b></p><p> //如果找到就返回真</p><p> if(x==ptr->data)</p><p> return tru
60、e;</p><p> //如果x比當前結點大,就繼續(xù)向后</p><p> else if(x>ptr->data)</p><p><b> {</b></p><p><b> base=ptr;</b></p><p> ptr=ptr->
61、link[grade];</p><p><b> }</b></p><p> //如果x比當前結點小,就降級</p><p> else if(x<ptr->data)</p><p><b> {</b></p><p> //從次級的base重新
62、開始搜索</p><p><b> grade--;</b></p><p> ptr=base->link[grade];</p><p><b> };</b></p><p><b> };</b></p><p> //如果沒有找
63、到就返回假</p><p> return false;</p><p><b> };</b></p><p> //Insert()公有成員函數,把元素x插入到當前的跳表中去,成功就返回true</p><p> template<class T></p><p> bo
64、ol SkipList<T>::Insert(T x)</p><p><b> {</b></p><p> //如果元素已經存在就返回false</p><p> if(Exist(x)||x>TailKey)</p><p> return false;</p><p&
65、gt; //為新元素創(chuàng)建新的結點</p><p> SkipNode<T>* newNode=new SkipNode<T>(x);</p><p> //用于存放要插入的結點前在各級鏈表中的指針</p><p> SkipNode<T>** preLoc=new SkipNode<T>*[level+1];&
66、lt;/p><p><b> //游標指針</b></p><p> SkipNode<T>* ptr=head;</p><p> //從最高級別開始向下搜索</p><p> int grade=level;</p><p> //尋找新結點在各級鏈表中插入位置</p&
67、gt;<p> while(grade!=-1)</p><p><b> {</b></p><p> //如果x小于ptr下個結點的值</p><p> if(x<ptr->link[grade]->data)</p><p><b> {</b><
68、;/p><p> //把當前的ptr記錄到preLoc數組中</p><p> preLoc[grade]=ptr;</p><p> //來到下級鏈繼續(xù)進行搜索</p><p><b> grade--;</b></p><p><b> }</b></p>
69、;<p> //如果x大于ptr下個結點的值</p><p> else if(x>ptr->link[grade]->data)</p><p> ptr=ptr->link[grade];</p><p><b> };</b></p><p> //為待插入的結點隨機
70、分配級別</p><p> int g=randLevel();</p><p> //把新結點newNode插入到各級鏈表中</p><p> for(int i=g;i>=0;i--)</p><p><b> {</b></p><p> //把新結點掛入第i級鏈表中<
71、/p><p> newNode->link[i]=preLoc[i]->link[i];</p><p> preLoc[i]->link[i]=newNode;</p><p><b> };</b></p><p> return true;</p><p><b&
72、gt; };</b></p><p> Remove()公有成員函數,刪除跳表中指定值的元素結點</p><p> template<class T></p><p> bool SkipList<T>::Remove(T x)</p><p><b> {</b></
73、p><p> //如果指定的元素不存在</p><p> if(!Exist(x))</p><p> return false;</p><p> //用于存放要刪除的結點前在各級鏈表中的指針</p><p> SkipNode<T>** preLoc=new SkipNode<T>*[
74、level+1];</p><p> //把該數組初始化為NULL</p><p> for(int i=0;i<=level+1;i++)</p><p> preLoc[i]=NULL;</p><p><b> //游標指針</b></p><p> SkipNode<
75、T>* ptr=head;</p><p> //從最高級別開始向下搜索</p><p> int grade=level;</p><p> //尋找新結點在各級鏈表中插入位置</p><p> while(grade!=-1)</p><p><b> {</b></p&
76、gt;<p> //如果x小于ptr下個結點的值</p><p> if(ptr->link[grade]->data>x)</p><p> //x在當前級的鏈表中不存在,</p><p> //來到下級鏈繼續(xù)進行搜索</p><p><b> grade--;</b><
77、/p><p> //如果x大于ptr下個結點的值</p><p> else if(ptr->link[grade]->data<x)</p><p> ptr=ptr->link[grade];</p><p> //如果等于ptr下個結點的值</p><p> else if(ptr-
78、>link[grade]->data==x)</p><p><b> {</b></p><p> //記錄下當前要刪除結點的前驅指針</p><p> preLoc[grade]=ptr;</p><p><b> //繼續(xù)降級</b></p><p>
79、;<b> grade--;</b></p><p><b> };</b></p><p><b> };</b></p><p> //把該元素在各級鏈中進行刪除</p><p> for(i=0;preLoc[i]!=NULL;i++)</p>&
80、lt;p> preLoc[i]->link[i]=preLoc[i]->link[i]->link[i];</p><p> return true;</p><p><b> };</b></p><p> setGrade()私有成員函數,把下表從L到H的結點分配lev的級數</p><p
81、> template<class T></p><p> void SkipList<T>::setGrade(int* grade,int L,int H,int lev)</p><p><b> {</b></p><p> //如果下界小于上界</p><p> if(L&
82、lt;H && lev>0)</p><p><b> {</b></p><p><b> //取中間元素</b></p><p> int q=int((L+H)/2);</p><p> //設置該元素的級別</p><p> grade
83、[q]=lev;</p><p> //遞歸設置q左右的結點</p><p> setGrade(grade,L,q-1,lev-1);</p><p> setGrade(grade,q+1,H,lev-1);</p><p><b> };</b></p><p><b>
84、 };</b></p><p> //randLevel()私有成員函數,在[0,level]之間隨機產生一個級別</p><p> template<class T></p><p> int SkipList<T>::randLevel()</p><p><b> {</b&g
85、t;</p><p> srand(time(0));</p><p> return rand()%(level+1);</p><p><b> };</b></p><p> void main()</p><p><b> {</b></p>
86、<p> int e=1000,d=4;</p><p> SkipList<int> s(e,d);</p><p> int sp[12]={1,3,5,12,15,18,21,32,35,45,55,66};</p><p> s.CreateSkipList(sp,12); //產生跳表</p><p>
87、 s.Display();//輸出原始跳表</p><p><b> int k=1;</b></p><p> while(k!=4) //操作菜單的設計</p><p><b> {</b></p><p> cout<<"1.搜索元素\n";<
88、/p><p> cout<<"2.刪除元素\n";</p><p> cout<<"3.添加元素\n";</p><p> cout<<"4.結束操作\n";</p><p><b> cin>>k;</b>&
89、lt;/p><p><b> switch(k)</b></p><p><b> {</b></p><p> case 1:cout<<"輸入搜索的元素"<<endl;</p><p><b> int a;</b><
90、/p><p><b> cin>>a; </b></p><p> if(s.Search(a)->data==1000)</p><p> {cout<<"該值不存在!\n"<<'\n';}</p><p><b> else
91、</b></p><p><b> {</b></p><p> cout<<"元素:"<<s.Search(a)->data<<"存在\n"<<'\n';</p><p><b> }</b>&
92、lt;/p><p><b> break;</b></p><p> case 2:cout<<"輸入刪除的元素"<<endl;</p><p><b> int b;</b></p><p><b> cin>>b;</
93、b></p><p> if(s.Search(b)->data==1000)</p><p> {cout<<"該值不存在!\n"<<'\n';}</p><p><b> else</b></p><p><b> {<
94、/b></p><p> s.Remove(b);</p><p> cout<<"刪除后跳表顯示:"<<endl;</p><p> s.Display();</p><p><b> }</b></p><p><b> b
95、reak;</b></p><p> case 3:cout<<"輸入添加的元素"<<endl;</p><p><b> int c;</b></p><p><b> cin>>c;</b></p><p> if(s
96、.Search(b)->data!=1000)</p><p><b> {</b></p><p> cout<<"添加的值已經存在\n";</p><p><b> }</b></p><p><b> else</b><
97、/p><p><b> {</b></p><p> s.Insert(c);</p><p> cout<<"添加后跳表顯示:"<<endl;</p><p> s.Display();</p><p><b> }</b>
98、</p><p><b> break;</b></p><p><b> case 4:;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }&
99、lt;/b></p><p><b> 四.系統(tǒng)測試</b></p><p><b> 五.時間復雜度分析</b></p><p> 1.查找的時間復雜度分析O(logn)</p><p> 我們采用逆向分析的方法。假設我們現在在目標節(jié)點,想要走到跳躍表最左上方的開始節(jié)點。這條路徑的長
100、度,即可理解為查找的時間復雜度。</p><p> 設當前在第i層第j列那個節(jié)點上。</p><p> 如果第j列恰好只有i層(對應插入這個元素時第i次調用隨機化模塊時所產生的B決策,概率為1-p),則當前這個位置必然是從左方的某個節(jié)點向右跳過來的。</p><p> 如果第j列的層數大于i(對應插入這個元素時第i次調用隨機化模塊時所產生的A決策,概率為p),
101、則當前這個位置必然是從上方跳下來的。(不可能從左方來,否則在以前就已經跳到當前節(jié)點上方的節(jié)點了,不會跳到當前節(jié)點左方的節(jié)點)</p><p> 設C(k)為向上跳k層的期望步數(包括橫向跳躍)</p><p><b> 有:</b></p><p><b> C(0) = 0</b></p><p
102、> C(k) = (1-p)(1+向左跳躍之后的步數)+p(1+向上跳躍之后的步數)</p><p> = (1-p)(1+C(k)) + p(1+C(k-1))</p><p> C(k) = 1/p + C(k-1)</p><p> C(k) = k/p</p><p> 每個元素插入到第i層(Si)的概率為p^i
103、60;,則在第i層插入的期望元素個數為np^(i-1)。h層的元素期望個數為 np^0+np^1+...+np^(h-1),當n取較大數時,這個式子的值接近0,故跳躍表的高度為O(logn)級別,故查找的復雜度也為logn級別。</p><p> 對于記憶化查找(Search with fingers)技術我們可以采用類似的方法分析,很容易得出它的復雜度是O(logk)的(其中k為此次與前一次兩個被查
104、找元素在跳躍表中位置的距離)。</p><p> 2.插入和刪除的時間復雜度分析O(logn)</p><p> 插入和刪除都由查找和更新兩部分構成。查找的時間復雜度為O(logn),更新部分的復雜度又與跳躍表的高度成正比,即也為O(logn)。所以,插入和刪除操作的時間復雜度都為O(logn)</p><p><b> 六.任務分配</b&g
105、t;</p><p> 此次本小組共3個成員,任務分配如下:</p><p> XXX:主要負責跳表的初始化,主函數的編寫</p><p> XXX:主要負責跳表的查找和插入功能的編寫</p><p> XXX:主要負責跳表的刪除功能的編寫及整個程序的整合</p><p><b> 七.參考文獻&l
106、t;/b></p><p> 1.《數據結構(C++版)》</p><p> 2.《Visual C++程序設計》</p><p> 3.《數據結構課程設計實例》</p><p><b> 八.總結及心得體會</b></p><p> 剛拿到這個題目的時候,我們花了很長的時間,研究
107、這個結構.從最初的模糊,然后收集整理資料,經過討論,到最后的構造.我們收獲了很多.</p><p> 經過這次的課程設計,我們加深了對書本上普通鏈表的理解,同時也對skip list跳表有了一定的深入了解,理解了跳表的原理,跳表的查找,插入,刪除等基本操作原理。以及跳表在時間復雜度上的優(yōu)勢。對我們自身而言,也是一種編程水平的提高,同時也培養(yǎng)了我們的團隊合作能力。以后我們也會多加練習編寫程序的能力,培養(yǎng)獨立思考,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數據結構課程設計報告---鏈表操作
- 數據結構課程設計報告---鏈表操作
- 數據結構課程設計-鏈表操作
- 數據結構課程設計---鏈表操作
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 數據結構課程設計報告
- 《數據結構》課程設計報告
- 數據結構課程設計報告
- 單鏈表的基本操作迷宮問題數據結構課程設計
- 數據結構-串的存儲表示及基本操作--課程設計-實驗報告
- 數據結構課程設計--數據結構課程設計----huffman編碼
- 數據結構課程設計——課程設計報告模板
- 數據結構課程設計報告 (2)
評論
0/150
提交評論