表示**執行時間隨資料規模增長的變化趨勢,也叫做漸進時間複雜度,簡稱時間複雜度忽略掉**中的常量、低階、係數,秩只需記錄乙個最大階數的量級就可以了。
如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼t(n) = t1(n) + t2(n) = max(o(f(n)), o(g(n))) = o(max(f(n), g(n)))
int cal(int n)
int sum_2 = 0;
int q = 1;
for (; q < n; ++q)
int sum_3 = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i)
}return sum_1 + sum_2 + sum_3;
}
對上面**採用加法法則,時間複雜度為o(如果 t1(n)=o(f(n)),t2(n)=o(g(n)),那麼 t(n)=t1(n)*t2(n)=o(f(n))*o(g(n))=o(f(n)*g(n)).
int cal(int m, int n)
int sum_2 = 0;
int j = 1;
for (; j < n; ++j)
return sum_1 + sum_2;
}
從上面**可以看出,此時時間複雜度為o(m + n)。
此處區分加法法則,由於此時m、n的規模事先不清楚!!!
上圖中的其餘量級的時間複雜度稱為非多項式量級的演算法問題叫做np(非確定多項式)問題。
非多項式時間複雜度的演算法是非常低效的演算法。
i=1;
while (i <= n)
如上面**所示,i值的取值是等比數列。我們如何知道**總的執行次數呢?
我們只要知道x為多少就可以了。通過
在實際分析中,無論是以那個數為底,我們都可以把對數階的時間複雜度記為 o(log n)。希望能通過這個例子,更好理解對數階這一量級分析。
同樣的 o(nlog n)相當於將 o(log n)迴圈執行n次即可!
// n表示陣列array的長度
int find(int array, int n, int x)
} return pos;
}
分析上面的**,我們要查詢的變數x可能出現在陣列的任意未知。如果陣列中第乙個元素正好是要查詢的變數x,那就不需要繼續遍歷剩下的n-1個資料了,時間複雜度為o(1)。但如果陣列中不存在變數x,那就需要遍歷整個陣列,時間複雜度就變成了o(n)。不同情況下的**的時間複雜度是不一樣的,故引入如下概念:
分析下面**的時間複雜度:
// 全域性變數,大小為 10 的陣列 array,長度 len,下標 i。
int array = new int[10];
int len = 10;
int i = 0;
// 往陣列中新增乙個元素
void add(int element)
// new_array 複製給 array,array 現在大小就是 2 倍 len 了
array = new_array;
len = 2 * len;
}// 將 element 放到下標為 i 的位置,下標 i 加一
array[i] = element;
++i;
}
最好時間複雜度:o(1)
最壞時間複雜度:o(n)
平均時間複雜度:o(1)
《資料結構與演算法之美》學習筆記 3 資料結構
陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...
《資料結構與演算法之美》學習筆記之開篇
本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 從廣義上講,資料結構就是指一組資料的儲存結構。演算法就是運算元據的一組方法。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特...
資料結構與演算法之美學習筆記 5 9章
陣列是一種線性表資料結構,他用一組連續的記憶體空間,來儲存相同型別的資料 這裡要注意不根據下標是不能隨機訪問的啊 假設乙個長度為10的int型陣列,會分配一塊連續記憶體空間 1000 1039,其中,記憶體塊首位址是1000 我們可以通過以下公式快速獲取到指定下標的元素 a i address ba...