數據結構的重要性:
數據結構與算法是計算機學科中基礎中的基礎。說他基礎,并不是說他簡單,而是因為他在計算機學科中舉足輕重的地位。大學很多初學這門課程的同學,以及剛入職的工作族覺得這門課程與操作系統,計算機網絡,計算機體系結構一樣,是脫離實際工作的一些知識,可能除開一些面試,很少能用到。面試的時候背一背就好了。
的確,校招的時候很多公司都會面試算法數據結構,而且占的比重非常高。參加面試的學生通常沒有實際的項目經驗,公司只能考察他們對基礎知識的掌握程度。社招也是一樣,越牛的公司,越是注重考查數據結構與算法這類的基礎知識。相比短期能力,更看重長期的潛力,可見其的重要程度。
如果把編程語言比作學會的招式,那么數據結構與算法就是內功。只有內功越扎實,你的招式才能發揮最大威力
筆者本科畢業的時候,也曾經工作過一年,在那一年中,確實沒怎么用過數據結構(當然,數組和線性表還是會用的),算法就更不用多說了,排序就一個Arrays.sort()就搞定,整天與數據庫打交道,寫增刪改查。作為一個入門級碼農,慢慢的在過程中熟練的使用了JAVA API,覺得自己牛逼哄哄的,突然有一天,部門解散,大家紛紛轉崗,我才發現自己Too young Too naive。在那一年慢慢的成為了一個CRUD Boy。一個只懂業務的業務開發師。換了部門之后,自己對業務的理解也是useless。
可見,只有更計算機科學最底層的數據結構,算法,才是我們跳槽轉崗所需要的核心技能!
什么是數據結構:
顧名思義,數據結構就是數據在計算機內存儲的結構。
一個比較官方的回答是: 數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。
名詞的定義為:
但是,這些定義都很抽象,對理解這兩個概念沒有實質性的幫助。
下面通過一個例子來理解數據結構,以及數據結構與算法的聯系:
大多數人都去過圖書館借書,圖書館是怎么儲藏書籍的?為了方便查找,管理員一般會將書籍分類別進行排放,(也就是存儲),按照一定的規律排放,就是這些書籍“數據”上的存儲結構。
你作為一個閱讀者,如果只知道書名,怎么進圖書館找到這本書呢?
當然,你可以從進門的第一個書柜找起,找到最后一個書柜。但是,假設圖書館按照分類來排放書籍(事實上也是如此),情況就不同了。這種情況下會存在一種有效的方式,
你可以先設法知道書籍的類別(比如,問圖書管理員)
->知道該類別的書在哪個書柜
->去那個書柜進行尋找。
這些查找的方式就是算法。
所以你知道為什么算法與數據結構通常是聯系在一起了嗎?數據按照某種方式進行存放后,是為了更方便的進行“查找”,“更新”,“新增”,“刪除”操作。而這些操作,就是算法。以某種方式存放就是數據結構。
設想一下,如果管理員不按任何規則排放書,你是不是真的只能從第一個找到最后一個了呢?
如何學習數據結構與算法:
基礎知識就簡單嗎?其實不然,我們現在可能會認為小學學的四則運算簡單。但是,不妨回憶一下,當初小學我們學四則運算,背99乘法表是多么的煎熬,一把鼻涕一把淚的。可見,知識儲備是一個痛苦的過程。你堅持下來才能開啟新知識的大門,學習更多的新知識。沒有四則運算基礎,我們又如何學習數論中的因數分解,幾何中的面積求解呢?我們學習新的知識,是不斷累積的,認知不斷提高的,如果你想跟穿越過來的秦始皇講“計算機”這個新名詞,想必他也是很難理解吧。
作為大學才開設的課程,數據結構與算法比起小學學的東西自然不可同日而語。這門學科難嗎?
當然難!
幾乎我們課本上所學的每一種數據結構,每一個算法,都是來自一篇或者多篇高質量的論文。前人日以繼夜的研究,才將這些知識呈現在我們面前,大多數高質量的論文都是博士階段才會產出。所以很多知識并不簡單。
舉個例子,我們小學就“記過” Π=3.1415926535.....你現在看著他覺得眼熟吧?但是你知道他怎么來的么?(我猜絕大多數人不知道)。還有一個無限不循環小數,自然對數e ,他怎么來的?
我們學這些知識,很多情況下都在死記硬背,并不清楚它是怎么來的,為什么它會存在。
同理,在學數據結構的時候,很多同學并不理解設計背后的理念,在什么場景下更合適使用它,為什么它會存在?因此,很多人都學不好它。
正所謂:“有需求就有市場”,每一種數據結構都有它存在的合理性,都有更適合它的場景。
所以,應盡量從“實用性”的角度出發,舉例說明一些具體數據結構使用場景。比如,在什么時候使用線性表而不是鏈表,鏈表具體使用在哪些場景中?
另外,!非常墻裂!建議大家盡量能動手寫一寫,鞏固自己所學到的知識。
好了,啰嗦了這么多,導讀也該到此結束了,從下期原創文章開始,大家一起來學習數據結構與算法吧。