時間複雜度 - Java那些事兒專欄

清淺池塘發表於2017-10-13

ArrayList部分一共五篇文章了,並且引入了時間複雜度來分析,強烈建議大家一定要按順序閱讀,本文是第3篇,前兩篇文章分別是:

1、ArrayList初始化 - Java那些事兒專欄

2、ArrayList底層陣列擴容原理 - Java那些事兒專欄


最近看了一下評論區裡,大家都急著想要了解HashMap,先不要著急,要完整的瞭解HashMap的內部實現,我們還需要一些基礎知識,有了這些基礎知識,我們才能更好的理解HashMap,其實我們已經在不知不覺進入了資料結構的大門,為了以後讓大家能更好的理解後續文章,本文我們先引入時間複雜度這個概念。

時間複雜度 - Java那些事兒專欄

還是那個Person物件,增加了一個屬性年齡

時間複雜度 - Java那些事兒專欄

建立一個陣列,並在陣列裡放了10個Person物件,老規矩,我們上圖:

時間複雜度 - Java那些事兒專欄

假如我們有這麼一個需求,我們想知道小組裡周八的年齡,相信大家都會寫程式碼去找:

時間複雜度 - Java那些事兒專欄

需要迴圈取6次從陣列裡獲取Person物件。

這時候小明同學過來說,哎呀,我知道周八在小組的第5個位置(陣列下標5),不用迴圈,我們直接找他就是

時間複雜度 - Java那些事兒專欄

不需要迴圈,1次就取到了Person物件:

時間複雜度 - Java那些事兒專欄

無論陣列中有多少個元素,每次去讀取元素和並比較的時間總是相同的,假設這個時間為K,在上面示例中在陣列中迴圈搜尋某個使用者,我們迴圈了6次才搜尋到該使用者,時間為6*K,在效率上來看,前者比後者的方式快了6倍,但這種說法意義不大,因為在實際中,陣列可能有100個元素,而這個“周八”有可能在陣列的第1個位置,也有可能在最後一個位置。

在現實中,我們用來計算時間的長短,一般單位有小時,分鐘,秒等,同樣我們也需要一種度量來計算本示例中的演算法的效率,在電腦科學中,這種度量方法被稱為“大O”表示法

當我們知道元素的位置,一步到位就能訪問到該元素,這個時間為K,時間複雜度用大O表示法標記為O(1),省略了K。而在陣列中查詢某元素,我們並不知道這個元素在陣列的什麼位置,假設陣列的長度為n,有可能該元素剛好在陣列的下標為0的位置(第一個位置)迴圈1次就匹配到了,時間複雜度為O(1)。也有可能在陣列下標為n-1的位置(最後一個位置)我們要迴圈n次才能匹配到該值,時間複雜度為O(n),按照概率計算下來平均是n/2,即平均時間複雜度為O(n/2),但我們不應該只考慮平均值,我們要考慮最壞的情況,即假設每次匹配的元素都在陣列的最後一位,因為最壞情況是一種執行時間保證,執行時間不會再長了,如果我們沒特別指定,我們提到的執行時間都是最壞情況的執行時間,即在陣列中查詢某元素,時間複雜度為O(n);

在長度為n陣列中

直接通過下標去訪問元素,時間複雜度為O(1)

需要迴圈查詢元素的時候,時間複雜度為O(n)


下一章我們將分析ArrayList的刪除元素的原始碼,來分析一下ArrayList的時間複雜度,進而瞭解ArrayList的優點與不足。

上一篇:ArrayList底層陣列擴容原理 - Java那些事兒專欄

下一篇:待續

注:本專欄文章首發於公眾號:saysayJava。所有示例程式碼均已上傳至公眾號,需要請關注下載。

如果喜歡本系列文章,請為我點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。

轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權。


相關文章