常見演算法設計方法 分治法

2022-01-11 06:33:38 字數 1279 閱讀 1580

歸併排序就是常見的一種採用「分治法」進行設計的演算法,以下先給出具體的c#版**示例

/// ///     對列表進行遞迴排序

///

/// 待排序陣列

///

public static listsort(listlist)

/// /// 合併已經排序好的兩個list

///

/// left list

/// right list

///

private static listmerge(listleft, listright)

else

}if (left.count > 0)

}if (right.count > 0)

}return temp;

}

分析這個演算法可以發現,歸併演算法的遞迴部分在於不斷地將待排序陣列分為左右兩個等長的陣列直至左右列表中都只含有乙個元素,再繼續進行merge操作,前者遞迴所花費的時間可以簡單表示成2t(n/2),後者排序可以認為是θ(n),則總時間可以表示成t(n)=2t(n/2)+θ(n)。

平均情況下,定義的t(n)=輸入規模為n之下時所有可能輸入的期望時間,θ是漸進符號一種,大家可以簡單認為對於輸入n,f(n)存在精確上下界

接下來在計算時間複雜度的時候,針對這個優雅的時間函式我們可以有兩種解決辦法,第一種是判斷整個遞迴樹的長度和葉節點的個數,第二種則是直接套用主定理公式進行分析。這裡我們採用第二種主定理進行分析。

這裡是對主定理的相關說明

針對t(n)=at(n/b)+f(n)的函式式子(a≥1,b>1),我們可以知道歸併排序演算法的函式符合主定理的第二種情況,即如果存在常數k ≥ 0,有

f(n)=θ(n(㏒a*((㏒n)k)),則有t(n)=θ(n(㏒a*((㏒n)(k+1)))。這裡的k=0,則歸併演算法最終的時間複雜度t(n)=θ(n㏒n)

額外補充乙個二分法例項

/// ///     二分法查詢

///

/// 傳入的有序列表

/// 起始位置

/// 終止位置

/// 需要查詢的x

/// 返回的列表索引

public static int binarysearch(listlist, int beginindex, int endindex, int x)

演算法設計方法 分治法 分而治之 簡介

1.分而治之 divide and conquer 分治法 可能是最著名的通用演算法設計技術了。雖然它的名氣可能和它那好記的名字有關,但它的確是當之無愧的 很多非常有效的演算法實際上就是這個通用演算法的特殊實現。分治 名字本身就已經給出了一種強有力的演算法設計技術,它可以用來解決各類問題。2.分治法...

演算法 分治法

include function 列印int型陣列 parameter int型陣列,陣列的長度 void displayarray int a,int n printf n function 劃分由下標s開始到t終止的int陣列 parameter int型陣列,陣列的起始座標,陣列的終點座標 r...

演算法設計與分析基礎 分治法

1.將乙個問題劃分為同一型別的若干子問題,子問題最好規模相同 2.對子問題求解 一般使用遞迴方法 3.有必要的話,合併子問題的解,得到原始問題的答案 下圖描述的是將乙個問題劃分為兩個較小子問題的例子,也是最常見的情況 1.主要思想 對於乙個需要排序的陣列a 0 n 1 將其一分為二 a 0 n 2 ...