為什麼要學資料結構?

牧小農發表於2020-01-20

一、前言

在視覺化化程式設計的今天,藉助於整合開發環境可以很快地生成程式,程式設計不再是計算機專業人員的專利。很多人認為,只要掌握幾種開發工具就可以成為程式設計高手,其實,這是一種誤解。要想成為一個專業的開發人員,至少需要以下三個條件:

1) 能夠熟練地選擇和設計各種資料結構和演算法

2) 至少要能夠熟練地掌握一門程式設計語言

3) 熟知所涉及的相關應用領域的知識

其中,後兩個條件比較容易實現,而第一個條件則需要花相當的時間和精力才能夠達到,它是區分一個程式設計人員水平高低的一個 重要標誌,資料結構 貫穿程式設計的始終 ,缺乏資料結構和演算法的深厚功底,很難設計出高水平的具有專業水準的應用程式。曾經有一本經典計算機專業書籍叫做《資料結構+演算法=程式》,也說明了資料結構和演算法的重要性。

在這裡插入圖片描述

二、為什麼要學資料結構

  • 資料結構是所有計算機專業的同學必學的一門課程
  • 資料結構研究的是資料如何再計算機中進行組織和儲存,使得我們可以高效的獲取資料或者修改資料

計算機專業的學生都開設過資料結構課程,它是計算機學科知識結構的核心和技術體系的基石。資料結構作為計算機專業的專業基礎課程,是計算機 考研必考 科目之一,如果有打算報考計算機專業的研究生,這門資料結構你是必須要學好它的,同時,工作以後的同學,會有想去報考計算機 軟考 、計算機 等級考試 的,資料結構也是必考的內容之一,科學技術在飛速發展,但是作為基石的科學技術沒有動搖,由於近年來演算法工程師的高薪火爆,使得資料結構的重視程式空前高漲,總而言之,既然我們已經與計算機接軌就必須 掌握 好它。

三、資料結構無處不在

不管你是IT開發,還是其他崗位的工作人員,或者是遊戲愛好者,只要你用過電腦,那麼你就接觸過資料結構,下面我們就來講一講,資料結構究竟是如何 無處不在 的。

3.1 資料庫

不管你是從事IT工作的,還是準備從事IT開發的,資料庫一定是瞭解的,我們知道,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能儘可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最基本的查詢演算法當然是順序查詢(linear search),這種複雜度為 O(n)的演算法在資料量很大時顯然是糟糕的,好在電腦科學的發展提供了很多更優秀的查詢演算法,例如 二分查詢(binary search)、二叉樹查詢(binary tree search)等。如果稍微分析一下會發現,每種查詢演算法都只能應用於特定的資料結構之上,但是資料本身的組織結構不可能完全滿足各種資料結構,所以,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是 索引 ,索引是一種幫助MySQL高效獲取資料的 排好序資料結構,其中MySQL使用的資料結構為 B+Tree
在這裡插入圖片描述

3.2 作業系統

相信現在的我們常用的作業系統大家一定都知道吧,例如:比爾蓋茲大叔成立的微軟的 Windows作業系統,大神賈伯斯蘋果的 Mac OS,Java開發常用的 Linux系統,由林納斯·本納第克特·託瓦茲開發(百度來的),還有redhat、Solaris、SunCobalt等等,都有使用到資料結構中的,系統棧以及優先佇列:堆
在這裡插入圖片描述

3.3 檔案壓縮

比如:RAR壓縮軟體、PNG圖片、MAP3檔案等等,都會使用資料結構,對資料進行壓縮(很怕打成了亞索,心虛),而使用壓縮的演算法是一種樹結構叫 哈夫曼樹

在這裡插入圖片描述

3.4 遊戲

1) 陣列:需處理的元素個數確定並且需使用下標時可以考慮,不過建議用泛型List
優點:陣列在記憶體中是連續儲存的,索引和修改的速度都非常快
缺點:插入和刪除很慢,長度開闢過長易造成記憶體浪費,長度開闢過短易造成記憶體越界

2) List: List是泛型的,即List,需處理的元素個數可以不確定,不存在裝箱與拆箱,建議多用;而ArrayList:ArrayList list1 = new ArrayList(); ArrayList的元素屬於 object 型別存在裝箱與拆箱,很損耗效能。,List的底層資料結構就是陣列。

List<string> list = new List<string>();
//新增資料   
list.Add(“abc”);   
//修改資料   
list[0] = “def”;   
//移除資料   
list.RemoveAt(0);  
//錯誤操作,因為資料的型別不是string
list.add(123);

3) 連結串列:常用來維護、管理那些需要頻繁產生、消除的遊戲物件,比如:消除類遊戲中需要消除的物件。

4) HashMap:底層是雜湊表,是鍵值對容器,用於處理key/value鍵值對;底層使用的是陣列+連結串列的結構:Map<String,String> map = new HashMap<>();

5) 樹: 1.場景管理中的四叉樹;2.遊戲UI裡的選單一般是分級的,一個主頁面可以衍生出很多的子頁面的時候,使用樹來管理這些選單是很合適的做法。

6) 圖: A*尋路演算法、DFS、BFS

遊戲也是採用了大量的演算法,都需要以資料結構為基石,就最簡單的功能尋路,滑鼠從A點到B點,這個角色就需要尋找一條從A點到B點的路,這條路還需要繞過所有的障礙物,甚至還需要找出最短的路徑,這就是最經典的 圖論演算法,在圖論演算法種就使用了大量的資料結構。

在這裡插入圖片描述

四、資料結構型別

在這裡插入圖片描述

在計算機領域有一句名言 資料結構+演算法=程式,而資料結構本身就是演算法的基石,在近乎任何一本演算法教材,都花了大量的時間講解資料結構,學好資料結構和演算法可以讓我們在計算機這條道路上走的更遠。如果資料結構是因為它無處不在,學好資料結構是使我們快速成長的墊腳石。

在接下面的幾篇文章中,我會為大家更新資料結構中:陣列、棧、佇列、連結串列、二分搜尋樹、堆、線段樹、Trie、並查集、紅黑樹以及雜湊表等等...的詳細講解,感興趣的同學記得關注我,我是牧小農,我喂自己帶鹽。

相關文章