2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)</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主要函數(shù)設計…………………………………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>  八.總結(jié)及心得體會……………………………

5、…………15</p><p><b>  一.問題描述</b></p><p>  跳躍表(Skip List)簡單地說是增加了向前指針的鏈表.它是1987年才誕生的一種嶄新的數(shù)據(jù)結(jié)構(gòu),通過在有序鏈表上的全部或部分節(jié)點增加額外的指針,來提高搜索性能。在進行查找、插入、刪除等操作時的期望時間復雜度均為O(logn),有著近乎替代平衡樹的本領(lǐng)。而且最重要的一點,就是它的編

6、程復雜度較同類的AVL樹,紅黑樹等要低得多,這使得其無論是在理解還是在推廣性上,都有著十分明顯的優(yōu)勢。</p><p>  跳躍表由多條鏈構(gòu)成(S0,S1,S2 ……,Sh),且滿足如下三個條件:</p><p>  每條鏈必須包含兩個特殊元素:+∞ 和 -∞</p><p>  S0包含所有的元素,并且所有鏈中的元素按照升序排列。</p><p

7、>  每條鏈中的元素集合必須包含于序數(shù)較小的鏈的元素集合,即:</p><p>  要求:編程實現(xiàn)跳躍表的初始化、查找、刪除、插入等操作。</p><p><b>  二.系統(tǒng)概要設計</b></p><p><b>  1.類的設計</b></p><p> ?。?)跳表結(jié)點類SkipNod

8、e</p><p> ?。?)跳表類SkipList</p><p><b>  私有成員: </b></p><p>  maxLevel 允許的跳表最高級別</p><p>  level 當前非空鏈的最高級別</p><p>  TailKey 最

9、后一個結(jié)點里放的正無窮</p><p>  SkipNode<T>* head 附加頭結(jié)點指針</p><p>  SkipNode<T>* tail 附加尾結(jié)點指針</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]之間隨機產(chǎn)生一個級別</p><p><b>  公有成員: </b></p><p>  SkipList(T large,int maxLev) 構(gòu)造函數(shù)

11、</p><p>  CreateSkipList(T* A,int n) 創(chuàng)建跳表</p><p>  ~SkipList() 析構(gòu)函數(shù)</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) 刪除跳表中指定值的結(jié)點</p><p><b>  2主要函數(shù)設計</b></p><p>  CreateSkipList(T* A,int n)</p>

13、<p><b>  作用:創(chuàng)建跳表</b></p><p>  參數(shù)表:A[] 創(chuàng)建跳躍表的數(shù)組</p><p>  n 數(shù)組元素個數(shù)</p><p>  算法思想:跳表的最下層組成一普通單鏈表,第21,2?21, 3?21,…結(jié)點鏈接成為第一層鏈接,第22,2?22, 3?22,…成為第二層鏈接…一個有n個元素的跳表有級數(shù)

14、level=int(log(n)/log(2)).</p><p>  利用setGrade()函數(shù)為每個結(jié)點分配級別,并把級別存入grade數(shù)組。將A 中數(shù)建立各級鏈表。</p><p> ?。?)Search(T x)</p><p>  作用:搜索指定值的x的結(jié)點指針</p><p>  參數(shù)表:x 要搜索的元素</p>

15、<p>  算法思想:游標指針從最高級鏈的第一個元素開始,如果找到就返回當前指針,如果x比當前結(jié)點大就繼續(xù)向后,如果比當前結(jié)點小就降級,若未找到就返回尾指針的值。</p><p> ?。?)Exist(T x)</p><p>  作用:判斷元素是否存在</p><p>  參數(shù)表:x 要判斷的元素</p><p>  算法思想

16、:原理同Search(T x),返回值不同。</p><p>  (4)Insert(T x)將</p><p><b>  作用:元素插入跳表</b></p><p>  參數(shù)表:x 要插入的元素</p><p>  算法思想:從最高級別開始向下搜索,如果x小于ptr下個結(jié)點的值,將當前ptr記錄到數(shù)組中,到下級搜索

