0x01 二分法
原理:
二分法查找,也稱為折半法,是一種在有序數(shù)組中查找特定元素的搜索算法。
一般步驟:
(1)確定該區(qū)間的中間位置K;
(2)將查找的值T與array[k]比較。
若相等,查找成功返回此位置;否則確定新的查找區(qū)域,繼續(xù)二分查找。每一次查找與中間值比較,可以確定是否查找成功,不成功當(dāng)前查找區(qū)間將縮小一半,遞歸查找即可。
0x02 遞歸
原理:
一種通過重復(fù)將問題分解為同類的子問題而解決問題的方法
典型例子:
斐波那契數(shù)列
描述:斐波那契數(shù)列指的是這樣一個數(shù)列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368.....自然中的斐波那契數(shù)列") 自然中的斐波那契數(shù)列,這個數(shù)列從第3項開始,每一項都等于前兩項之和。
解決方式:
def f(n, mermory={}):
if n == 1 or n == 2:
return 1
else:
try:
return mermory[n]
except KeyError:
result = f(n-1)+f(n-2)
mermory[n] = result
return result
print(f(9))
0x03 回溯法
原理:
在搜索嘗試過程中尋找問題的解,當(dāng)發(fā)現(xiàn)已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。
回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。
但當(dāng)探索到某一步時,發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個狀態(tài)的點稱為“回溯點”。
解決問題一般步驟:
1、 針對所給問題,定義問題的解空間,它至少包含問題的一個(最優(yōu))解。
2 、確定易于搜索的解空間結(jié)構(gòu),使得能用回溯法方便地搜索整個解空間 。
3 、以深度優(yōu)先的方式搜索解空間,并且在搜索過程中用剪枝函數(shù)避免無效搜索。
典型例子:
八皇后問題
描述:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。
解決方式:https://blog.csdn.net/weixin_41865447/article/details/80034433
0x04 排序算法
概念:
將雜亂無章的數(shù)據(jù)元素,通過一定的方法按關(guān)鍵字順序排列的過程叫做排序。
分類:
非穩(wěn)定排序算法:快速排序、希爾排序、堆排序、直接選擇排序
穩(wěn)定的排序算法:基數(shù)排序、冒泡排序、直接插入排序、折半插入排序、歸并排序
0x05 搜索算法
利用計算機(jī)的高性能來有目的的窮舉一個問題解空間的部分或所有的可能情況,從而求出問題的解的一種方法。
分類:
枚舉算法、深度優(yōu)先搜索、廣度優(yōu)先搜索、A*算法、回溯算法、蒙特卡洛樹搜索、散列函數(shù)等算法。
0x06 哈希算法
將一個數(shù)據(jù)轉(zhuǎn)換為一個標(biāo)志,這個標(biāo)志和源數(shù)據(jù)的每一個字節(jié)都有十分緊密的關(guān)系。
很難找到逆向規(guī)律
只要符合散列思想的算法都可以被稱為是Hash算法
對不同的關(guān)鍵字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),這種現(xiàn)象稱為碰撞。
0x07 貪心算法
原理
在對問題求解時,總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的是在某種意義上的局部最優(yōu)解。
從問題的某一個初始解出發(fā)一步一步地進(jìn)行,根據(jù)某個優(yōu)化測度,每一步都要確保能獲得局部最優(yōu)解。每一步只考慮一個數(shù)據(jù),他的選取應(yīng)該滿足局部優(yōu)化的條件。若下一個數(shù)據(jù)和部分最優(yōu)解連在一起不再是可行解時,就不把該數(shù)據(jù)添加到部分解中,直到把所有數(shù)據(jù)枚舉完,或者不能再添加算法停止。
一種近似算法
一般步驟:
1、建立數(shù)學(xué)模型來描述問題;
2、把求解的問題分成若干個子問題;
3、對每一子問題求解,得到子問題的局部最優(yōu)解;
4、把子問題的解局部最優(yōu)解合成原來解問題的一個解。
典型例子:
0/1背包問題
馬踏棋盤
均分紙牌
例題:https://www.cnblogs.com/hust-chen/p/8646009.html
0x08 分治算法
概念:
分治算法的基本思想是將一個規(guī)模為N的問題分解為K個規(guī)模較小的子問題,這些子問題相互獨立且與原問題性質(zhì)相同。求出子問題的解,就可得到原問題的解。即一種分目標(biāo)完成程序算法,簡單問題可用二分法完成。
一般步驟:
(1)分解,將要解決的問題劃分成若干規(guī)模較小的同類問題;
(2)求解,當(dāng)子問題劃分得足夠小時,用較簡單的方法解決;
(3)合并,按原問題的要求,將子問題的解逐層合并構(gòu)成原問題的解。
典型例子:
排序中:歸并排序、堆排序、快速排序;
實例:找偽幣、求最值、棋盤覆蓋
https://baike.baidu.com/item/%E5%88%86%E6%B2%BB%E7%AE%97%E6%B3%95/3263297
0x09 動態(tài)規(guī)劃
概念:
用于求解具有某種最優(yōu)性質(zhì)的問題。在這類問題中,可能會有許多可行解。每一個解都對應(yīng)于一個值,我們希望找到具有最優(yōu)值的解。
動態(tài)規(guī)劃一般可分為線性動規(guī),區(qū)域動規(guī),樹形動規(guī),背包動規(guī)四類。
舉例:
線性動規(guī):攔截導(dǎo)彈,合唱隊形,挖地雷,建學(xué)校,劍客決斗等;
區(qū)域動規(guī):石子合并, 加分二叉樹,統(tǒng)計單詞個數(shù),炮兵布陣等;
樹形動規(guī):貪吃的九頭龍,二分查找樹,聚會的歡樂,數(shù)字三角形等;
背包問題:01背包問題,完全背包問題,分組背包問題,二維背包,裝箱問題,擠牛奶(同濟(jì))等;
應(yīng)用實例:
最短路徑問題 ,項目管理,網(wǎng)絡(luò)流優(yōu)化等;
0x10 字符串匹配算法
概念:
在一個給定的字符文本內(nèi)搜尋出自己想要找的一個字符串,平常所用的各種文本編輯器里的ctrl+F大多就是使用的這些字符匹配算法。
分類:
KMP、BM、Sunday、Horspool、RK
參考:
https://cloud.tencent.com/developer/news/282694
https://blog.csdn.net/paincupid/article/details/81159320