做爲一名IT技術人員,須要不斷的完善本身的知識體系來提高本身,相似數據結構、網絡等。在工做中大部分時間咱們都是作應用層面的開發,有時候對數據結構、算法這些基本功要求不是很高,可是一些基本得知識點咱們仍是須要掌握。html
是否是常常聽別人說數據結構、算法、程序 = 數據結構 + 算法等,那麼到底什麼是數據結構?前端
數據結構自己是一個抽象的概念,沒有具體的標準,好比咱們用的電腦,我能夠說電腦這種結構由cpu、主板、顯卡、內存、硬盤、電源、聲卡、網卡等組成。如 vue-cli 初始化的項目由 main.js、src等組成。因此不須要去糾結到底什麼是數據結構,數據結構自己只是一層抽象的概念,從字眼上能夠理解爲數據與數據之間存在一種或多種關係的數據元素集合。vue
從不一樣的角度,數據結構能夠理解爲邏輯結構、物理結構。能夠理解爲邏輯結構是在計算機中的存儲形式,物理結構是計算機怎麼存儲數據;算法
邏輯結構:數據元素之間的相互關係vue-cli
物理結構:數據的邏輯結構在計算機中的存儲形式數組
解決問題的步驟咱們叫方法,在計算機中稱算法,在計算機中表現爲指令的有限序列;一般一個問題有不少種方法,有些方法很巧妙,有些看起來比較繞,這些方法是有差別的,咱們一般在計算機中經過時間複雜度、空間複雜度來衡量一個算法的好壞。網絡
時間複雜度並非說代碼執行的具體的時間,而是表示代碼執行時間隨問題規模或者數據規模增加的變化趨勢,也叫漸進時間複雜度,簡稱爲時間複雜度。咱們都知道一個算法花費的時間與算法中語句的執行次數確定成正比例,哪個算法中語句執行次數多,它花費時間就多。數據結構
1 function get (n) { 2 let i = 0; // 一次 3 let name = '' // 一次 4 } 5 // 總共就是2次
如上所示,總共執行了2次,可是一般咱們處理的事情這個n 可能不是一個固定值,因此咱們把一個算法中的語句執行次數記爲函數T(n),n爲問題規模,隨着問題規模n的變化,算法執行的時間也會變化,爲了更好的分析這個時間的變化比,用O()來表示時間複雜度的記法,咱們稱爲大O記法。語句執行總的次數T(n)跟O() 有以下公式數據結構和算法
T(n) = O(f(n)),它表示隨着問題規模n 的增大,算法執行時間的增加率和f(n)的增加率相同,其中f(n)是問題規模n的某個函數函數
咱們通常經過如下方法來分析一個算法的時間複雜度
常數階:O(1)
若是算法執行所須要的臨時空間不隨着某個變量n的大小而變化,即此算法空間複雜度爲一個常量,可表示爲O(1)
1 function run () { 2 let value = 100 3 value += 10 4 console.log(value) 5 // 共執行3次,根據大O 推導法,把常數換成1,則結果是O(1) 6 }
線性階:O(n)
1 function run (n) { 2 for(let i = 0; i < n; i++) { 3 console.log(i) 4 } 5 } 6 // 共執行n次,根據大O推導法,只取最高階,因此是 O(n)
平方階__O( n^2 )
function run (n) { for(let i = 0; i < n ; i++ ) { for(let j = 0; j < n ; j++ ) { console.log(j) } } } /* 外層i的循環執行一次,內層j的循環就要執行n次 由於外層執行n次,那麼總的就須要執行n*n次, 也就是須要執行n^2次,根據大O推導法:O(n^2)
*/
執行次數 | 複雜度 | 非正式術語 |
12 | O(1) | 常數階 |
2n+3 | O(n) | 線性階 |
4n2+zn+2 | O(n2) | 平方階 |
4log2n+21 | O(logn) | 對數階 |
3n+2log3n+15 | O(nlogn) | nlogn階 |
4n3+3n2+22n+11 | O(n3) | 立方階 |
2n | O(2n) | 指數階 |
時間複雜度耗費時間從小到大依次排列
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
1 function run(n) { 2 for (let i = 0; i < n; i++) { 3 for (let j = i; j < n; j++) { 4 console.log(`${n},hello word`) 5 } 6 } 7 } 8 run(10)
當 i = 0 時,內循環執行 n 次運算,當 i = 1 時,內循環執行 n - 1 次運算……當 i = n - 1 時,內循環執行 1 次運算。
因此,執行次數 T(n) = n + (n - 1) + (n - 2)……+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2。
根據上文說的 大O推導法 能夠知道,此時時間複雜度爲 O(n^2)。
算法的空間複雜度經過計算算法所需的存儲空間,公式記住 S(n) = O(f(n)),其中n 爲問題規模,f(n)爲關於n 所佔存儲空間的函數。
數據結構和算法是相輔相成的,雖然能夠單獨分開爲兩個東西,可是對於計算機來講把他們分開,那麼他們將變得十分無聊。
數據結構研究的是組織數據的方式,好比數組,他就是一種組織數據的方式,就是一種數據結構。可是有了數據結構,不必定有算法。數據結構是算法的基礎,好比數據結構爲數組,使用數組,能夠寫出冒泡、快排等算法。
數據結構爲算法服務,算法做用在特定的數據結構之上。