別人的《演算法圖解》筆記+自己的一些思考

Tech In Pieces發表於2021-01-02

在這裡插入圖片描述

前言:
這個筆記我大致瀏覽了一下 非常簡略 但是有一些非常好的觀察。也給出了不少需要注意的點。

正文:

  • 僅當列表是有序的 二分查詢才有效,但是要注意順序是不是重要,如果重要我們才能預排序。而且要注意有時候反過來想:有時候我們需要查詢一些東西,而且是順序並不重要 這個時候我們要想起來用二分查詢進行優化,而不是題目提示你用二分查詢你才想起來。
  • 每個遞迴函式都有兩部分,基線條件(base case) 和 遞迴條件(recursive case)。遞迴條件指的是函式呼叫自己,基線條件指的是函式不再呼叫自己,從而避免形成無限迴圈
  • 優化遞迴的呼叫棧,有2種方法
    重新編寫程式碼,轉而使用迴圈
    使用尾遞迴。這是一個高階的主題,不在本書的討論範圍內,另外,並非所有的語言都支援尾遞迴。
  • 雜湊表要避免衝突,需要有: better hashing function(當前最安全的密碼雜湊函式是 bcrypt,但沒有任何東西是萬無一失的。) and low loading factor.
  • 在無向圖中,每條邊都是一個環。迪傑斯特拉演算法只能用於有向無環圖(directed acyclic graph, DAG),如果有負權邊,就不能使用迪傑斯特拉演算法。
  • 在有負權邊的圖中,要求最短路徑,需要用到貝爾曼-福德演算法(Bellman-Ford algorithm)
  • 判斷是否是 NP 完全問題
    元素較少時演算法的執行速度非常快,但隨著元素數量的增加,速度會變得非常慢。
    涉及“所有組合”的問題通常是 NP 完全問題。
    不能將問題分成小問題,必須考慮各種可能的情況。這可能是 NP 完全問題。
    如果問題涉及序列,(如旅行商問題中的城市序列)且難以解決,它可能就是 NP 完全問題。
    如果問題涉及集合(如廣播臺集合),且難以解決,它可能就是 NP 完全問題。
    如果問題可轉換為集合覆蓋問題或旅行商問題,那它肯定是 NP 完全問題。
  • NP完全問題目前沒有辦法直接找到最優解 只能用近似演算法或者啟發式演算法。
  • 沒有放之四海皆準的計算動態規劃的公式,動態規劃是一門藝術
  • Fun fact: git diff 命令指出兩個檔案的差異,使用的就是動態規劃實現的。
  • 布隆過濾器是一個概率型資料結構,它提供的答案有可能不對,但很可能是正確的。可能出現錯報的情況,但是不可能出現漏報的情況。布隆過濾器非常適合用於不要求答案絕對準確的情況。面臨海量資料且只要求答案八九不離十時,可考慮使用概率型演算法。
  • SHA 雜湊函式是區域性不敏感的,有一個字元變化,都會導致其雜湊值截然不同。有時候希望雜湊函式是區域性敏感的。在這種情況下,可使用 Simhash。如果你對字串做細微的修改,Simhash 生成的雜湊值也只存在細微的差別。這讓你能夠通過比較雜湊值來判斷兩個字串的相似程度。需要檢查兩項內容的相似程式時,Simhash 很有用。
    Google 使用 Simhash 來判斷網頁是否已蒐集。
    老師可以使用 Simhash 來判斷學生的論文是否是從網上抄的。
    Scribd 允許使用者上傳文件或圖書,以便與人分享,但不希望使用者上傳有版權的內容。這個網站可使用 Simhash 來檢查上傳的內容是否與出版的小說類似,如果類似,就自動拒絕。

相關文章