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

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

一、ArrayList初始化 - Java那些事兒專欄數組

二、ArrayList底層數組擴容原理 - Java那些事兒專欄數據結構


最近看了一下評論區裏,你們都急着想要了解HashMap,先不要着急,要完整的瞭解HashMap的內部實現,咱們還須要一些基礎知識,有了這些基礎知識,咱們才能更好的理解HashMap,其實咱們已經在不知不覺進入了數據結構的大門,爲了之後讓你們能更好的理解後續文章,本文咱們先引入時間複雜度這個概念。post

仍是那個Person對象,增長了一個屬性年齡3d

建立一個數組,並在數組裏放了10個Person對象,老規矩,咱們上圖:cdn

假如咱們有這麼一個需求,咱們想知道小組裏周八的年齡,相信你們都會寫代碼去找:對象

須要循環取6次從數組裏獲取Person對象。blog

這時候小明同窗過來講,哎呀,我知道周八在小組的第5個位置(數組下標5),不用循環,咱們直接找他就是get

不須要循環,1次就取到了Person對象:源碼

不管數組中有多少個元素,每次去讀取元素和並比較的時間老是相同的,假設這個時間爲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。全部示例代碼均已上傳至公衆號,須要請關注下載。

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

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

相關文章
相關標籤/搜索