舍伍德演算法(轉 用來說明演算法導論題目!!!)

2022-02-18 01:07:32 字數 2766 閱讀 1581

已出**:

1.《隨機化演算法(1) — 隨機數》

2.《隨機化演算法(2) — 數值概率演算法》

正文:這一章怎麼說呢,我個人感覺不好理解,在網上查了一些資料,沒發現有具體對舍伍德演算法的介紹。

(有時間我把那本書上講舍伍德的一段給拍下來放到文章裡)

書上對舍伍德講的比較詳細,但是不太好理解,一定要多看幾遍。

我這裡只說下他的基本思想:在一般輸入資料的程式裡,輸入多多少少會影響到演算法的計算複雜度。這時可用舍伍德演算法消除演算法所需計算時間與輸入例項間的這種聯絡。

聯絡例子,在快速排序中,我們是以第乙個元素為基準開始排序時,為了避免這樣的情況,可以用舍伍德演算法解決,也就是使第乙個基準元素是隨機的。

事先說明下:以後章節,若在**中標頭檔案裡包含了randomnumber.h標頭檔案,請檢視前面寫的《概率演算法(1) — 隨機數》裡的偽隨機數類randomnumber.我以後不再提醒。

這是乙個非遞迴版的舍伍德快速排序演算法:

* author: tanky woo

* blog:   www.wutianqi.com

* date:   2010.12.8

* 舍伍德(sherwood)演算法運用(1) -- 線性時間選擇演算法

* **來至王曉東《計算機演算法設計與分析》

*/#include "randomnumber.h"

#include 

#include 

#include 

using namespace std;

const int inf = 9999;

// 交換a, b的值

template 

void swap(type &a, type &b)

template 

type select(type a, int lt, int rt, int k)

if(j - lt + 1 == k)

return pivot;

a[lt] = a[j];

a[j] = pivot;

// 對子陣列重複劃分過程

if(j - lt + 1 

else

rt = j - 1;}}

template 

type select(type a, int n, int k)

int main()

;cout <

}當然,舍伍德演算法也不是萬能的。有時也會遇到這樣的情況,即所給的確定性演算法無法直接改造成舍伍德型演算法。此時可借助於隨機預處理技術,不改變原有的確定性演算法,僅對其輸入進行隨機洗牌,同樣可收到舍伍德演算法的效果。

以下是隨機洗牌演算法:

/** author: tanky woo

* blog:   www.wutianqi.com

* date:   2010.12.8

* 和舍伍德演算法效果類似的乙個程式 -- 隨機洗牌

* **來至王曉東《計算機演算法設計與分析》

*/#include "randomnumber.h"

#include 

#include 

#include 

using namespace std;

// 交換a, b的值

template 

void swap(type &a, type &b)

template 

void shuffle (type a, int len)

}template 

void print (type a, int len)

template 

type select(type a, int lt, int rt, int k)

if(j - lt + 1 == k)

return pivot;

a[lt] = a[j];

a[j] = pivot;

// 對子陣列重複劃分過程

if(j - lt + 1 

else

rt = j - 1;}}

template 

type select(type a, int n, int k)

int main()

;cout <

}當然,舍伍德演算法也不是萬能的。有時也會遇到這樣的情況,即所給的確定性演算法無法直接改造成舍伍德型演算法。此時可借助於隨機預處理技術,不改變原有的確定性演算法,僅對其輸入進行隨機洗牌,同樣可收到舍伍德演算法的效果。

以下是隨機洗牌演算法:

/** author: tanky woo

* blog:   www.wutianqi.com

* date:   2010.12.8

* 和舍伍德演算法效果類似的乙個程式 -- 隨機洗牌

* **來至王曉東《計算機演算法設計與分析》

*/#include "randomnumber.h"

#include 

#include 

#include 

using namespace std;

// 交換a, b的值

template 

void swap(type &a, type &b)

template 

void shuffle (type a, int len)

}template 

void print (type a, int len)

{for(int i=0; i

原次序與第一洗牌和第二次洗牌後都不一樣。

tanky woo 標籤: 舍伍德演算法,隨機演算法

數值概率演算法(轉 用來說明演算法導論題目!!!)

順便再ps一下,小傑也是我論壇的c c 問題求助板塊的版主,c c 小牛 這一章我就把書中的乙個例子舉出來了,感覺雖然很簡單,但是很有意思。用隨機投點法計算pi值 設有一半徑為r的圓及其外切四邊形。向該正方形隨機地投擲n個點。設落入圓內的點數為k。由於所投入的點在正方形上均勻分布,因而所投入的點落入...

蒙特卡洛演算法(轉 用來說明演算法導論題目!!!)

本文通過五個例子,介紹蒙特卡羅方法 monte carlo method 蒙特卡羅方法是一種計算方法。原理是通過大量隨機樣本,去了解乙個系統,進而得到所要計算的值。它非常強大和靈活,又相當簡單易懂,很容易實現。對於許多問題來說,它往往是最簡單的計算方法,有時甚至是唯一可行的方法。它誕生於上個世紀40...

舍伍德型別概率演算法

舍伍德型別概率演算法的特點 總能求得問題的乙個解,且所求得的解總是正確的。問題描述 設計乙個快速排序的舍伍德型別概率演算法。問題解答 快速排序演算法的關鍵在於一次劃分中選擇合適的劃分基準元素,如果基準是序列中最小的 或最大的 元素,則一次劃分後得到的兩個子串行不均衡,使得快速排序的時間效能降低。舍伍...