17、,如果大于則繼續(xù)搜索,為插入的結(jié)點分配級別后插入各級鏈表中</p><p> ?。?)Remove(T x)</p><p>  作用:從鏈表中刪除元素</p><p>  參數(shù)表:x要刪除的元素</p><p>  算法思想:從最高級別開始向下搜索,找到后記錄下當前刪除節(jié)點的前驅(qū)指針,繼續(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結(jié)構(gòu) 跳表的結(jié)點聲明和定義,E為結(jié)點數(shù)據(jù)域類型,K為關(guān)鍵碼的類型</p><p>  template<class T></p><p>  struct SkipNode</p><p><b&g

20、t;  {</b></p><p>  T data; //數(shù)據(jù)域</p><p>  SkipNode<T>** link; //指針域數(shù)組</p><p>  SkipNode(T x,int size=DefaultSize)//構(gòu)造函數(shù)</p>

21、<p><b>  {</b></p><p><b>  data=x;</b></p><p>  link=new SkipNode<T>*[size];</p><p>  //如果內(nèi)存分配失敗</p><p>  if(link==NULL)</p>

22、<p><b>  {</b></p><p>  cout<<"內(nèi)存分配失敗!"<<endl;</p><p><b>  exit(1);</b></p><p><b>  };</b></p><p>  //把指

23、針數(shù)組初始化為NULL</p><p>  for(int i=0;i<size;i++)</p><p>  link[i]=NULL;</p><p><b>  };</b></p><p>  ~SkipNode() //析構(gòu)函數(shù)</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; //最后一個結(jié)點里放的正無窮</p><p>  SkipNode<T>* head; //附加頭結(jié)點指針</p><p>  SkipNode<T>* tail; //附加尾結(jié)點指針</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]之間隨機產(chǎn)生一個級別</p><p>  int randLevel();</p>

28、;<p><b>  public:</b></p><p><b>  //構(gòu)造函數(shù)</b></p><p>  SkipList(T large,int maxLev);</p><p>  //通過描述數(shù)組來創(chuàng)建一個跳表</p><p>  void CreateSkipList

29、(T* A,int n);</p><p><b>  //析構(gòu)函數(shù)</b></p><p>  ~SkipList();</p><p>  //顯示各級鏈表的內(nèi)容</p><p>  void Display();</p><p>  //搜索指定內(nèi)容x的結(jié)點</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、刪除跳表中指定值的結(jié)點</p><p>  bool Remove(T x);</p><p><b>  };</b></p><p>  //構(gòu)造函數(shù) 構(gòu)造一個空鏈表</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、 //為結(jié)點中的最大關(guān)鍵碼</p><p><b>  //創(chuàng)建附加頭結(jié)點</b></p><p>  head=new SkipNode<T>(-1000,maxLevel+1);</p><p>  //創(chuàng)建一個附加尾結(jié)點</p><p>  tail=new SkipNode<T>(T

34、ailKey,maxLevel+1);</p><p>  //為last數(shù)組開辟內(nèi)存,并進行初始化</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附加頭結(jié)點里的指針全部指向tail,表示鏈表空</p><p>  for(i=0;i<=maxLevel;i++)</p><p>  head->link[i]=tail;</p><p><b>  };</b></p><p>  //析構(gòu)函數(shù),釋放跳表的

36、內(nèi)存空間</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>  //依次刪除每個結(jié)點</p><p>  while(pre!=NULL)</p><p><b>  {</b></p><p>  //把ptr

38、先移到后面的鏈表頭</p><p>  ptr=ptr->link[0];</p><p>  //釋放pre結(jié)點的空間</p><p>  delete pre;</p><p><b>  pre=ptr;</b></p><p><b>  };</b></

39、p><p><b>  };</b></p><p>  //Display()公有成員函數(shù),顯示各級鏈表的內(nèi)容</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()公有成員函數(shù),通過描述數(shù)組串創(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]; //存放級數(shù)的數(shù)組</p><p>  for(int i=0;i<n;i++) //把級別數(shù)組初始化為0</p><p>  grade[

