第十三天 初識分治

2021-10-05 05:00:40 字數 1560 閱讀 1654

今天是釋然發題解的第十三天,以後每一天都會和大家分享學習路上的心得,希望和大家一起進步,一起享受coding的樂趣。

本文約1200字,預計閱讀4分鐘

昨天我們學習了深度優先搜尋和廣度優先搜尋,忘記的小夥伴們可以看一下哦:

**bfs與dfs區別+模板

舉乙個例子

歸併排序

快速排序

分治,字面上的解釋是「分而治之」,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。在電腦科學中,分治法就是運用分治思想的一種很重要的演算法。分治法是很多高效演算法的基礎,如排序演算法(快速排序,歸併排序),傅利葉變換(快速傅利葉變換)等等。

我們再來舉乙個例子,比如說有一堆硬幣,但是當中呢有一枚假幣(假設假幣比真幣要輕,且重量相差不大),我們有乙個天平,我們可以每次二分稱量硬幣的重量,每次稱量時有假幣的那一堆要輕一些,最後那枚假幣就水落石出了,這是理想化最快的解決問題的方法

上面的這個思想利用的就是分治演算法

分治演算法裡面重要的乙個應用就是歸併排序:

又分為:歸併和排序(遞迴的思想)

歸併就是把有序的兩個陣列合併到乙個有序的陣列裡面,比如說兩個班的同學的成績是有序的,但是現在我們要看整體的排名情況,就需要對兩個班同學的成績進行合併,這就是歸併

歸併排序其實是一種遞迴式的呼叫歸併排序函式並且合併的過程,因此**如下

//此時a陣列從i到j是有序的,j到k這一段也是有序的

void

merge

(int a,

int i,

int j,

int k,

int tem)

else tem[pos++

]=a[right++]}

while

(left<=j)

tem[pos++

]=a[left++];

while

(right<=k)

tem[pos++

]=a[right++];

for(

int t=

0;t1;t++

)}

接下來是遞迴分治排序的方法:

void

mergesort

(int a,

int l,

int r,

int tem)

}

對於這個方法,時間複雜度為:o(nlogn),害我也不太會證明,但是我是這樣想的:每次都需要對半進行歸排,因此應該是指數級別的降低,所以應該是nlogn的這種形式

空間複雜度為o(n),非原地排序(因為需要用臨時陣列來儲存,所以空間複雜度為n),穩定排序(如果a=b,在排序之後a依然在b的前面)

好了,今天的有關歸併排序的題目就到這裡

釋然每天發布一點自己學習的知識,希望2年後我們也能在acm的賽場上見面,一起去追尋自己的程式猿之路吧!

後期也會和大家一起分享學習心得和學習經驗呢,明天我們不見不散哦!

下期預告:

第十三天 練兵

問 昨天您講的很驚心動魄。這樣快節奏的配合確實非常完美,很羨慕。但要形成這樣的結果必須我們之間配合需要非常流暢,我們有什麼方法可以促成這樣的氛圍?答 練兵。如果一開始就進入業務系統功能的設計開發,業務組長對業務還沒有很深的吃透,這樣倉促上陣功能不但連上一版不如,而且為了補課,軟體不斷修改,什麼都亂了...

2020 7 18第十三天

1.學習了static關鍵字 靜態變數,靜態方法以及靜態模組 1 public class vardemo 9 1 public class staticblockdemo 5public staticblockdemo 8public static void main string args 12...

android基礎 第十三天

可航訓練營 為幫助大家更好的 系統性的學習 android 一 progressbar頁面進度提示 密碼 9ewc 二 fragment優化選項卡切換 密碼 gvsb 三 fragment和activity進行通訊 密碼 45u2 四 xlistview上拉重新整理 密碼 na6r 五 提示對話方塊...