前段時間通過小詹隨筆分享的鏈接在極客時間購買了王爭老師的《數據結構與算法之美》的課程,小詹學長果真是一個很靠譜的學長,凡是通過他的鏈接購買的課程,之后建有微信群,相互監督學習並分享學習筆記打卡。因此,在此,為表示對小詹學長的感謝,也簡單介紹一下“小詹學Python”公眾號,小詹學長是一名雙一流高校在讀研究生,專研c++,python,主要研究圖像處理、計算機視覺和機器學習相關知識,定期帶你打卡刷leetcode,鍛煉編程能力。有興趣的可以關注他哦~~
下面就開始本次的正題啦~~
首先,我們需要明白數據結構與算法的大致概念。通俗講,數據結構就是數據的一種存儲結構,而算法就是操作這些數據的方法。數據結構為算法服務,算法作用在數據結構之上。那么,論及數據結構與算法,就離不開對時間、空間的復雜度分析了。
其次,我們為什么要進行復雜度分析呢?簡單講,那肯定是用戶體驗和對數據本身處理的優化咯。畢竟,如果數據庫里面如果有幾百萬條數據,挨個搜索查找,這樣的等待時間是會讓用戶崩潰的。所以,復雜度分析當然需要重點分析。
最后,復雜度分析包含哪幾個點呢?
空間、時間復雜度統一使用大O階表示法,所有代碼的執行時間T(n)均與數據規模成正比:T(n)=O(f(n))。
(一)時間復雜度:
時間復雜度即為運行一個程序的時間,大致可分為:多項式量級、非多項式(NP)量級。
1.多項式量級——隨着數據規模的增長,算法的執行時間和空間占用統一呈多項式規律增長:
常數階O(1)、對數階O(logn)、線性階O(n)、線性對數階O(n*logn)、冪次階(平方階O(n.^2)、立方階O(n.^3)、四次方O(n.^4)...)
2.非多項式量級——隨着數據量n的增長,時間復雜度急劇增長,執行時間無限增加:
指數階O(2.^n)、階乘階O(n!)
圖形比較就為如下:
- 下面再說說時間復雜度的計算法則:
1.單段代碼看高頻:比如循環。
2.多段代碼取最大:比如單循環+雙循環,那么就取復雜度最大的雙循環作為該程序的復雜度。
3.嵌套代碼用乘法:一個函數中嵌套另一個函數,那么他們之間的復雜度=O(f(n1))*O(f(n2)),例如遞歸等。
4.多個規模用加法:比如兩個參數利用了兩個循環函數,那么他們程序的復雜度O(n)=O(n1)+O(n2)。
(二)空間復雜度:
空間復雜度即占用某個存儲空間的大小,例如:
void print(int n) { int i = 0; int[] a = new int[n]; for(i;i<n;++i){ a[i] = i*i; } }
上面的空間復雜度就為O(n)了。
總體來說,時間復雜度分析較為繁瑣,需要着重掌握一下,空間復雜度就顯得較為簡單啦。