亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現第K順序統計量的求解方法

2020-01-26 15:24:28
字體:
來源:轉載
供稿:網友

一個n個元素組成的集合中,第K個順序統計量(Order Statistic)指的是該集合中第K小的元素,我們這里要討論的是如何在線性時間(linear time)里找出一個數組的第K個順序統計量。該問題的算法對于C++程序員來說有一定的借鑒價值。具體如下:

一、問題描述:

問題:給定一個含有n個元素的無序數組,找出第k小的元素。

k = 1 :最小值
k = n :最大值
k = ⌊(n+1)/2⌋ or ⌈(n+1)/2⌉ :中位數

找最大值或最小值很簡單,只需要遍歷一次數組并記錄下最大值或最小值就可以了。我們在這里要解決的問題是一般性的選擇問題。

一種原始的解決方案是,用堆排序或歸并排序將輸入數據進行排序,然后返回第k個元素。這樣在Θ(nlgn)時間內一定可以解決。但是我們希望有更好的方案,最好是線性時間。

二、期望線性時間的解決方案:

為了在線性時間內解決這個選擇問題,我們使用一個隨機的分治算法,即RANDOMIZED-SELECT算法。此算法是使用隨機化的快速排序中的隨機劃分子程序,對輸入數組進行隨機劃分操作,然后判斷第k小元素在劃分后的哪個區域,對所在區域進行遞歸劃分,最后找到第k小元素。

偽代碼如下:

RANDOMIZED-SELECT(A,p,q,i) // i-th smallest in A[p..q]   if p = q     then return A[p]   r = RANDOMIZED-PARTITION(A, p, q)   k = r-p+1  // A[r] is k-th smallest   if i=k     then return A[r]   if i<k     then return RANDOMIZED-SELECT(A, p, r-1, i)   else     then return RANDOMIZED-SELECT(A, r+1, q, i-k) 

這里的RANDOMIZED-PARTITION()是隨機版的劃分操作(快速排序的分析與優化),可見本算法是一個隨機算法,它的期望時間是Θ(n)(假設元素的值是不同的)。

1、Lucky-Case:最好的情況是在正中劃分,劃分的右邊和右邊的元素數量相等,但是1/10和9/10的劃分也幾乎一樣好??梢赃@么說,任何常數比例的劃分都和1/2:1/2的劃分一樣好。這里以1/10和9/10的劃分為例,算法運行時間遞歸式為T(n) <= T(9n/10) + Θ(n),根據主定理得到T(n) <= Θ(n)。

2、Unlucky-Case:雖然主元的選取是隨機的,但是如果你運氣足夠差,每次都得到0:n-1的劃分,這就是最壞的情況。此時遞歸式為T(n) = T(n-1) + Θ(n),則時間復雜度為T(n) = Θ(n^2)。

3、Expected-Time:期望運行時間為Θ(n),即線性時間。這里就不證明了,證明需要用到指示器隨機變量。

C++代碼如下:

/*************************************************************************   > File Name: RandomizedSelect.cpp   > Author: SongLee  ************************************************************************/ #include<iostream> #include<cstdlib> // srand rand using namespace std;  void swap(int &a, int &b) {   int tmp = a;   a = b;   b = tmp; }  int Partition(int A[], int low, int high) {   int pivot = A[low];   int i = low;   for(int j=low+1; j<=high; ++j)   {     if(A[j] <= pivot)     {       ++i;       swap(A[i], A[j]);     }   }   swap(A[i], A[low]);   return i; }  int Randomized_Partition(int A[], int low, int high) {   srand(time(NULL));   int i = rand() % (high+1);   swap(A[low], A[i]);   return Partition(A, low, high); }  int Randomized_Select(int A[], int p, int q, int i) {   if(p == q)     return A[p];   int r = Randomized_Partition(A, p, q);   int k = r-p+1;   if(i == k)     return A[r];   if(i < k)     return Randomized_Select(A, p, r-1, i);   else     return Randomized_Select(A, r+1, q, i-k); }  /* 測試 */ int main() {   int A[] = {6,10,13,5,8,3,2,11};   int i = 7;   int result = Randomized_Select(A, 0, 7, i);   cout << "The " << i << "th smallest element is " << result << endl;   return 0; } 

三、最壞情況線性時間的解決方案

雖然最壞情況Θ(n2)出現的概率非常非常小,但是不代表它不會出現。這里就介紹一個非同一般的算法,以保證在最壞情況下也能達到線性時間。

這個SELECT算法的基本思想就是要保證對數組的劃分是一個好的劃分,它通過自己的方法選取主元(pivot),然后將pivot作為參數傳遞給快速排序的確定性劃分操作PARTITION。

基本步驟:

①.將輸入數組的n個元素劃分為n/5(上取整)組,每組5個元素,且至多只有一個組有剩下的n%5個元素組成。

②.尋找每個組織中中位數。首先對每組中的元素(至多為5個)進行插入排序,然后從排序后的序列中選擇出中位數。

③.對第2步中找出的n/5(上取整)個中位數,遞歸調用SELECT以找出其中位數x。(如果是偶數取下中位數)

④.調用PARTITION過程,按照中位數x對輸入數組進行劃分。確定中位數x的位置k。

⑤.如果i=k,則返回x。否則,如果i < k,則在地區間遞歸調用SELECT以找出第i小的元素,若干i > k,則在高區找第(i-k)個最小元素。

如下圖所示:

                            

總結:

