郝斌數據結構筆記02:數據結構概述

歡迎關注我的個人公衆號【程序員向東】,該公衆號專注分享Python、爬蟲學習資料與乾貨!後臺回覆「PYTHON」,送你一個學習大禮包!

想要下載【郝斌數據結構筆記全系列】可以到我的GitHub,連接是:https://github.com/mxdshr/LearningNotes ,如果覺得有用,歡迎給個star~

數據結構概述

嚴蔚敏的《數據結構》上是僞代碼,高一凡將其用C和Java實現了。

1. 數據結構的定義

我們如何把現實生活中大量而複雜的問題以特定的數據類型(個體如何保存)和特定的存儲結構(個體之間的關係),保存到主存儲器(內存)中,以及在此基礎上爲實現某個功能(比如查找某個元素,刪除某個元素,對所有元素進行排序)而執行的相應操作,這個相應的操作也叫算法。

前面一段的前半部分可以理解爲數據結構要學的內容,也就是數據如何存儲的內容;後半部分可以理解爲算法要學習的內容,也就是如何進行操作的問題。

數據結構 = 個體 + 個體的關係

算法 = 對存儲數據的操作

假設我們要保存一個班級學生的信息,如果這個班級一共有15個人,那麼直接存到數組中就可以了。但是如果這個班有10000個人,那麼用數組就不太可行了,因爲數組是連續的存儲結構,如果內存無法提供存儲10000個數據的連續空間那麼就無法用數組來解決了。此時,我們可以用鏈表來解決,因爲鏈表可以充分利用閒散的,不連續的存儲空間。那這些不連續的空間之間可以用指針聯繫到一起。

學生之間沒有什麼上下級關係,用鏈表存儲是可行的,但是現在要求你存儲某市的人口信息或某個公司的職員信息,用鏈表也不行了,因爲一個家庭之間的人口有父母孩子之分,兄弟姐妹之分。一個公司也有上下級之分。這個時候應該用樹結構來完成。用樹可以做一個人事管理系統吧。

現在需求又升級了,我們現在要存儲的是一個城市的交通圖,該城市有很多的公交站點,當我們要求從一個站點到另一個站點的最短距離的時候,用數組解決不了,用鏈表解決不了,用樹也解決不了。只能用圖來解決。圖中的每一個節點都有可能與另外一個節點產生聯繫。

通過上面的例子我們發現,當我們需要用計算機去解決現實生活中的某些問題的時候,首先要解決的就是如何用計算機合理的存儲數據。數據無法合理存儲,就不用再談操作的問題。其次要解決的就是如何解決數據與數據之間的關係問題。總結來說就是

  • 個體如何來存儲
  • 個體與個體的關係如何來存儲

2. 算法

  • 算法又分爲一個廣義算法和狹義算法。從廣義來講,算法跟數據的存儲是沒有關係的,從狹義上來講,數據的存儲方式不一樣,算法所執行的操作也是不一樣的。我們講的是狹義的算法,泛型講的是廣義的算法。

  • 他是解題的方法和步驟。

  • 衡量算法的標準:

    • 時間複雜度(程序最關鍵步驟大概要執行的次數,而非時間,因爲時間跟機器的性能有直接關係。)
    • 空間複雜度(算法執行過程中大概所佔用的最大內存)
    • 難易程度(大家要能理解)
    • 健壯性(不能隨便就掛了)

    搞研究的時候最重要的是時間複雜度和空間複雜度,要應用到程序中的時候最重要的是難易程度

3. 數據結構的地位

數據結構是計算機中的核心課程。

我們在很多的編程語言都能找到數據結構的影子,無論是C還是JAVA,語言裏面都有一些基本的東西,講到內存的時候就有棧、堆。棧和堆並不是指計算機內存中有一塊區域叫棧或堆,所謂的棧內存和堆內存指的是分配內存的算法不一樣,如果是壓棧出棧的方式分配內存,就叫棧內存。如果叫堆排序的方式分配內存,那就是堆內存。實際上講的是算法,還是數據結構的內容。另外還有函數的調用,要想知道調用函數的真正原理,就需要學棧,它是靠壓棧和出棧來實現的。

在操作系統中一定要懂得隊列的知識,因爲牽扯到跟時間有關的東西總要有個順序,這就涉及到了隊列的知識。學編譯原理就要學樹。數據庫是數據結構的簡化版。

程序 = 數據的存儲 + 數據的操作 + 編程語言

我們之所以在編程的時候沒有直接涉及到數據存儲的問題,是因爲編程語言底層已經幫你解決了。

數據結構很重要,但學完之後做不出來什麼東西,他是內功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章