題記:題主工作三年,前段時間面試bat被面試官算法“血虐”,差點心灰意冷,懷疑人生,但是幸好意志堅強,遂,決定發憤圖強,學好算法。每天堅持學一些,每周堅持有深度學習四小時。先慢慢來,學好基本的概念,常用的資料結構和算法,但是圖的話,就不涉獵了,因為真的比較難,學習成本太高,講究成本效益嘛。
之後主要是記錄學習常用資料結構和算法。像棧,隊列,樹精要筆記。内容也不會過于基礎,特别基礎的會一帶而過,主要是記錄的是常用,重點。
Go...
一.算法
衡量算法的優劣
I.時間複雜度
O(1),O(n),O(n*LOG(n),n*n)
II.空間複雜度
常量空間O(1),線性空間O(n),二維空間O(n*n),遞歸空間(與遞歸深度成正比)。
一般情況下,時間複雜度重要一些,甯願少配置設定一些記憶體空間,也要程式執行速度。
二.資料結構
資料結構是算法的基石。如果把算法比喻成美麗的跳舞者,那麼資料結構就是舞台。
I.線性結構 (一對一)
數組
連結清單
棧
先進後出,插入删除的操作時間複雜度都是O(1)
隊列
先進先出,插入删除的操作時間複雜度都是O(1)
II.非線性結構(一對多)
二叉樹,二叉堆等
III.非線性結構(多對多,圖太複雜,忽略,之後也不會講任何圖的知識)
圖
三.邏輯結構和實體結構
邏輯結構是抽象的概念,依賴于實體結構,所有的邏輯結構都是由實體結構擴充衍變而來。
實體結構
I.數組(順序存儲)
II.連結清單(鍊式存儲)

由上圖看時間複雜度,可得出,數組适用于讀取(查)較多的需求,連結清單适用于修改(增,删)較多的需求。
邏輯結構
棧,隊列,樹等。所有的邏輯結構都是由兩種基本的實體結構構成。比如,樹,可以由連結清單表示,也可以由數組表示。
四.哈希表
哈希表也叫“散清單”。這種資料機構提供了健值得映射關系。隻要給出一個key,就能高效的查找出它所比對的value,時間複雜度接近于O(1)。對于時間複雜度轉為空間複雜度的時候起到很重要的作用。是以用途非常廣泛。實體結構--數組是下标int和值,通過此概念,将key轉為下标,稱之為哈希函數。而數組是有限的,是以,哈希表的長度也是有限的,哈希表的key轉為下标也是有限的。因為多個key可能轉為同一個下标,則造成沖突,稱為“哈希沖突”。
常用解決哈希沖突方案:
I.開放尋址法
當一個key通過哈希函數找到對應的數組下标已經被占用時,我們用下一個沒有被占用的坑位。
II.連結清單法
哈希數組中存儲的對象是連結清單的形式,這樣每一個對象可以存儲多個值,當多個key轉為同一個下标時,都存儲在該連結清單節點中。
哈希表的讀取操作:
I.通過哈希函數,将key轉為對應的int下标。
II.找到數組下标對應的元素,如果這個元素的key不是我們想要找的“key”,則根據哈希沖突的方案,順着找下一個。(連結清單法則在該連結清單結點找下一個對應的值)
哈希表的擴容:
I.擴容,首先建立一個新的空數組,是原來的兩倍。
II.重新Hash,因為長度擴大後,hash的規則改變。
五.總結
以上,資料結構的基本概念全部講完,自我感覺資料結構最基本的本質是數組和連結清單,而算法就是将這基本的數組和連結清單如何拓展衍變為棧,隊列,樹等複雜的資料機構,衍變過程中的時間複雜度和空間複雜度就代表了該算法的好壞。