RANDOMIZED-SELECT和SELECT算法是基于比較的。我們知道,在比較模型中,排序時間不會優于Ω(nlgn)。之所以這里的選擇算法達到了線性時間,是因為它們沒有使用排序就解決了選擇問題。另外,我們沒有使用線性時間排序算法(計數排序/桶排序/基數排序),是因為它們要達到線性時間對輸入有很高的要求,而這里不需要關于輸入的任何假設。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一精品夜夜躁人人爽| 久久999免费视频| 最近中文字幕2019免费| 日韩电影免费观看在线观看| 欧美日韩另类视频| 亚洲人成电影网站色| 日韩成人久久久| 一本久久综合亚洲鲁鲁| 日韩**中文字幕毛片| 69久久夜色精品国产69乱青草| 国外日韩电影在线观看| 久久国产精品久久久久| 亚洲一区999| 日韩不卡中文字幕| 欧美高清在线视频观看不卡| 人人澡人人澡人人看欧美| 亚洲精品自拍第一页| 久久久久久久97| 成人久久一区二区三区| 一区二区三区精品99久久| 91精品国产91久久久久久吃药| 日韩福利伦理影院免费| 国产精品国内视频| 永久免费看mv网站入口亚洲| 日韩精品免费在线| 欧美大片免费观看| 日韩精品在线电影| 久久夜精品va视频免费观看| 亚洲精品456在线播放狼人| 国产精品久久久久久亚洲影视| 午夜精品一区二区三区视频免费看| 国产精品色婷婷视频| 一本色道久久88综合亚洲精品ⅰ| 亚洲性夜色噜噜噜7777| 色噜噜狠狠狠综合曰曰曰| 欧美专区在线播放| 久久精品电影网| 久久中文字幕国产| 日韩高清人体午夜| 欧洲永久精品大片ww免费漫画| 日韩电影免费在线观看中文字幕| 欧美韩日一区二区| 欧美国产日韩视频| 美女啪啪无遮挡免费久久网站| 国产欧美日韩免费看aⅴ视频| 欧美电影免费观看电视剧大全| 成人激情视频免费在线| 国产91对白在线播放| 久久影视三级福利片| 亚洲石原莉奈一区二区在线观看| 日韩免费观看在线观看| 在线观看国产精品91| 亚洲男人的天堂在线| 伊人男人综合视频网| 国产精品mp4| 亚洲图片在区色| 日本欧美黄网站| 欧美一级黄色网| 欧美猛男性生活免费| 精品视频中文字幕| 亚洲女人被黑人巨大进入al| 欧美激情小视频| 91最新在线免费观看| 性色av一区二区三区免费| 亚洲欧美日本精品| 欧美重口另类videos人妖| 国产91网红主播在线观看| 国产在线拍揄自揄视频不卡99| 久久伊人色综合| 91精品国产高清自在线| 亚洲色图欧美制服丝袜另类第一页| 日本久久91av| 国产成人免费91av在线| 激情成人中文字幕| 中文字幕日韩av电影| 亚洲国产另类 国产精品国产免费| 亚洲男人天堂手机在线| 亚洲黄色片网站| 欧洲中文字幕国产精品| 国产精品第2页| 久久全国免费视频| 精品久久久久国产| 欧美精品在线观看| 少妇av一区二区三区| 亚洲综合在线做性| 久久精品视频导航| 欧美成人第一页| 97国产精品人人爽人人做| 国产精品久久久久久久久久新婚| 亚洲嫩模很污视频| 激情成人中文字幕| 国产精品精品久久久久久| 亚洲精品电影网站| 久久久久久久久久亚洲| 国产精品视频白浆免费视频| 欧洲亚洲妇女av| 日韩成人在线视频观看| 欧美激情xxxx性bbbb| 一本大道亚洲视频| 97av视频在线| 国产免费观看久久黄| 日韩电视剧在线观看免费网站| 精品福利视频导航| 欧美高跟鞋交xxxxhd| 日韩精品免费在线观看| 亚洲性夜色噜噜噜7777| 久久精品国产清自在天天线| 欧美电影在线观看高清| 亚洲福利视频网| 欧美精品生活片| 欧美黑人又粗大| 美乳少妇欧美精品| 欧美精品一区二区三区国产精品| 久久精品一区中文字幕| 日韩av网址在线观看| 神马国产精品影院av| 欧美性猛交99久久久久99按摩| 国产视频久久久久久久| 色噜噜亚洲精品中文字幕| 亚洲美女激情视频| 欧美在线视频免费播放| 一区二区三区视频免费在线观看| 亚洲午夜精品久久久久久性色| 国产噜噜噜噜噜久久久久久久久| 国模gogo一区二区大胆私拍| 成人网在线免费看| 国产欧美精品日韩精品| 隔壁老王国产在线精品| 亚洲毛片在线看| 亚洲一二三在线| 亚洲少妇激情视频| 欧美成人剧情片在线观看| 成人女保姆的销魂服务| 中文字幕av一区二区三区谷原希美| 亚洲精品色婷婷福利天堂| 精品视频—区二区三区免费| 国产成人精品久久亚洲高清不卡| 91av视频在线免费观看| 中文字幕亚洲在线| 精品久久久久久国产91| 欧美成人免费小视频| 中文字幕视频一区二区在线有码| 成人黄色大片在线免费观看| 欧美国产视频一区二区| 欧美激情啊啊啊| 精品视频偷偷看在线观看| 亚洲欧美日韩高清| 亚洲欧洲黄色网| 丝袜亚洲另类欧美重口| 69视频在线免费观看| 亚洲国产天堂网精品网站| 亚洲欧美制服综合另类| 色系列之999| 免费91麻豆精品国产自产在线观看| 亚洲福利视频二区| 亚洲最大成人免费视频| 亚洲片在线资源| 成人激情电影一区二区| 91中文字幕一区| 中文字幕日韩专区| 2020欧美日韩在线视频| 午夜免费日韩视频| 久久久久久国产精品美女| 国产精品99久久久久久人|