編程若是隻是一個爲了解決生活溫飽的工具,那你能夠徹底忽略數據結構,算法,你的目標很容易實現;但若是你是熱愛編程,把它當作對生活的追求,想在這一行走的更遠,更久,那麼在你的學習規劃中,她們即是必不可少的一種語言;算法
算法,數據結構,程序設計方法,語言工具4個方面是一個程序設計人員所應該擁有的,算法是靈魂,數據結構是加工,對象語言是工具;因而可知算法和數據結構的重要性,無論咱們選擇Java,c語言仍是JavaScript,她們都只是一種語言工具;核心和靈魂依舊在算法和數據結構在學習算法以前,應該先學會數據結構;沒有數據結構的支撐,算法有點艱辛;數據結構又分C語言版本的Java版本的;在學數據結構以前咱們應該對這兩個語言其中一門有所瞭解;編程
若是讓你寫一個1+2+3+4+...+100的結構程序,你會怎麼寫呢? 思考三秒鐘不少人第一時間想到的是第一種算法,不多有人會去想第二種;數組
咱們來比較一下這兩種算法,方法一隨着n的增大,語句執行的次數成線性增長;方法二是無論n有多大,語句老是隻執行一次;均可行,但很明顯方法二的算法優於方法一;數據結構
爲何呢?模塊化
爲了更好的區分她們的差異咱們引入算法的時間複雜度即算法的時間的度量;(即O());函數
記T(n)是語句執行次數的函數;隨着n的增長,T(n)增加最慢的算法咱們稱爲最優算法;即算法時間複雜度小;工具
方法一的時間複雜度爲O(n),方法二的時間複雜度爲O(1)學習
好的算法應該具有時間效率和存儲量低的特色;正如咱們平常生活同樣的,咱們總但願花最少的錢,用最短的時間辦大事;算法也有同樣的思想;最少的存儲空間,最少的時間,辦一樣的好事;設計
在算法的入門級別中有沒有感受到算法的神奇?3d
任何事物沒有好壞之分,只有適不適合;算法也不例外
2.你們都知道斐波那契數列,如今要求輸入一個整數n,請你輸出斐波那契數列的第n項?
一種使用遞歸實現,遞歸可以使程序的結構更加清晰,更簡潔,更容易讓人理解,減小度代碼的時間;遞歸使用的是選擇結構;
一種使用迭代,迭代使用的是循環結構;
乍一看咱們會以爲使用遞歸效果更佳。但是咱們忽略了大量的調用遞歸會創建函數的副本,消耗大量的時間和內存;而迭代則不須要反覆調用函數和佔用額外的內存;
判斷一個算法好很差,咱們只經過少許的數據不能作出準確判斷,所以根據需求狀況選擇不一樣的代碼實現方式;
算法的強大不止於此,強大而有趣味的算法等着咱們去挑戰;
算法的特性:
好的算法應該是:速度快,存儲空間少
數據元素:是組成數據的有必定意義的基本單位;也被稱爲記錄;(好比學生,老師
數據項:一個數據元素能夠有若干個數據項組成;是數據項不可分割的最小單位;(好比學生的姓名,學號,性別...
數據對象:數據元素具備相同數量和類型的數據項;(好比學生有姓名,學號,性別等相同的數據項
數據結構:相互之間存在一種或者多種特定關係的數據元素集合;
數據結構按照視點不一樣可分爲:邏輯結構和物理結構
地址是指向該變量單元;地址形象化地稱爲指針;指針變量的值是地址;全部說指針是一個地址,指針變量是存放地址的變量;
在設計一個較大的程序時,每每把它分紅若干個程序模塊。每一個模塊包括一個或者多個函數,每一個函數實現一個功能;函數是一個功能,每一個函數用來實現一個特定的功能,函數的名字應該反映其表明的功能;利用函數,減小重複編寫的程序段的工做量;(例如:C語言中main()函數) 在實際應用中咱們用函數來實現模塊化程序設計
結構體:C語言容許用戶本身創建有不一樣類型的數據組成的組合型的數據結構,稱爲結構體;
結構體類型:包含不一樣類型的成員;
結構體指針,就是指向結構體變量的指針;
鏈表是什麼? 鏈表是一種數據結構,必須利用指針變量來實現;數據結構包括(number結構類型,Object類型,Array類型等等);鏈表是根據須要開闢內存單元,鏈表有一個頭指針,存放一個地址,該地址指向一個元素(每一個鏈表都有一個頭指針,必不可少);鏈表中的每個元素稱爲節點;節點包含兩個部分,用戶須要的實際數據,下一個節點的地址(next);鏈表中的地址是不連續的;要找某一元素,必須先找到上一個元素,根據他提供的下一個元素地址才能找到下一個元素;
形參不佔內存中的存儲單元;若是函數不須要返回值則不須要return語句