資料結構學習☞入門(一)

sunseekers發表於2017-11-07

程式設計如果只是一個為了解決生活溫飽的工具,那你可以完全忽略資料結構,演算法,你的目標很容易實現;但如果你是熱愛程式設計,把它當做對生活的追求,想在這一行走的更遠,更久,那麼在你的學習規劃中,她們便是必不可少的一種語言;

資料結構學習☞入門(一)
演算法,資料結構,程式設計方法,語言工具4個方面是一個程式設計人員所應該擁有的,演算法是靈魂,資料結構是加工,物件語言是工具;由此可見演算法和資料結構的重要性,不管我們選擇Java,c語言還是JavaScript,她們都只是一種語言工具;核心和靈魂依舊在演算法和資料結構

在學習演算法之前,應該先學會資料結構;沒有資料結構的支撐,演算法有點艱辛;資料結構又分C語言版本的Java版本的;在學資料結構之前我們應該對這兩個語言其中一門有所瞭解;

演算法

演算法是解決“做什麼”和“怎麼做”的問題;在我們日常的操作語句中體現的淋淋盡致,如果我們不瞭解演算法也就談不上程式設計;掌握了演算法就是掌握了程式設計的靈魂

如果讓你寫一個1+2+3+4+...+100的結構程式,你會怎麼寫呢? 思考三秒鐘很多人第一時間想到的是第一種演算法,很少有人會去想第二種;

資料結構學習☞入門(一)

我們來比較一下這兩種演算法,方法一隨著n的增大,語句執行的次數成線性增加;方法二是不管n有多大,語句總是隻執行一次;都可行,但很明顯方法二的演算法優於方法一;

為什麼呢?

為了更好的區分她們的差別我們引入演算法的時間複雜度即演算法的時間的度量;(即O());

記T(n)是語句執行次數的函式;隨著n的增加,T(n)增長最慢的演算法我們稱為最優演算法;即演算法時間複雜度小;

方法一的時間複雜度為O(n),方法二的時間複雜度為O(1)

好的演算法應該具備時間效率和儲存量低的特點;正如我們日常生活一樣的,我們總希望花最少的錢,用最短的時間辦大事;演算法也有一樣的思想;最少的儲存空間,最少的時間,辦同樣的好事;

在演算法的入門級別中有沒有感覺到演算法的神奇?

任何事物沒有好壞之分,只有適不適合;演算法也不例外

2.大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項?

資料結構學習☞入門(一)

一種使用遞迴實現,遞迴能夠使程式的結構更加清晰,更簡潔,更容易讓人理解,減少度程式碼的時間;遞迴使用的是選擇結構;

一種使用迭代,迭代使用的是迴圈結構;

乍一看我們會覺得使用遞迴效果更佳。可是我們忽略了大量的呼叫遞迴會建立函式的副本,消耗大量的時間和記憶體;而迭代則不需要反覆呼叫函式和佔用額外的記憶體;

判斷一個演算法好不好,我們只通過少量的資料不能做出準確判斷,因此根據需求情況選擇不同的程式碼實現方式;

演算法的強大不止於此,強大而有趣味的演算法等著我們去挑戰;

演算法的特性:

  • 有窮性:演算法應該包含有限的操作步驟
  • 確定性:演算法中的每一個步驟應該是確定的
  • 有零或多個輸入:執行演算法的時候需要從外界取得必要的資訊
  • 有一個或多個輸出:演算法的目的是為了求解,“解”就是輸出
  • 有效性:每個步驟應該是有效的,並得到確定的結果

好的演算法應該是:速度快,儲存空間少

資料結構

深入學習之前先了解資料結構一組概念 資料: 描述客觀事物的符號;能輸入到計算機中,能被計算機程式處理;比如聲音,影象,視訊...

資料元素:是組成資料的有一定意義的基本單位;也被稱為記錄;(比如學生,老師

資料項:一個資料元素可以有若干個資料項組成;是資料項不可分割的最小單位;(比如學生的姓名,學號,性別...

資料物件:資料元素具有相同數量和型別的資料項;(比如學生有姓名,學號,性別等相同的資料項

資料結構:相互之間存在一種或者多種特定關係的資料元素集合;

資料結構按照視點不同可分為:邏輯結構和物理結構

邏輯結構

邏輯結構:資料物件中資料元素之間的關係
  • 集合結構:資料元素除了同屬於一個集合之外,她們沒有任何關係
  • 線性結構:資料元素之間一對一關係
  • 樹形結構:資料元素之間存在一對一或一對多的層級關係
  • 圖形結構:資料元素是多對多的關係
![](https://user-gold-cdn.xitu.io/2017/11/7/439375c039c4b6ba0a67f5b4cbce3f06)

物理結構

物理結構(儲存結構):資料的邏輯結構在計算機中的儲存形式
  • 集合結構:資料元素除了同屬於一個集合之外,她們沒有任何關係
  • 順序結構:把資料元素存放在地址連續的儲存單元裡;(陣列)
  • 鏈式結構:把資料元素存放在任意的儲存單元裡,這組儲存單元可以是連續的,也可以是不連續的

資料結構學習☞入門(一)
邏輯結構是面向問題的,物理結構是面向計算機的;我們應該注重的就是物理結構,將資料及其邏輯關係儲存到計算機記憶體中去 線性,樹形,圖形,鏈式是資料結構的重點和難點

題外話

指標,地址,指標變數是什麼?

地址是指向該變數單元;地址形象化地稱為指標;指標變數的值是地址;所有說指標是一個地址,指標變數是存放地址的變數;

在設計一個較大的程式時,往往把它分成若干個程式模組。每個模組包括一個或者多個函式,每個函式實現一個功能;函式是一個功能,每個函式用來實現一個特定的功能,函式的名字應該反映其代表的功能;利用函式,減少重複編寫的程式段的工作量;(例如:C語言中main()函式) 在實際應用中我們用函式來實現模組化程式設計

結構體:C語言允許使用者自己建立有不同型別的資料組成的組合型的資料結構,稱為結構體;

結構體型別:包含不同型別的成員;

結構體指標,就是指向結構體變數的指標;

連結串列是什麼? 連結串列是一種資料結構,必須利用指標變數來實現;資料結構包括(number結構型別,Object型別,Array型別等等);連結串列是根據需要開闢記憶體單元,連結串列有一個頭指標,存放一個地址,該地址指向一個元素(每個連結串列都有一個頭指標,必不可少);連結串列中的每一個元素稱為節點;節點包含兩個部分,使用者需要的實際資料,下一個節點的地址(next);連結串列中的地址是不連續的;要找某一元素,必須先找到上一個元素,根據他提供的下一個元素地址才能找到下一個元素;

形參不佔記憶體中的儲存單元;如果函式不需要返回值則不需要return語句

相關文章