時間復雜度是指執行算法所需要的計算工作量;而空間復雜度是指執行這個算法所需要的內存空間。(算法的復雜性體現在運行該算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即寄存器)資源,因此復雜度分為時間和空間復雜度
在描述算法復雜度時,經常用到o(1), o(n), o(logn), o(nlogn)來表示對應算法的時間復雜度。這里進行歸納一下它們代表的含義:這是算法的時空復雜度的表示。不僅僅用於表示時間復雜度,也用於表示空間復雜度。一個算法的優劣主要從算法的所需時間和所占用的空間兩個方面衡量。一般空間利用率小的,所需時間相對較長。所以性能優化策略里面經常聽到 空間換時間,時間換空間這樣說法
O后面的括號中有一個函數,指明某個算法的耗時/耗空間與數據增長量之間的關系。其中的n代表輸入數據的量。
- 比如時間復雜度為O(n),就代表數據量增大幾倍,耗時也增大幾倍。比如常見的遍歷算法。
int x=1;
while (x <n){
x++;
}
list.contains()方法,系統會對list中的每個元素e調用o.equals(e),因此用時間復雜度表示是O(n)
該算法執行次數是如果n=10, 執行次數就是10,n是個變量,用時間復雜度表示是O(n)。
2. 再比如時間復雜度O(n^2),就代表數據量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間復雜度。比如冒泡排序,就是典型的O(n^2)的算法,對n個數排序,需要掃描n×n次。
for (i = 0; i < n; i++){
for (j = 0; j < n; j++){
//...
}
}
如果兩層循環,該算法for循環,最外層循環每執行一次,內層循環都要執行n次,執行次數是根據n所決定的,最大時間復雜度是O(n^2),如果內層循環在某種場景一次就跳出,其實也可以退化成o(n), 通常我們計算時間復雜度都是計算最多情況.由此類推,如果是三層循環,最大時間復雜度就是 O(n^3).比如冒泡、選擇等等
3. O(1)就是最低的時空復雜度了,也就是耗時/耗空間與輸入數據大小無關,無論輸入數據增大多少倍,耗時/耗空間都不變。 哈希算法就是典型的O(1)時間復雜度,無論數據規模多大,都可以在一次計算后找到目標(不考慮沖突的話)
例子: 理論上哈希表就是O(1)。因為哈希表是通過哈希函數來映射的,所以拿到一個關鍵字,用哈希函數轉換一下,就可以直接從表中取出對應的值。和現存數據有多少毫無關系. Set的contains()方法: HashSet的contains返回true,當且僅當equals返回true 並且 hashCode返回相等的值 ;Set除了比較equals,還比較hashCode
4. O(logn)的算法復雜度,典型的比如二分查找。設想一堆試卷,已經從高到底按照分數排列了,我們現在想找到有沒有59分的試卷。怎么辦呢?先翻到中間,把試卷堆由中間分成上下兩堆,看中間這份是大於還是小於59,如果大於,就留下上面那堆,別的丟掉,如果小於,就留下下面那堆,丟掉上面。然后按照同樣的方法,每次丟一半的試卷,直到丟無可丟為止。
轉載於:https://blog.csdn.net/qq_31459039/article/details/89634775