java架构师进阶之独孤九剑(一)-算法思想与经典算法
“
這是整個架構(gòu)師連載系列,分為9大步驟,我們現(xiàn)在還在第一個步驟:程序設計和開發(fā)->數(shù)據(jù)結(jié)構(gòu)與算法。
我們今天講解重點講解算法。
算法思想
1 貪心思想
顧名思義,貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上的局部最優(yōu)選擇。當然,希望貪心算法得到的最終結(jié)果也是整體最優(yōu)的。雖然貪心算法不能對所有問題都得到整體最優(yōu)解,但對許多問題它能產(chǎn)生整體最優(yōu)解。如單源最短路經(jīng)問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優(yōu)解,其最終結(jié)果卻是最優(yōu)解的很好近似。在面臨選擇時,貪心算法都作出對眼前來講最有利的選擇,不考慮對將來的不良影響,每個選擇一旦做出,不可更改,不允許回溯,根據(jù)不同的貪心策略,貪心算法就不同,貪心解的質(zhì)量也不同,所以貪心策略很重要。可以看出,此算法思想很簡單,具有高效性,但不一定得出最優(yōu)解。
2 分治法
當我們求解某些問題時,由于這些問題要處理的數(shù)據(jù)相當多,或求解過程相當復雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對于這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法后,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。
3 動態(tài)規(guī)劃
動態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問題。在這類問題中,可能會有許多可行解。每一個解都對應于一個值,我們希望找到具有最優(yōu)值的解。動態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。與分治法不同的是,適合于用動態(tài)規(guī)劃求解的問題,經(jīng)分解得到子問題往往不是互相獨立的。若用分治法來解這類問題,則分解得到的子問題數(shù)目太多,有些子問題被重復計算了很多次。如果我們能夠保存已解決的子問題的答案,而在需要時再找出已求得的答案,這樣就可以避免大量的重復計算,節(jié)省時間。我們可以用一個表來記錄所有已解的子問題的答案。不管該子問題以后是否被用到,只要它被計算過,就將其結(jié)果填入表中。這就是動態(tài)規(guī)劃法的基本思路。
4 搜索法
搜索法包含窮舉搜索,深度優(yōu)先搜索,廣度優(yōu)先搜索,回溯法,分支限界法,其實這些算法的基礎就是窮舉搜索,只是加上一定的原則來優(yōu)化過程,就形成了后面的幾種算法,回溯法就是在深度優(yōu)先搜索的基礎上允許回溯,分支限界法是在廣度優(yōu)先搜索基礎上允許剪枝,學習時主要學習思想,這些算法名字不要太在意。
5 新近出現(xiàn)的部分算法簡介
① 遺傳算法
從達爾文的生物進化論中得到啟發(fā),借鑒自然選擇和進化的原理,模擬生物在自然界的進化過程所形成的一種優(yōu)化求解方法,遺傳算法從代表問題的可能潛在解集的一個種群出發(fā),一個種群有一定數(shù)量的個體組成,每個個體實際上是染色體帶有特征的實體,每一代根據(jù)個體的適應度大小挑選個體,并借助遺傳算子進行交叉和變異,得到近似最優(yōu)解。
② 模擬退火算法
他的出發(fā)點是物理中固體的退火過程與一般組合優(yōu)化之間的相似性,固態(tài)物質(zhì)退火時,通常先加溫,使其中的粒子自由游動,然后逐漸降低溫度,粒子也逐漸形成低能態(tài)的晶格,最終形成最低能量的基態(tài)。所以他從某一較高初溫開始,伴隨溫度參數(shù)的不斷下降重復抽樣,最終得到全局最優(yōu)解,他是基于概率的。
③ 蟻群算法
蟻群算法是模擬自然界螞蟻覓食過程的一種分布式,啟發(fā)式群體智能算法,用于求解復雜的組合優(yōu)化問題,如TSP,JSSP,GCP等問題。
6 遞歸法
所謂遞歸,就是指如果需要求解當前狀態(tài)就需要求解其依賴的遷移狀態(tài)。
一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
采用遞歸描述的算法通常有這樣的特征:
1)為求解規(guī)模為N的問題,設法將它分解成規(guī)模較小的問題;
2)然后從這些小問題的解方便地構(gòu)造出大問題的解,并且這些規(guī)模較小的問題也能采用同樣的分解和綜合方法,分解成規(guī)模更小的問題,并從這些更小問題的解構(gòu)造出規(guī)模較大問題的解。
3)這樣的分解方法具有收斂性。即存在一個遞歸返回狀態(tài)。
7 迭代法
也稱輾轉(zhuǎn)法,是一種不斷用變量的舊值遞推新值的過程。
最常見的迭代法是牛頓法。其他還包括最速下降法、共軛迭代法、變尺度迭代法、最小二乘法、線性規(guī)劃、非線性規(guī)劃、單純型法、懲罰函數(shù)法、斜率投影法、遺傳算法、模擬退火等等。
利用迭代算法解決問題,需要做好以下三個方面的工作:
1)迭代變量:在可以用迭代算法解決的問題中,至少存在一個直接或間接地不斷由舊值遞推出新值的變量,這個變量就是迭代變量。
2)迭代關系:指如何從變量的前一個值推出其下一個值的公式(或關系)。迭代關系式的建立是解決迭代問題的關鍵,通常可以使用遞推或倒推的方法來完成。
3)迭代過程:迭代過程的控制通常可分為兩種情況:一種是所需的迭代次數(shù)是個確定的值,可以計算出來;另一種是所需的迭代次數(shù)無法確定。對于前一種情況,可以構(gòu)建一個固定次數(shù)的循環(huán)來實現(xiàn)對迭代過程的控制;對于后一種情況,需要進一步分析出用來結(jié)束迭代過程的條件。
迭代法都可以轉(zhuǎn)為遞歸法。迭代法可以理解為具有遞歸性質(zhì)的非遞歸解法。當然,非遞歸解法還可利用棧的思想。
經(jīng)典算法
排序算法
排序大的分類可以分為兩種:內(nèi)排序和外排序。在排序過程中,全部記錄存放在內(nèi)存,則稱為內(nèi)排序,如果排序過程中需要使用外存,則稱為外排序。下面講的排序都是屬于內(nèi)排序。
內(nèi)排序有可以分為以下幾類:
(1)、插入排序:直接插入排序、二分法插入排序、希爾排序。
(2)、選擇排序:簡單選擇排序、堆排序。
(3)、交換排序:冒泡排序、快速排序。
(4)、歸并排序
(5)、基數(shù)排序
查找算法
1. 順序查找
2. 二分查找
3. 插值查找
4. 斐波那契查找
5. 樹表查找
6. 分塊查找
7. 哈希查找
查找是在大量的信息中尋找一個特定的信息元素,在計算機應用中,查找是常用的基本運算,例如編譯程序中符號表的查找。以上是常見的七種查找算法,說是七種,其實二分查找、插值查找以及斐波那契查找都可以歸為一類——插值查找。插值查找和斐波那契查找是在二分查找的基礎上的優(yōu)化查找算法。
后續(xù)再詳細介紹具體的數(shù)據(jù)結(jié)構(gòu)。
你可能也喜歡:
總結(jié)
以上是生活随笔為你收集整理的java架构师进阶之独孤九剑(一)-算法思想与经典算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我对DevOps的理解
- 下一篇: 阿里P8架构师谈:大数据架构设计(文章合