分治思想 看這篇就好了

2021-10-05 08:15:39 字數 1926 閱讀 1531

當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。

某一次技術分享交流上,我們的專題就是歸併排序,首先使用**展示排序過程:

針對拆分的思路分為遞迴或者迴圈,至於合併邏輯一致,具體**如下:

/**

* 合併

** @param left

* @param right

* @return

*/private

static

int[

]merge

(int

left,

int[

] right)

else

}// 返回結果

return tmp;

}

首先我們討論的是如何通過遞迴實現,實現方式有很多種,首先阿導給出的拆分思路是沒有考慮到空間資源的浪費(有興趣的同學可以通過下標去處理,這樣一定程度上節約了空間資源,阿導這邊主要展示思路),具體**如下:

/**

* 拆分

** @param array

* @return int

* @author

* @time 2020/4/14 :00

*/private

static

int[

]recursivemethodmergesort

(int

array)

// 對左右遞迴拆分最小粒度,然後合併

return

merge

(mergesort

(arrays.

copyofrange

(array,

0, mid)),

mergesort

(arrays.

copyofrange

(array, mid, array.length)))

;}

遞迴思想很好理解,合併之前先拆分,直到最小粒度,然後進行合併,相比較而言,迴圈寫法更難理解。阿導先貼出**,再進行講解

private

static

int[

]circulatemethodmergesort

(int

array)}}

// 返回結果

return array;

}

迴圈的思路和遞迴思路相反,遞迴思路是不關心具體拆分多少,反正遞迴到一定粒度自然會終止,迴圈思路的拆分其實是根據歸併思想,尋找拆分的規律(以最小粒度開始合併),即每次比較的數目都是 2n ,也就是上述的步長為什麼是每次都是2倍遞增,內迴圈每次比較的是兩個 step 長度, 這裡只需要注意的是內迴圈最後一次歸併,長度可能不是 2倍 step 的情況。

分治思想很簡單,**實現起來確實有點繞腦子,只要理解了核心思想,寫起來也不是那麼困難。

其實分治思想的應用相當廣泛,小到歸併排序,大到國家治理,縱觀中國歷史,中國一直都是**集權制國家,這樣才能保證國家的長治久安,就拿這次疫情打比方(敬那些在抗疫一線的英雄和烈士),通過全國人民的萬眾一心,我們這次抗疫戰爭相比西方國家要順利得多(希望全球同一條心,共同戰勝這次災難),下面描述一下這裡面的分治思想。

回到咱們這個程式設計師這個行業,分治思想能解決什麼問題呢?

只言片語,看起來很簡單,實現起來卻很複雜,裡面的細節之處數不勝數,阿導在此不做贅述,在文章結尾處,留一道思考題給有興趣的同學。

Dockerfile看這篇就夠了

dockerfile是用來構建docker映象的構建檔案,是由一系列命令和引數構成的指令碼。構建三步驟 1.編寫dockerfile檔案 2.docker build 3.docker run 1 每條保留字指令都必須為大寫字母且後面要跟隨至少乙個引數 2 指令按照從上到下,順序執行 3 表示注釋 ...

Git 學習看這篇就夠了!

git是乙個開源的分布式版本控制系統,可以有效 高速的處理從很小到非常大的專案版本管理。可能新手會問 git和github有什麼關係啊?git是乙個版本控制工具 github是乙個用git做版本控制的專案託管平台 git 和github的關係 git的使用也是實際開發工作中不必可少的 必須熟練掌握的...

入門Webpack,看這篇就夠了

參見 需要注意的是 1.npm install g webpack 全域性安裝 2.npm init 建立package.json 3.建立webpack.config.js 4.因為是全域性安裝,所以打包檔案只需在終端執行 webpack 命令 我之前的錯誤之處在於我是先全域性安裝的,然後又按照文...