45、i]=0;</p><p>  level=int(log(n)/log(2));//根據(jù)n求最大級別</p><p>  //為每個結(jié)點分配級別,并把級別存入grade數(shù)組</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>  //新建一個結(jié)點</b></p><p>  SkipNode<T>* newNode=new SkipNode<T>(A[i]);</p><p>  //建

47、立第i個結(jié)點的各級鏈表</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>  //掛上附加尾結(jié)點</b></p><

49、p>  for(i=0;i<=level;i++)</p><p>  last[i]->link[i]=tail;</p><p>  //釋放grade數(shù)組的空間</p><p>  delete [] grade;</p><p><b>  };</b></p><p>

50、  //Search()公有成員函數(shù),在跳表中搜索指定值x的元素的結(jié)點指針</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>  //如果找到就返回當前結(jié)點指針</p&

53、gt;<p>  if(x==ptr->data)</p><p>  return ptr;</p><p>  //如果x比當前結(jié)點大,就繼續(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比當前結(jié)點小,就降級</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()公有成員函數(shù),判斷元素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比當前結(jié)點大,就繼續(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比當前結(jié)點小,就降級</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()公有成員函數(shù),把元素x插入到當前的跳表中去,成功就返回true</p><p>  template<class T></p><p>  bo

64、ol SkipList<T>::Insert(T x)</p><p><b>  {</b></p><p>  //如果元素已經(jīng)存在就返回false</p><p>  if(Exist(x)||x>TailKey)</p><p>  return false;</p><p&

65、gt;  //為新元素創(chuàng)建新的結(jié)點</p><p>  SkipNode<T>* newNode=new SkipNode<T>(x);</p><p>  //用于存放要插入的結(jié)點前在各級鏈表中的指針</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>  //尋找新結(jié)點在各級鏈表中插入位置</p&

67、gt;<p>  while(grade!=-1)</p><p><b>  {</b></p><p>  //如果x小于ptr下個結(jié)點的值</p><p>  if(x<ptr->link[grade]->data)</p><p><b>  {</b><

68、;/p><p>  //把當前的ptr記錄到preLoc數(shù)組中</p><p>  preLoc[grade]=ptr;</p><p>  //來到下級鏈繼續(xù)進行搜索</p><p><b>  grade--;</b></p><p><b>  }</b></p>

69、;<p>  //如果x大于ptr下個結(jié)點的值</p><p>  else if(x>ptr->link[grade]->data)</p><p>  ptr=ptr->link[grade];</p><p><b>  };</b></p><p>  //為待插入的結(jié)點隨機

70、分配級別</p><p>  int g=randLevel();</p><p>  //把新結(jié)點newNode插入到各級鏈表中</p><p>  for(int i=g;i>=0;i--)</p><p><b>  {</b></p><p>  //把新結(jié)點掛入第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()公有成員函數(shù),刪除跳表中指定值的元素結(jié)點</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>  //用于存放要刪除的結(jié)點前在各級鏈表中的指針</p><p>  SkipNode<T>** preLoc=new SkipNode<T>*[

74、level+1];</p><p>  //把該數(shù)組初始化為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>  //尋找新結(jié)點在各級鏈表中插入位置</p><p>  while(grade!=-1)</p><p><b>  {</b></p&

76、gt;<p>  //如果x小于ptr下個結(jié)點的值</p><p>  if(ptr->link[grade]->data>x)</p><p>  //x在當前級的鏈表中不存在,</p><p>  //來到下級鏈繼續(xù)進行搜索</p><p><b>  grade--;</b><

77、/p><p>  //如果x大于ptr下個結(jié)點的值</p><p>  else if(ptr->link[grade]->data<x)</p><p>  ptr=ptr->link[grade];</p><p>  //如果等于ptr下個結(jié)點的值</p><p>  else if(ptr-

78、>link[grade]->data==x)</p><p><b>  {</b></p><p>  //記錄下當前要刪除結(jié)點的前驅(qū)指針</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()私有成員函數(shù),把下表從L到H的結(jié)點分配lev的級數(shù)</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左右的結(jié)點</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()私有成員函數(shù),在[0,level]之間隨機產(chǎn)生一個級別</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); //產(chǎn)生跳表</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.結(jié)束操作\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<<"添加的值已經(jīng)存在\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>  我們采用逆向分析的方法。假設我們現(xiàn)在在目標節(jié)點,想要走到跳躍表最左上方的開始節(jié)點。這條路徑的長

100、度,即可理解為查找的時間復雜度。</p><p>  設當前在第i層第j列那個節(jié)點上。</p><p>  如果第j列恰好只有i層(對應插入這個元素時第i次調(diào)用隨機化模塊時所產(chǎn)生的B決策,概率為1-p),則當前這個位置必然是從左方的某個節(jié)點向右跳過來的。</p><p>  如果第j列的層數(shù)大于i(對應插入這個元素時第i次調(diào)用隨機化模塊時所產(chǎn)生的A決策,概率為p),

101、則當前這個位置必然是從上方跳下來的。(不可能從左方來,否則在以前就已經(jīng)跳到當前節(jié)點上方的節(jié)點了,不會跳到當前節(jié)點左方的節(jié)點)</p><p>  設C(k)為向上跳k層的期望步數(shù)(包括橫向跳躍)</p><p><b>  有:</b></p><p><b>  C(0) = 0</b></p><p

102、>  C(k) = (1-p)(1+向左跳躍之后的步數(shù))+p(1+向上跳躍之后的步數(shù))</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層插入的期望元素個數(shù)為np^(i-1)。h層的元素期望個數(shù)為 np^0+np^1+...+np^(h-1),當n取較大數(shù)時,這個式子的值接近0,故跳躍表的高度為O(logn)級別,故查找的復雜度也為logn級別。</p><p>  對于記憶化查找(Search with fingers)技術(shù)我們可以采用類似的方法分析,很容易得出它的復雜度是O(logk)的(其中k為此次與前一次兩個被查

104、找元素在跳躍表中位置的距離)。</p><p>  2.插入和刪除的時間復雜度分析O(logn)</p><p>  插入和刪除都由查找和更新兩部分構(gòu)成。查找的時間復雜度為O(logn),更新部分的復雜度又與跳躍表的高度成正比,即也為O(logn)。所以,插入和刪除操作的時間復雜度都為O(logn)</p><p><b>  六.任務分配</b&g

105、t;</p><p>  此次本小組共3個成員,任務分配如下:</p><p>  XXX:主要負責跳表的初始化,主函數(shù)的編寫</p><p>  XXX:主要負責跳表的查找和插入功能的編寫</p><p>  XXX:主要負責跳表的刪除功能的編寫及整個程序的整合</p><p><b>  七.參考文獻&l

106、t;/b></p><p>  1.《數(shù)據(jù)結(jié)構(gòu)(C++版)》</p><p>  2.《Visual C++程序設計》</p><p>  3.《數(shù)據(jù)結(jié)構(gòu)課程設計實例》</p><p><b>  八.總結(jié)及心得體會</b></p><p>  剛拿到這個題目的時候,我們花了很長的時間,研究

107、這個結(jié)構(gòu).從最初的模糊,然后收集整理資料,經(jīng)過討論,到最后的構(gòu)造.我們收獲了很多.</p><p>  經(jīng)過這次的課程設計,我們加深了對書本上普通鏈表的理解,同時也對skip list跳表有了一定的深入了解,理解了跳表的原理,跳表的查找,插入,刪除等基本操作原理。以及跳表在時間復雜度上的優(yōu)勢。對我們自身而言,也是一種編程水平的提高,同時也培養(yǎng)了我們的團隊合作能力。以后我們也會多加練習編寫程序的能力,培養(yǎng)獨立思考,

溫馨提示

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

評論

0/150

提交評論