題目:
考慮這樣一種排序問題,即無法準確的知道等排序的各個數字到底是多大.對於其中的每個數字,我們只知道它落在實軸上的某個區間內.亦即,給定的 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...