!!!看了幾本圖靈系列的漫畫書,隨手記些要點,方便回憶!!!
佇列的資料呈線性排列,佇列中新增和刪除資料分別在兩端進行。
入隊、出隊
像佇列這種先進去的資料最先被取出來,即「先進先出」的結構,簡稱fifo。
先來的資料先處理是一種常用的思路,因此,列表的應用很廣泛。如廣度優先搜尋演算法。
雜湊表中儲存的是由鍵(key)值(value)對組成的資料。
雜湊表的結構可理解為由陣列和鍊錶組成。
向hash表中新增資料,先計算hash值,找到資料要存入的hash桶(陣列),若hash桶中沒有資料,則將資料存入,若已有資料,即發生衝突,將新資料以鍊錶的形式掛在老資料的後面。
從hash中取出資料, 先計算hash值,找到資料要取出的hash桶(陣列),再在hash桶的資料鏈表中進行查詢。
使用hash表時,如果hash桶太小,就容易發生衝突,線性查詢的頻率就會更高,反過來,如果陣列的空間太大,就會出現很多空的hash桶,造成記憶體的浪費,所以設定hash桶合適大小非常重要。
堆是一種圖的樹形結構,在堆的樹形結構中,各個頂點被稱為結點(node),資料就儲存在這些結點中。
堆中每個節點最多有兩個子結點。
結點的排列順序為從上到下,同一行則為從左到右。
堆中儲存資料必須遵循一條規則:子結點必須大於父結點,所以最小值都被儲存在頂端的根結點中。
向堆中新增資料,為了遵守規則,一般先將資料放在最下面一行靠左的位置,若沒有位置了就再起一行,然後比較最新的資料和其父節點,若不滿足規則,則交換父子結點的位置,重複比較和交換操作,直到資料符合規則。
從堆中取出資料時,取出的是最上面的資料;由於最上面的資料被取出,將堆中最後面的資料放到被取出的結點位置,然後比較結點的資料與其子結點的資料,若不滿足規則,則從其與子結點中比較小的乙個進行交換,,重複比較和交換操作,直到資料符合規則。
堆中最頂端的資料始終最小,因此從堆中取出最小值的時間複雜度都是o(1)。
從堆中取資料和向堆中新增資料需要重構堆結構,因此取出和新增資料的複雜度為o(logn)。
如果需要頻繁的從資料中取出最小值,那麼堆的操作會非常方便。如狄克斯特拉演算法。
二叉查詢樹又叫二叉搜尋數或二叉排序樹。採用圖的樹形結構,資料儲存在樹的結點中。
二叉樹有兩個性質:一是每個結點的值均大於其左樹上任意乙個結點的值,二是每個結點的值均小於其右樹上的任意乙個結點的值。
向二叉樹中新增資料,先將資料與頂端結點比較,小於則向左移動,大於則向右移動,然後繼續比較,直到資料移動到最下面的結點。
從二叉樹中刪除資料,先刪除掉結點資料,然後在被刪除結點的左數中尋找最大結點,將最大結點移動到被刪除的位置上,若被移動的結點還存在子節點,重複以上的操作。另外在右數中尋找最小結點,可以達到同樣的效果。
若二叉樹比較均衡的話,時間複雜度為o(logn),若不均衡的話,時間複雜度為o(n)。
有很多以二叉查詢樹為基礎擴充套件的資料結構,比如平衡二叉查詢樹,這種結構可以修正形狀不均衡的數,讓其始終保持均衡,以提高查詢效率。
《我的第一本演算法書》
我的第一本演算法書 日 石田保輝 宮崎修一 著 張貝 譯 冒泡 選擇 插入 氣泡排序演算法 o n 2 重複 從序列右邊開始比較相鄰兩個數字的大小,在根據結果交換兩個數字的位置 這一操作的演算法 private void bubblesort int arr 選擇排序 o n 2 重複 從待排序的資...
第一本演算法書 結構
雜湊表 雜湊表儲存是由key value組成的資料 使用雜湊表解決線性查詢費時的問題 準備陣列來儲存資料 使用hash計算雜湊值 放入對應的陣列位置中 放入過程中會遇到相同的值導致衝突 可以使用鍊錶在已有資料的後面繼續儲存新資料 鏈位址法 也可以計算出候選位址解決衝突 開放位址法 以及線性探測法 放...
Note 讀《我的第一本演算法書》有感
最近看了第一本演算法相關書籍,名字就叫做 我的第一本演算法書 作者是日本的宮崎修一和石田保輝。本書用大量輔以詳細分步講解,以直觀 通俗易懂的方式展現了資料結構和一些基礎演算法,便於學習和記憶。通過本書的學習,對上個學期的沒有學精的資料結構有了更為深入的理解,特別是堆,之前一直對大頂堆小頂堆迷迷糊糊,...