演算法導論習題7 6

2021-08-27 01:32:52 字數 1953 閱讀 4465

題目:

考慮這樣一種排序問題,即無法準確的知道等排序的各個數字到底是多大.對於其中的每個數字,我們只知道它落在實軸上的某個區間內.亦即,給定的 n 個形如[ai, bi ]的閉區間,其中ai,≤bi .演算法的目標是對這些區間進行模糊排序(fuzzy-sort),亦即,產生各區間的乙個排序1, i2, i3, i4,…in >,使得存在乙個 cj ∈[ai, bi ],滿足c1≤c2≤…≤cn .

a)為n個區間的模糊排序設計乙個演算法,你的演算法應該具有演算法的一般結構,它可以快速排序左部端點(即各ai

),也要能充分利用重疊區間來改善執行時間.(隨著各區間重疊得越來越多,對各區間的排序的問題會變得越來越容易,你的演算法應該能充分利用這種重疊.)

b)證明: 在一般情況下,你的演算法的區望執行時間為 o(n*lgn),但當所有的區間都重疊時,期望的執行時間為o(n) (亦即,當存在乙個值 x, 使得對所有的 i, 都有x∈[ai, bi ] ).你的演算法不應顯式的檢查這種情況,而是應當隨著重疊量的增加,效能自然地有所改善.

思考:

借用快排的劃分思路,以某個元素為主元,把區域劃分成三段,第一段都小於主元,第二段都等於主元

重點是劃分,區間如果重疊的部分,就把它們看做是相等的,並提取公共部分繼續劃分

a.nodeb < b.nodea ==> a < b

a.nodea > b.nodeb ==> a > b

其它情況 ==> a = b

為了避免類似於(2,2) (7,7) (1,8)這樣的情況,相等時要提取公因子,並更新主元(主元不一等是某個元素)

本**採用物件導向思路對node的操作進行了封裝,node.h對node的操作進行了封裝:

#includeusing namespace std;

#define max 100

class node

//帶參建構函式

node(int a,int b):nodea(a),nodeb(b)

{} //判斷區間根主元區間的大小

bool operator <(const node na)const

bool operator ==(const node na)const

return 0;

} void init(node na)

void setnodea(int a)

void setnodeb(int b)

void swapnode()

};

reginsort.h實現了對陣列區間進行模糊排序的功能,排序的依據是在排好序的陣列的每乙個區間中可以找到乙個數字,這些數字為有序排列:

#include"node.h"

#includeusing namespace std;

//將區間分三段列印

//列印分段為[0,na],[na+1,nb-1],[nb,lengtha-1]

void print(node*a,node b,int lengtha)

//如果相等,則不交換,但可縮小主元區間,這樣縮小的主元可以更加準確的劃分陣列

else

}//將劃分後的區域界線賦給devide

if(i>=0)

if(j<=r)

print(a,devide,r-p+1);

return devide;

}void regionsort(node* a,int p,int r)

//如果存在大於主元的區間則對該區間繼續呼叫regionsort

if(nb>=0)

}}

test.cpp對該演算法進行了測試,所用的陣列區間為隨機產生,具有代表性

#include"regionsrt.h"

#includeusing namespace std;

int main()

} cout<<"the original region is :"<

演算法導論 習題 5 4 1

題 乙個房間裡必須要有多少人,才能讓某人和你生日相同的概率至少為1 2?必須要有多少人,才能讓至少兩個人生日為7月4日的概率大於1 2?解 1.假設一年有n 365 天,房間裡面有x人 不算自己 為求某人與自己生日相同,可求其反面,即房間裡面沒人跟自己生日相同,他們每個人生日可以在n天中選擇除去我生...

演算法導論 習題 6 5 8

題 請給出乙個時間為o nlgk 用來將k個已排序鍊錶合併為乙個排序鍊錶的演算法。此處n為所有輸入鍊錶中元素的總數。k個已排序鍊錶,假設每乙個鍊錶的第乙個元素為root i i 1,2,3.k 那麼可以為這k個元素root i 構造乙個最小堆heap min,其時間複雜度為o lgk 此時堆頂元素假...

演算法導論 習題5 2 2

首先我們有三個觀察結論 1 1號助理總是會被雇用 2 最佳助理 即rank為n的助理 總是會被雇用 3 最佳助理不可能是1號助理,因為那樣將只能剛好雇用一次。在使hire assistant剛好雇用兩次的序列中,一號助理必然有rank i n 1,所有rank在 i 1.n 1 區間內的助理必然在r...