天天看點

《算法與資料結構 精要筆記》 (一)基礎概念

題記:題主工作三年,前段時間面試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的規則改變。

   五.總結

      

《算法與資料結構 精要筆記》 (一)基礎概念

      以上,資料結構的基本概念全部講完,自我感覺資料結構最基本的本質是數組和連結清單,而算法就是将這基本的數組和連結清單如何拓展衍變為棧,隊列,樹等複雜的資料機構,衍變過程中的時間複雜度和空間複雜度就代表了該算法的好壞。