天天看點

為什麼不算法?常用算法概要大綱!

為什麼不去重視下算法?
  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. 随機森林算法

       不重視算法,不代表不會算法,其實真正遇到問題時,我們仍然是會想各種辦法解決的,是以從本質上我們都在使用算法。但是,算法的是很燒腦的東西,很多巨人的智慧結晶,隻有不斷地學習他們的知識,應用到工作中,才會事半功倍。

       其實算法作為一個開發人員的基本功,是一定要引起重視的,否則最後就隻會輪為一個業務的工具。

       隻有立足于算法之上,才能走得遠,站得高。

不要害怕今日的苦,你要相信明天,更苦!

繼續閱讀