從咱們接觸開發開始,算法 + 數據結構 = 程序 都是咱們認同的。不少開發崗位都要求深刻了解數據 結構,院校的計算機專業中,數據結構都是必修課程。在面試中,不少面試官會提到,例如:二叉樹,紅黑樹,或者「醫院的看病人掛號排隊該怎麼處理」。node
數據結構是計算機存儲、組織數據的方式。git
數據是程序的核心要素,無論咱們是在寫商城類的應用,仍是社交類的應用,亦或股票類的應用,咱們都須要處理其數據,如商品數據、消息數據、股票價格等等。對於特定的數據結構(好比數組),有些操做效率很高(讀某個數組元素),有些操做的效率很低(刪除某個數組元素)。程序員的目標是爲當前的問題選擇最優的數據結構。程序員
計算機發展至今,有不少數據的組織方式,而咱們經常使用的差很少是下面的一種之一:github
是由相同類型的元素(element)的集合所組成的數據結構,分配一塊連續的內存來存儲。利用元素的索引(index)能夠計算出該元素對應的存儲地址面試
數組根據維度區分,有兩種數組:算法
因爲數組是連續性的內存,因此做刪除和插入時會致使內存數據的移動,對如今的計算速度來講並不算什麼,單在編寫中仍是儘可能避免。express
棧和隊列都是動態集合,且在其上的 delete 操做所移除的元素是預先設定的。棧實現的是後進先出(last-in, first-out, LIFO),刪除的老是最近插入的元素,而隊列則是先進先出(first-in, first-out, FIFO),老是存在時間最長的被移除。編程
棧的應用最爲熟知的 Ctrl + Z
,而隊列的操做於咱們生活中排隊買票、結帳的場景同樣。api
棧:數組
隊列:
堆(heap)是計算機科學中一種特別的樹狀結構,其特性是:「給定堆中任意節點P和C,若P是C的母節點,那麼P的值會小於等於(或大於等於)C的值」
也就是說,若母節點的值恆小於等於子節點的值,此堆稱爲最小堆(min heap);反之,若母節點的值恆大於等於子節點的值,此堆稱爲最大堆(max heap)。在堆中最頂端的那一個節點,稱做根節點(root node),根節點自己沒有母節點(parent node)
對於操做系統,任務調動程序的工做是頻繁的,而每一個任務須要時間/資源/權重有長短,對於這些不一樣操做任務來講,隊列/棧等按必定順序的數據結構已經不適應了,而堆的出現能夠解決這個問題。
堆的實現經過構造二叉堆(binary heap),實爲二叉樹的一種;因爲其應用的廣泛性,當不加限定時,均指該數據結構的這種實現。這種數據結構具備如下性質。
將根節點最大的堆叫作最大堆或大根堆,根節點最小的堆叫作最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
鏈表是線性結構,用指針連接數據的方式串聯數據,但數據並不會按線性順序存儲。與數組不一樣的是,鏈表插入或刪除數據的時候不須要移動數據,存儲的數據也不是連續的內存,其充分利用計算機內存空間,實現靈活的內存動態管理。 鏈表沒有隨機讀取的優勢,並且空間開銷比較大。 鏈表有一下幾種經常使用的類型:
鏈表中最簡單的一種是單向鏈表,它包含兩個域,一個信息域和一個指針域。這個連接指向列表中的下一個節點,而最後一個節點則指向一個空值
雙向鏈表相比與單鏈表的優點在於它同時支持高效的正向及反向遍歷,而且能夠方便的在鏈表尾部刪除結點(單鏈表能夠方便的在尾部插入結點,但不支持高效的表尾刪除操做)
與單鏈表同樣,只是最後的節點指向的是首節點
在計算機科學中,樹 (Tree) 是一種抽象數據類型(ADT)或是實做這種抽象數據類型的數據結構,用來模擬具備樹狀結構性質的數據集合.它是由n(n>0)個有限節點組成一個具備層次關係的集合。把它叫作「樹」是由於它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。
哈希(Hash) 將某個對象變換爲惟一標識符,該標識符一般用一個短的隨機字母和數字組成的字符串來表明。哈希能夠用來實現各類數據結構,其中最經常使用的就是 哈希表 (hash table)。
哈希表也稱爲 散列表,是根據 **鍵(Key)**而直接訪問在內存存儲位置的數據結構。也就是說,它經過計算一個關於鍵值的函數,將所需查詢的數據映射到表中一個位置來訪問記錄,這加快了查找速度。這個映射函數稱作散列函數,存放記錄的數組稱作散列表。 其性能取決於3個指標
hash(k)=k
或 hash(k)=ak+b
,其中 a,b
爲常數(這種散列函數叫作自身函數)hash(k)=k mod p, p <= m
。不只能夠對關鍵字直接取模,也可在摺疊法、平方取中法等運算以後取模。對 p 的選擇很重要,通常取素數或 m,若 p 選擇很差,容易產生衝突。圖(graph)由多個節點(vertex)構成,節點之間闊以互相鏈接組成一個網絡。(x, y)表示一條邊(edge),它表示節點 x 與 y 相連。邊可能會有權值(weight/cost)。
圖能夠分爲:有向圖、無向圖,編程語言中可能有:鄰接矩陣、鄰接表 對於圖的搜索算法,則是: