為什麼不去重視下算法?
1. 因為平時工作基本用不上;(不重視)
2. 算法太枯燥;(沒耐心)
3. 算法難學;(智商餘額不足)
但是你得改。本文列舉幾個常用算法概要大綱!
現在的進階語言,給我們帶來了許多的開發的友善,但是也更讓我們更傻瓜了。
甚至在99%的工作中,我們完全不了解算法,就可以把工作做好,頂多要多做的一件事就是,在不知道怎麼辦的時候,到網上去搜尋下該語言的工具類庫就好了。
然而,如果沒有這些工具類庫的情況下,你怎麼辦呢?
在解決問題的時候,如果隻能想到使用工具類庫去解決問題,甚至都不知道其實作原理,那麼這些知識是多麼的脆弱,多麼的死闆?
其實,到高手過招的時候,都是比的資料,比的算法。
是以,切莫沉溺工具類,而應該真正去掌握算法,至少常用的算法能夠熟記于心,手到擒來!
下面列舉幾個常用算法的方向,作為研究的方向。
1. 常用排序算法
1.1. 冒泡排序(Bubble Sort)
冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
1.2. 選擇排序(Selection Sort)
選擇排序(Selection-sort)是一種簡單直覺的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
1.3. 插入排序(Insertion Sort)
插入排序(Insertion-Sort)的算法描述是一種簡單直覺的排序算法。它的工作原理是通過建構有序序列,對于未排序資料,在已排序序列中從後向前掃描,找到相應位置并插入。
1.4. 希爾排序(Shell Sort)
1959年Shell發明,第一個突破O(n2)的排序算法,是簡單插入排序的改進版。它與插入排序的不同之處在于,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。
1.5. 歸并排序(Merge Sort)
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。将已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若将兩個有序表合并成一個有序表,稱為2-路歸并。
1.6. 快速排序(Quick Sort)
快速排序的基本思想:通過一趟排序将待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分别對這兩部分記錄繼續進行排序,以達到整個序列有序。
1.7. 堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。
1.8. 堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。
1.9. 桶排序(Bucket Sort)
桶排序是計數排序的更新版。它利用了函數的映射關系,高效與否的關鍵就在于這個映射函數的确定。桶排序 (Bucket sort)的工作的原理:假設輸入資料服從均勻分布,将資料分到有限數量的桶裡,每個桶再分别排序(有可能再使用别的排序算法或是以遞歸方式繼續使用桶排序進行排)。
1.10. 基數排序(Radix Sort)
基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先級順序的,先按低優先級排序,再按高優先級排序。最後的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。
具體算法示例請參考(超祥細): https://www.cnblogs.com/onepixel/articles/7674659.html
2. 常用查找算法
2.1. 順序查找
順序查找又稱為線性查找,是一種最簡單的查找方法。适用于線性表的順序存儲結構和鍊式存儲結構。該算法的時間複雜度為O(n)。
2.2. 二分查找
二分查找(Binary Search),是一種在有序數組中查找某一特定元素的查找算法。查找過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則查找過程結束;如果某一特定元素大于或者小于中間元素,則在數組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種查找算法每一次比較都使查找範圍縮小一半。
2.3. 插值查找
插值查找是根據要查找的關鍵字key與查找表中最大最小記錄的關鍵字比較後的 查找方法,其核心就在于插值的計算公式 (key-a[low])/(a[high]-a[low])*(high-low)。
2.4. 二叉樹查找算法
二叉查找樹是先對待查找的資料進行生成樹,確定樹的左分支的值小于右分支的值,然後在就行和每個節點的父節點比較大小,查找最适合的範圍。 這個算法的查找效率很高,但是如果使用這種查找方法要首先建立樹。
2.5. 平衡查找樹之2-3查找樹(2-3 Tree)
2.6. 平衡查找樹之紅黑樹(Red-Black Tree)
整個樹完全黑色平衡,即從根節點到是以葉子結點的路徑上,黑色連結的個數都相同(2-3樹的第2)性質,從根節點到葉子節點的距離都相等)。
2.7. B樹和B+樹(B Tree/B+ Tree)
2.8. 分塊查找
分塊查找又稱索引順序查找,它是順序查找的一種改進方法。
算法思想:将n個資料元素"按塊有序"劃分為m塊(m ≤ n)。每一塊中的結點不必有序,但塊與塊之間必須"按塊有序";即第1塊中任一進制素的關鍵字都必須小于第2塊中任一進制素的關鍵字;而第2塊中任一進制素又都必須小于第3塊中的任一進制素。
2.9. 哈希查找
哈希的思路很簡單,如果所有的鍵都是整數,那麼就可以使用一個簡單的無序數組來實作:将鍵作為索引,值即為其對應的值,這樣就可以快速通路任意鍵的值。這是對于簡單的鍵的情況,我們将其擴充到可以處理更加複雜的類型的鍵。
詳細資訊請參考: https://www.cnblogs.com/yw09041432/p/5908444.html
3. 加密算法
常見的加密算法可以分成三類,對稱加密算法,非對稱加密算法和Hash算法。
常見的對稱加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES
常見的非對稱加密算法:RSA、ECC(移動裝置用)、Diffie-Hellman、El Gamal、DSA(數字簽名用)
常見的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1
詳情可參考: https://www.cnblogs.com/colife/p/5566789.html
4. 圖論算法
Dijkstra算法
Floyd算法
Prim算法
Kruskal算法
可簡單參考: https://www.cnblogs.com/wangmengmeng/p/5277225.html
5. 并行算法
并行算法就是用多台處理機 聯合求解問題的方法和步驟,其執行過程是将給定的問題首先分解成若幹個盡量互相獨立的子問 題,然後使用多台計算機同時求解它,進而最終求得原問題的解。
百科解釋: https://m.baidu.com/sf_bk/item/并行算法/967188?fr=aladdin&ms=1&rid=10850472149522734565
6. 随機化算法
參考: https://www.jianshu.com/p/dec9a453573f
7. 動态規劃算法
動态規劃算法的基本思想與分治法類似,也是将待求解的問題分解為若幹個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的局部解,通過決策保留那些有可能達到最優的局部解,丢棄其他局部解。依次解決各子問題,最後一個子問題就是初始問題的解。
https://blog.csdn.net/baidu_37107022/article/details/73188963
https://blog.csdn.net/baidu_37107022/article/details/73189125
https://blog.csdn.net/baidu_37107022/article/details/78253222?utm_source=blogxgwz0
8. 計算幾何的算法
9. 厄米變形模型
10. 随機森林算法
不重視算法,不代表不會算法,其實真正遇到問題時,我們仍然是會想各種辦法解決的,是以從本質上我們都在使用算法。但是,算法的是很燒腦的東西,很多巨人的智慧結晶,隻有不斷地學習他們的知識,應用到工作中,才會事半功倍。
其實算法作為一個開發人員的基本功,是一定要引起重視的,否則最後就隻會輪為一個業務的工具。
隻有立足于算法之上,才能走得遠,站得高。
不要害怕今日的苦,你要相信明天,更苦!