(1)、把輸入規模看成x軸,所花時間/空間看成y軸
O(n)就是y=x,y隨x的增長而線性增長。也就是成正比,一條斜線。
O(1)就是y=1,是一個常量,不管x怎么變,y不變,一條與x軸平行的線。
(2)、舉個簡單的例子,要從0加到n,我們會這么寫:
int sum = 0; for(int i = 0;i<=n;++i) { sum + = i; }
一共算了n次加法,那么就說這個時間復雜度是O(n)。當然O(n)的精確的概念是,是n的最高次方,比如,某個計算共計算了3n+2次,那么這個時間復雜度也是O(n),因為3n+2中的最高次方是n。
如果代碼這么寫:
int sum = 0; for(int i = 0;i<= n;i++) { for(int j = 0;j<= n;j++) { sum + = (i + j); } }
很明顯一共算了n^2次加法,那么就說這個時間復雜度是O(n^2),和這個上面的類似,如果某個算法計算了3*n^2+n+1次,其時間復雜度仍然是O(n^2),因為3*n^2+n+1中的最高的次方是n^2,所謂O1就是計算的次數是常量,我們還以上面從0到n的例子來說,如果我們用等差數列的公式,那么,代碼可以這么寫:
int sum = n*(n+1)/2
不管n有多大(當然不能溢出了),通過上面的公式只需要計算一次,也就是說計算的次數是不變的,這種情況的時間復雜度就可以說成O(1),再比如這個計算,不管其他條件如何變化,均只計算5次就能計算出結果,那么這種情況就是時間復雜度,也就是O(1)。
(3)、
要在hash表中找到一個元素就是O(1)
要在無序數組中找到一個元素就是O(n)
訪問數組的第n個元素是O(1)
訪問鏈表的第n個元素是O(n)
也就是說:
如果實現中沒有循環就是O(1)
如果實現中有一個循環就是O(n)
(4)、算法復雜度:算法復雜度分為時間時間復雜度和空間復雜度。其作用是:時間復雜度是度量算法執行時間的長短;而空間復雜度是指算法所需存儲空間的大小。