這是一輛開往算法幼兒園的車,磨磨唧唧地看完了《算法圖解》這本書,真的是不錯的算法入門書。
趁這個機會再複習一下並優化一下以前的筆記,也分享下以前的筆記,有些許心得和思考。全書不到200頁,對算法感興趣還未接觸過的同窗推薦你看下原書。
筆記中小結皆引自原文git
第一至第四章內容較少,筆記記爲一篇。
第五至第六章內容較少,筆記記爲一篇。github
- 二分查找:很常見的在有序列表中作比較再作範圍排除的查找算法,例如:35?大了。20?小了。25?對了。這就是個二分查找。
- 大O表示法,一種指出算法運行時間(隨元素數)的增速的表示方法(忽略常數係數),可以讓你比較方便的比較達到目的的(所需的)操做(次)數。如O(n),則對於元素數爲n的列表,查找所需操做次數也爲n。
- 數組和鏈表兩種數據結構。數組在內存中是連續的,由索引指向。鏈表中的每一個元素都有指向下個元素的地址。
- 選擇排序:逐步找出剩餘項中最大(小)值的算法。
- 使用分而治之的思想解決問題,將問題拆分爲最小問題,解決併合並獲得最終解。
- 快排算法正是使用了這種思想的算法。快排算法找一項的值爲基準值,將每一個元素與基準值按大小關係分爲左分區和右分區,並在左分區和右分區作重複操做,直至分區只有一項(分而治之),而後合併全部(單項)子分區,獲得排序結果。
- 合併排序:將待排序列逐層拆分,直到成爲單個項,並逐層兩兩合併,合併時比較第一項的大小並放入新的數組(一樣是分而治之)。
- js中的對象是基於散列表結構的。
- 散列表是根據關鍵碼值(Key value)而直接進行訪問的數據結構,因此查找很快。應用也就是用來作查找,去重和緩存(去重和緩存仍是依賴於查找)。
- 圖:節點加邊,如:○———>○,這就是個基本的圖。圖根據有沒有箭頭分爲有向圖和無向圖,其中無向圖是即雙向關係(a指b,b也指向a)的圖。
- 廣度優先搜索:按層遍歷,遍歷完第一層關係後進行第二層的遍歷,實際操做時,可先將根節點添加至隊列,檢測根節點,如不是目標值,移出根節點,再將根節點的子節點(所指向的節點)添加至隊列,循環直到找到目標值。
此章節書中有錯誤,糾錯查看筆記算法
- 加權圖:邊上有權重值的圖
- 若是說廣度優先搜索可查找至目標的(通過)最少邊路徑,那麼狄克斯特拉算法就能夠查找最低(權重,能夠是金錢花費,時間花費)成本的路徑。
-
實際操做(詳細實例操做看筆記):數組
- 列出除起點外的全部節點;
- 對起點外節點添加權重值,其中起點直接指向的節點的權重是能直接列出的,其餘節點可列爲∞(無窮);
- 找到目前權重最小的節點,重複步驟2,即列出此節點指向節點的權重(需途徑當前節點),若已有權重,則與當前權重比較取較小值並更新,同時將當前節點標記爲已操做。
- 找到目前未操做的權重最小的節點,重複上述步驟;
- 全部節點操做完畢後,便可獲得達到終點的最小權重。
- 路徑怎麼找呢,在上述添加個更新權重的時候,應該記錄到達此節點的上一個節點是誰,那麼從終點向上便可獲得當前的最短路徑。
- 貪婪算法不是具體的算法,而是一種解決問題的思想,經過局部利益的最大化,最終可以實現全局利益的最大化或者能夠說是接近於全局利益最大化。好比:前文的狄克斯特拉算法,就是每步先找當前權重最小的值,或者如何在有限的時間內安排最多的課程,就安排在剩餘時間裏最先開始並最先結束的課程。
- 能夠較快的解決NP徹底問題
- 簡單的說NP徹底問題是難以解決的問題,大多須要先列出全部的解,再找到最小的那個,複雜度會隨元素數量急劇增長。
- 將問題分爲小問題,並先着手解決這些小問題。與分而治之不一樣的是,分而治之須要在計算每一個子問題的時候都進行一邊計算,而動態規劃則更可能是範圍變大的子問題與以前的更小範圍的子問題的結果進行比較。這一章節比較很差理解,參考個人筆記也可能會有些片面,你們能夠本身查查資料。
- 經典問題:揹包問題
- 所謂K最近鄰,就是K個最近的鄰居的意思,說的是每一個樣本均可以用它最接近的K個鄰居來表明。
-
運用:緩存
- 分類:你與k我的的歌曲喜愛類似,那麼這k我的的喜愛歌曲就能夠推送給你
- 迴歸:今天的其餘狀況(天氣,日期,活動等)與k天的相似,那麼就能夠經過k天的平均營業額推測今天的營業額
結束了,每章小結真是複習和閱讀解惑的好東西。數據結構