算法导论系列:分治算法
說起分治法,大家一定也都聽過秦始皇采用郡縣制將國家分為三十六郡的故事,我們常說”山高皇帝遠(yuǎn)”,意思就是山高路遠(yuǎn),皇帝都管不了,實(shí)際上無論皇帝多遠(yuǎn),山有多高,整個(gè)國家都屬于朝廷統(tǒng)治,但皇帝一個(gè)人是管不了這么多事情的,那如何一統(tǒng)天下?秦始皇的郡縣制其實(shí)就是分而治之的一種變種,我們現(xiàn)在的國家也是這樣,國家分省,市,縣,鄉(xiāng),這樣層次管理,無論在那個(gè)偏僻的角落,都不是無政府的.
而我們的分治法,其實(shí)是一種很古老的策略,<孫子兵法>里有句古話,”凡治眾如治寡,分?jǐn)?shù)是也”,這里的”分?jǐn)?shù)”,是指分到各層次的部分,”數(shù)”是指每部分人的人數(shù),意思就是將帥只需要通過管理少數(shù)幾個(gè)人即可實(shí)現(xiàn)管理全部隊(duì)的各個(gè)組織,這樣,人數(shù)眾多的軍隊(duì),就如同管理幾個(gè)人一樣容易.在算法設(shè)計(jì)中,我們也引入分而治之的策略,稱為分治算法,其本質(zhì)其實(shí)就是將一個(gè)問題分解為若干個(gè)規(guī)模較小的相同子問題,分而治之.
分治算法秘籍:
分治法解題的基本步驟如下:
1:分解問題:
將要解決的問題分解為若干個(gè)規(guī)模較小,相互獨(dú)立,與原問題形式相同的子問題
2:問題治理:
求解各個(gè)子問題,由于各個(gè)子問題和原問題的形式相同,只是規(guī)模較小,因此當(dāng)子問題劃分的足夠小時(shí),我們就可以用較為簡單的方法去解決.
3:問題合并
按照原問題的要求,將子問題的解逐層的合并構(gòu)成原問題的解.
一句話總結(jié),分治法就是將一個(gè)難以直接解決的大問題,分割成規(guī)模較小的相同子問題,以便各個(gè)擊破,分而治之.
在使用分治法時(shí),使用遞歸算法是解決問題的利器.下面我們用二分搜索,這個(gè)最典型的分治問題來舉例,看看分治算法是如何進(jìn)行工作的.
二分搜索-猜數(shù)問題
我們一定都玩過猜數(shù)游戲,現(xiàn)在我們兩個(gè)人玩這個(gè)游戲,我在我的手心寫一個(gè)100以內(nèi)的整數(shù),并且只能給你大了或小了的提示,并且只有三次機(jī)會(huì),那如何才能以最快的速度猜出來呢?
解題思路:
從問題的描述來看,如果是n個(gè)數(shù),最壞的情況我們得猜n次才可以成功,其實(shí)我們沒有必要非得一個(gè)個(gè)的去猜,這顯然是一個(gè)笨方法,因?yàn)檫@些數(shù)是有序的,我們可以按照折半查找的方式,每次和中間的元素去比較,如果每次比中間的部分大,去后半部分找,比中間部分小,去后半部分找.
那我們現(xiàn)在思路有了,可以將問題抽象描述出來:
給定n個(gè)元素,假設(shè)這些元素是有序的,從中查找特定元素x.
解題思想:
將有序序列先大致分為數(shù)目相等的兩組,然后去中間的元素與特定的查找元素進(jìn)行比較,如果x等于中間元素,查找成功,如果x小于中間元素,在前半部分繼續(xù)執(zhí)行分解和治理操作,如果x大于中間元素,去后半部分進(jìn)行分解和治理.
算法設(shè)計(jì):
使用一維數(shù)組S[]放置該有序序列,設(shè)置變量low和high表示查找的上下界,middle表示中間的位置,x為特定的查找元素.
1:初始化.令low=0(S[]中的第一位數(shù)),high=n-1(S[]中最后一位數(shù)).
2:middle = (low+high)/2,表示中間的查找范圍.
3:判斷l(xiāng)ow<high是否成立,如果成立,繼續(xù)下一步,否則結(jié)束.
4:判斷x與S[middle]的關(guān)系,如果兩者相同,算法結(jié)束,輸出結(jié)果,否則,如果x>S[middle],low = middle+1,如果x<S[middle],則high = middle-1.
實(shí)戰(zhàn)演練:
實(shí)驗(yàn)結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的算法导论系列:分治算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成本的含义
- 下一篇: 漫画:老板扣了我1000,因为我没记住阿