1. 程式人生 > >線性表——順序表——時間複雜度計算2

線性表——順序表——時間複雜度計算2

   接上一篇文章繼續分析

   在之前的文章中的示例1和示例2中,我們通過觀察可以發現,當在順序儲存結構的線性表中某個位置上插入或刪除一個數據元素時,其時間主要耗費在移動元素上(換句話說,移動元素的操作為預估演算法時間複雜度的基本操作),而移動元素的格式取決於插入或刪除元素的位置。

   假設pi是在第i個元素之前插入一個元素的概率,則在長度為n的線性表中插入一個元素時所需移動元素次數的期望值(平均次數)為

(1)

Eis=i=1n+1pi(ni+1)

   假設q_i是刪除第i個元素的概率,則在長度為n的線性表中刪除一個元素時所需移動元素次數的期望值(平均次數)為

(2)

Edl=i=1nqi(ni)

為了不失一般性,我們可以假定線上性表上的任意位置上插入或刪除元素都是等概率的,即

(3)

pi=1n+1,qi=1n

通過(3)我們可以將上面的(1)和(2)進行相應的簡化,其簡化結果為:

(4)

Eis=1n+1i=1n+1(ni+1)=n2

(5)

Edl=1ni=1n(ni)=n12

  時間複雜度的計算規則:

   1.去掉執行時間中的所有加法常數

   2.只保留最高階項

   3.如果最高階項存在且不是1,去掉與這個最高階相乘的常數得到時間複雜度

   由(4)和(5)可知,在順序儲存結構的線性表中插入或刪除一個數據元素,平均約移動一般元素。若表長為n,則演算法listInsert_S

q和listDelete_Sq的時間複雜度都為O(n)。

   在示例1和示例2中的插入操作中,“求表長”和“取第i個數據元素”的時間複雜度均為O(1),又由於插入均在表尾進行,則不需要移動元素,因此它們的執行時間主要取決於查詢函式locateElem的執行時間。

   在示例1中,在順序表L中查訪是否存在和e相同的資料元素的最簡單的方法是,令e和L中的資料元素逐個比較,若L中存在於e相同的元素a1則比較次數為i(1iL.length),否則為L.length,即演算法locateElem_Sq的時間複雜度為O(L.length)。由此對於順序表LA和LB而言,union的時間複雜度為O

(LA.length×LB.length)

  而在示例2中,基本操作主要是給“元素賦值”演算法的時間複雜度為O(LA.length+LB.length)

總結:

  通過上述兩個示例我們不難看出,示例2中的程式其運算的時間複雜度更低,因而程式執行也就會更迅速。究其原因有二:

  1) 由於la與lb中的元素依值遞增(同一集合中元素不等),則在lb中的元素不需要在la中進行從頭至尾的全程搜尋;

  2) 由於用新表lc表示“並集”,則插入操作實際上是藉助於“複製”操作來完成的。

結論:

  若以線性表表示集合並進行集合的各種運算,應該先對錶中的元素進行排序。

其它:

  下面再列出其它各種常用排序的時間複雜度表

這裡寫圖片描述