最近看了第一本演算法相關書籍,名字就叫做《我的第一本演算法書》,作者是日本的宮崎修一和石田保輝。本書用大量輔以詳細分步講解,以直觀、通俗易懂的方式展現了資料結構和一些基礎演算法,便於學習和記憶。通過本書的學習,對上個學期的沒有學精的資料結構有了更為深入的理解,特別是堆,之前一直對大頂堆小頂堆迷迷糊糊,讀過之後,便對堆的插入和取出的過程非常了解了,除此之外,還對更多演算法有了一定的了解。
在課程的學習中,我們接觸了floyd演算法求解各個頂點的最短距離,時間複雜度為o(n3),還接觸了dijkstra演算法求最短路徑的問題,時間複雜度為o(n2)。在本書中,我還學習了bellman-ford演算法來求最短路徑,設圖的頂點數為n,邊數為m,該演算法經過n輪更新操作就會停止,每輪更新操作都要對各個邊進行一次確認,所以每輪更新的時間就是o(m),整體的時間複雜度就是o(nm)。dijkstra演算法相較於bellman-ford演算法,前者多了一步選擇頂點的操作,這使得它在求最短路徑上效率更高,但是如果當圖中含有負數權重,前者可能會給出錯誤答案,因此,dijkstra演算法不適用於含負權的圖。如果當圖中存在負權,即便較為耗時,也應採用bellman-ford演算法。另外,還接觸了一種預處理求最短路徑問題的演算法叫a演算法,原理是預先估算乙個值,並用這個值來省去一些沒有必要的計算。書中用了乙個迷宮圖的例子,直觀的解析了a演算法的原理和步驟,但經過學習,也了解到了使用a演算法有一定的限制:如果啟發資訊是完全無法估算的,這時就不能使用a演算法。當然,距離估算值越接近目標值,a*演算法的搜尋效率就越高,反之,效率會變低甚至得不到正確答案。
再說乙個從書中學習到的新知識,聚類。聚類就是再輸入為多個資料時,將相似的資料分為一組的操作,那麼首先就要定義乙個相似的標準,然後再採用符合條件的演算法。書裡講到的k-means演算法是聚類演算法最有代表性的一種,可以根據事先給定的簇的數量進行聚類。隨機選擇幾個簇的中心點,數量就是簇的數量,然後重複執行「將資料分到相應的簇中」、「將中心點移到重心的位置」這兩步操作直至中心點不再變化,聚類也就完成了。在這個演算法中,隨著操作的不斷重複,中心點的位置必定會在某處收斂。k-means演算法也存在一些缺陷,要事先確定好k的值,如果不合理,也有可能會不符合需求。
書中還有一大章安全演算法也不在此一一贅述了,總之開卷有益,能從書中學習新知識並可以樂在其中,就是很快樂的事情。
《我的第一本演算法書》
我的第一本演算法書 日 石田保輝 宮崎修一 著 張貝 譯 冒泡 選擇 插入 氣泡排序演算法 o n 2 重複 從序列右邊開始比較相鄰兩個數字的大小,在根據結果交換兩個數字的位置 這一操作的演算法 private void bubblesort int arr 選擇排序 o n 2 重複 從待排序的資...
第一本演算法書 結構
雜湊表 雜湊表儲存是由key value組成的資料 使用雜湊表解決線性查詢費時的問題 準備陣列來儲存資料 使用hash計算雜湊值 放入對應的陣列位置中 放入過程中會遇到相同的值導致衝突 可以使用鍊錶在已有資料的後面繼續儲存新資料 鏈位址法 也可以計算出候選位址解決衝突 開放位址法 以及線性探測法 放...
《我的第一本演算法書》隨手記(2)
看了幾本圖靈系列的漫畫書,隨手記些要點,方便回憶!佇列的資料呈線性排列,佇列中新增和刪除資料分別在兩端進行。入隊 出隊 像佇列這種先進去的資料最先被取出來,即 先進先出 的結構,簡稱fifo。先來的資料先處理是一種常用的思路,因此,列表的應用很廣泛。如廣度優先搜尋演算法。雜湊表中儲存的是由鍵 key...