1. 程式人生 > 程式設計 >Java針對封裝陣列的簡單複雜度分析方法

Java針對封裝陣列的簡單複雜度分析方法

本文例項講述了Java針對封裝陣列的簡單複雜度分析方法。分享給大家供大家參考,具體如下:

完成了陣列的封裝之後我們還需對其進行復雜度分析:

此處的複雜度分析主要是指時間複雜度分析,演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很好反映出演算法的優劣與否。

1.簡單概念

在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間複雜度為O(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為O(n2)。 按數量級遞增排列,常見的時間複雜度有:常數階O(1),對數階O(log2

n),線性階O(n),線性對數階O(nlog2n),平方階O(n2),立方階O(n3),..., k次方階O(nk),指數階O(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。相關圖如下:

Java針對封裝陣列的簡單複雜度分析方法

從圖中可見,我們應該儘可能選用多項式階O(nk)的演算法,而不希望用指數階的演算法。

見的演算法時間複雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

2.大O簡單定義(非數學領域)

大O描述的是演算法執行時間和輸入資料之間的關係

3.簡單程式時間複雜度分析

Java針對封裝陣列的簡單複雜度分析方法

在上述中演算法和n呈線性關係,那為什麼要使用大O呢?稱作O(n)?

其實上述的程式中,實際的實際時間複雜度:T = c1*n + c2,在這裡忽略了常數c1和c2。

因此:演算法和N呈線性相關,取n的高階項,因為當n趨於無窮大的時候,低階項起的作用很小。

4.對動態陣列的時間複雜度進行分析

(1)動態陣列新增操作時間複雜度分析

(1)addLast(e)方法 :只需在最後位置新增 時間複雜度 為O(1)

(2)addFirst(e)方法,陣列中均需向後移動一位 時間複雜度 為O(n)

(3)add(index,e)方法,在index位置插入e,時間複雜度與選擇的位置有關,選擇最後時間複雜度 為O(1);選擇第一個位置時間複雜度 為O(n);對於其他情況與概率有關,在平均情況下只需要移動n/2個位置 時間複雜度 為O(n/2)=O(n)

總的來說:陣列新增的時間複雜度為O(n)(最壞情況考慮)

在新增的時候可能會觸發resize方法,需要移動n個元素到新陣列中 時間複雜度 為O(n)

Java針對封裝陣列的簡單複雜度分析方法

(2)動態陣列刪除操作時間複雜度分析

相同的分析方法,可以得出刪除操作的時間複雜度

Java針對封裝陣列的簡單複雜度分析方法

(3)動態陣列修改操作時間複雜度分析

對於修改,只要通過索引找到即可進行修改,時間複雜度為O(1)

Java針對封裝陣列的簡單複雜度分析方法

(4)動態陣列查詢操作時間複雜度分析

Java針對封裝陣列的簡單複雜度分析方法

動態陣列時間複雜度分析總結:

Java針對封裝陣列的簡單複雜度分析方法

關於resize方法,我們完全使用最壞情況分析是不合理的,其分析情況我們將在下一節進行學習~

更多關於java相關內容感興趣的讀者可檢視本站專題:《Java陣列操作技巧總結》、《Java字元與字串操作技巧總結》、《Java數學運算技巧總結》、《Java資料結構與演算法教程》及《Java操作DOM節點技巧總結》

希望本文所述對大家java程式設計有所幫助。