分治算法

如何理解分治算法?

分治算法(divide and conquer)的核心思想其實(shí)就是四個(gè)字,分而治之瞻凤,也就是將原問題劃分成 n 個(gè)規(guī)模較小撇吞,并且結(jié)構(gòu)與原問題相似的子問題,遞歸地解決這些子問題埂材,然后再合并其結(jié)果,就得到原問題的解。

分治和遞歸的區(qū)別

分治算法是一種處理問題的思想嵌牺,遞歸是一種編程技巧。

實(shí)際上,分治算法一般都比較適合用遞歸來實(shí)現(xiàn)逆粹。分治算法的遞歸實(shí)現(xiàn)中募疮,每一層遞歸都會(huì)涉及這樣三個(gè)操作:

  • 分解:將原問題分解成一系列子問題;
  • 解決:遞歸地求解各個(gè)子問題僻弹,若子問題足夠小阿浓,則直接求解;
  • 合并:將子問題的結(jié)果合并成原問題蹋绽。

分治算法能解決的問題芭毙,一般需要滿足下面這幾個(gè)條件:

  • 原問題與分解成的小問題具有相同的模式;
  • 原問題分解成的子問題可以獨(dú)立求解蟋字,子問題之間沒有相關(guān)性稿蹲,這一點(diǎn)是分治算法跟動(dòng)態(tài)規(guī)劃的明顯區(qū)別,等我們講到動(dòng)態(tài)規(guī)劃的時(shí)候鹊奖,會(huì)詳細(xì)對(duì)比這兩種算法苛聘;
  • 具有分解終止條件,也就是說忠聚,當(dāng)問題足夠小時(shí)设哗,可以直接求解;
  • 可以將子問題合并成原問題两蟀,而這個(gè)合并操作的復(fù)雜度不能太高网梢,否則就起不到減小算法總體復(fù)雜度的效果了。

分治算法應(yīng)用舉例分析

如何編程求出一組數(shù)據(jù)的有序?qū)€(gè)數(shù)或者逆序?qū)€(gè)數(shù)呢赂毯?

最笨的方法是战虏,拿每個(gè)數(shù)字跟它后面的數(shù)字比較,看有幾個(gè)比它小的党涕。我們把比它小的數(shù)字個(gè)數(shù)記作 k烦感,通過這樣的方式,把每個(gè)數(shù)字都考察一遍之后膛堤,然后對(duì)每個(gè)數(shù)字對(duì)應(yīng)的 k 值求和手趣,最后得到的總和就是逆序?qū)€(gè)數(shù)。不過肥荔,這樣操作的時(shí)間復(fù)雜度是 O(n^2)绿渣。那有沒有更加高效的處理方法呢?

我們用分治算法來試試燕耿。我們套用分治的思想來求數(shù)組 A 的逆序?qū)€(gè)數(shù)中符。我們可以將數(shù)組分成前后兩半 A1 和 A2,分別計(jì)算 A1 和 A2 的逆序?qū)€(gè)數(shù) K1 和 K2誉帅,然后再計(jì)算 A1 與 A2 之間的逆序?qū)€(gè)數(shù) K3淀散。那數(shù)組 A 的逆序?qū)€(gè)數(shù)就等于 K1+K2+K3谭期。

private int num = 0; // 全局變量或者成員變量

public int count(int[] a, int n) {
  num = 0;
  mergeSortCounting(a, 0, n-1);
  return num;
}

private void mergeSortCounting(int[] a, int p, int r) {
  if (p >= r) return;
  int q = (p+r)/2;
  mergeSortCounting(a, p, q);
  mergeSortCounting(a, q+1, r);
  merge(a, p, q, r);
}

private void merge(int[] a, int p, int q, int r) {
  int i = p, j = q+1, k = 0;
  int[] tmp = new int[r-p+1];
  while (i<=q && j<=r) {
    if (a[i] <= a[j]) {
      tmp[k++] = a[i++];
    } else {
      num += (q-i+1); // 統(tǒng)計(jì)p-q之間,比a[j]大的元素個(gè)數(shù)
      tmp[k++] = a[j++];
    }
  }
  while (i <= q) { // 處理剩下的
    tmp[k++] = a[i++];
  }
  while (j <= r) { // 處理剩下的
    tmp[k++] = a[j++];
  }
  for (i = 0; i <= r-p; ++i) { // 從tmp拷貝回a
    a[p+i] = tmp[i];
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吧凉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踏志,更是在濱河造成了極大的恐慌阀捅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件针余,死亡現(xiàn)場(chǎng)離奇詭異饲鄙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)圆雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門忍级,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伪朽,你說我怎么就攤上這事轴咱。” “怎么了烈涮?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵朴肺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我坚洽,道長(zhǎng)戈稿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任讶舰,我火速辦了婚禮鞍盗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跳昼。我一直安慰自己般甲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布庐舟。 她就那樣靜靜地躺著欣除,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挪略。 梳的紋絲不亂的頭發(fā)上历帚,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音杠娱,去河邊找鬼挽牢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摊求,可吹牛的內(nèi)容都是我干的禽拔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼睹栖!你這毒婦竟也來了硫惕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤野来,失蹤者是張志新(化名)和其女友劉穎恼除,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曼氛,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豁辉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舀患。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽级。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聊浅,靈堂內(nèi)的尸體忽然破棺而出餐抢,到底是詐尸還是另有隱情,我是刑警寧澤狗超,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布弹澎,位于F島的核電站,受9級(jí)特大地震影響努咐,放射性物質(zhì)發(fā)生泄漏苦蒿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一渗稍、第九天 我趴在偏房一處隱蔽的房頂上張望佩迟。 院中可真熱鬧,春花似錦竿屹、人聲如沸报强。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉溉。三九已至,卻和暖如春碗誉,著一層夾襖步出監(jiān)牢的瞬間召嘶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工哮缺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄跌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓尝苇,卻偏偏與公主長(zhǎng)得像铛只,于是被迫代替她去往敵國(guó)和親埠胖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353