最好和最壞情況時間複雜度(best case time complexity)
案例**如下:
// n 表示陣列 array 的長度
intfind
(int
array,
int n,
int x)
return pos;
}
上面**非常的簡單 ,在無序的陣列裡,找變數x出現的位置。沒找到就返回-1。這段**的時間複雜度是o(n),n為陣列的長度。
我們在陣列中查詢乙個資料,其實不需要將陣列都遍歷一遍。上面那段**不高效,下面給出優化的**:
// n 表示陣列 array 的長度
intfind
(int
array,
int n,
int x)
}return pos;
}
顯然優化完後的**的時間複雜度不再是o(n)了,以簡單的複雜度分析的方法並解決不了這一問題了。
因為需要查詢的x的位置充滿了不確定性,既有可能在第乙個,也有可能在最後乙個。所以我們就需要引入三個概念:最好時間複雜度,最壞時間複雜度和平均時間複雜度。
最好時間複雜度和最壞時間複雜度都很好理解,該段**的最壞時間複雜度便是o(n),最好時間複雜度是o(1)。因為最好情況x在第乙個就找到了,最壞情況會找不到或者在最後一位。
稍微需要花點腦子的就是平均時間複雜度分析,我們依舊拿著查詢變數x的例子來解釋。
// n 表示陣列 array 的長度
intfind
(int
array,
int n,
int x)
}return pos;
}
要查詢x在陣列中的位置有n+1種情況(在陣列0~n-1位置或不在陣列中),俺們將每種情況下,查詢需要遍歷的資料個數累加,除n+1,就可以得到需要遍歷的資料個數的平均值。
我們在大o標記法中,可以省去係數,低階,常量, 所以,俺們可以講上面的公式簡化,便是o(n)。
雖然這個結論是對的,在n+1種情況內每種情況出現的概率並不是一樣的。
我們知道,x要麼在陣列,要麼就不在陣列。在陣列與不在陣列的概率為1/2。另外,我們需要查詢的資料x出現在0~ n-1,其概率也是一樣的為1/n。根據概率乘法法則,要查詢的資料x出現在0~n-1中任意位置的概率為1/(2n)。
按照這樣的方法計算的平均時間複雜度就變成了:
該值是概率論的加權平均值,就是期望值,所以平均時間複雜度的全稱就是加權平均時間複雜度或者期望時間複雜度。
引入概率後**的加權平均值為(3n+1)/4。用大o表示法來表示還是o(n)。
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構與演算法分析 之 資料結構和演算法概述
官方解釋 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。大白話 資料結構就是把資料元素按照一定的關係組織起來的集合,用來組織和儲存資料 傳統上,我們可以把資料結構分為邏輯結構和物理結構兩大類。邏輯結構分類 邏輯結構是從具體問題中抽象出來的模型,是抽...
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...