演算法導論9 3 6

2021-08-27 02:36:07 字數 1078 閱讀 8546

題目:

對乙個含有n個元素的集合來說,所謂k分位數(the kth quantile),就是能把已排序的集合分成k個大小相等的集合的k-1個順序統計量。給出乙個能列出某一集合的k分位數的o(nlgk)時間的演算法

思路:每個子集合的元素個數為t = n / k,a[j]是陣列a中下標為j的元素,a(j)是陣列是第j大的元素

則所求的k分位數是指a(t),a(2t),a(3t),……,a((k-1)t)

常規思路是按照順序求第t小,第2t小。。。。的元素

按順序依次求這k-1個數的執行時(k-1)*n

要使執行時間為o(nlgk),改進方法是不要依次尋找這k-1個數,而是借用二分的方法來找。

先找第k/2個分位數,再以這個分位數為主元把陣列分為兩段,分別對這兩段來找分位數,這個時候找的範圍變小了,效率也就提高了

**如下:

//例題9.2中的演算法的期望時間複雜度為o(n),而在9.3的例題中的最壞執行時間複雜度為o(n)。

//該演算法實現思路是將陣列每五個元素分為一組,最後一組可能不足五個。

//選出每一組中的中位數,然後選出這些中位數的中位數。根據這個中位數對陣列進行劃分為兩組。

//然後再按照9.。2中的方法遞迴呼叫劃分尋找第i小的數。

//該演算法的對比於9.2的改進之處在於對partition方法進行了優化,而不是隨進選擇陣列進行劃分。

#includeusing namespace std;

//插入排序不解釋

void insert_sort(int a,int p,int r)

if((i+4)<=r)

else

i+=5;

} j=j-1;

//對b中的元素進行排序

insert_sort(b,0,j);

//找到b中的中位數

num=b[j/2];

//將a中的num與a[r]替換

for(i=0;i<=r;i++)

temp=a[i];

a[i]=a[r];

a[r]=temp;

//根據找到的num對陣列進行劃分

j=p-1;

for(i=p;i

演算法導論 隨機演算法

一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...

《演算法導論》 演算法導論2 2 1插入排序

2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...

演算法導論目錄

出版者的話 專家指導委員會 譯者序前言 第一部分 基礎知識 引言 第1章 演算法在計算中的作用 1.1 演算法 1.2 作為一種技術的演算法 第2章 演算法入門 2.1 插入排序 2.2 演算法分析 2.3 演算法設計 2.3.1 分治法 2.3.2 分治法分析 第3章 函式的增長 3.1 漸近記號...