最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)第K順序統(tǒng)計(jì)量的求解方法

 更新時(shí)間:2014年08月14日 11:54:15   投稿:shichen2014  
這篇文章主要介紹了C++實(shí)現(xiàn)第K順序統(tǒng)計(jì)量的求解方法,很有借鑒價(jià)值的算法,需要的朋友可以參考下

一個(gè)n個(gè)元素組成的集合中,第K個(gè)順序統(tǒng)計(jì)量(Order Statistic)指的是該集合中第K小的元素,我們這里要討論的是如何在線性時(shí)間(linear time)里找出一個(gè)數(shù)組的第K個(gè)順序統(tǒng)計(jì)量。該問(wèn)題的算法對(duì)于C++程序員來(lái)說(shuō)有一定的借鑒價(jià)值。具體如下:

一、問(wèn)題描述:

問(wèn)題:給定一個(gè)含有n個(gè)元素的無(wú)序數(shù)組,找出第k小的元素。

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

找最大值或最小值很簡(jiǎn)單,只需要遍歷一次數(shù)組并記錄下最大值或最小值就可以了。我們?cè)谶@里要解決的問(wèn)題是一般性的選擇問(wèn)題。

一種原始的解決方案是,用堆排序或歸并排序?qū)⑤斎霐?shù)據(jù)進(jìn)行排序,然后返回第k個(gè)元素。這樣在Θ(nlgn)時(shí)間內(nèi)一定可以解決。但是我們希望有更好的方案,最好是線性時(shí)間。

二、期望線性時(shí)間的解決方案:

為了在線性時(shí)間內(nèi)解決這個(gè)選擇問(wèn)題,我們使用一個(gè)隨機(jī)的分治算法,即RANDOMIZED-SELECT算法。此算法是使用隨機(jī)化的快速排序中的隨機(jī)劃分子程序,對(duì)輸入數(shù)組進(jìn)行隨機(jī)劃分操作,然后判斷第k小元素在劃分后的哪個(gè)區(qū)域,對(duì)所在區(qū)域進(jìn)行遞歸劃分,最后找到第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()是隨機(jī)版的劃分操作(快速排序的分析與優(yōu)化),可見(jiàn)本算法是一個(gè)隨機(jī)算法,它的期望時(shí)間是Θ(n)(假設(shè)元素的值是不同的)。

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

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

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

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); 
} 
 
/* 測(cè)試 */ 
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; 
} 

三、最壞情況線性時(shí)間的解決方案

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

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

基本步驟:

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

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

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

④.調(diào)用PARTITION過(guò)程,按照中位數(shù)x對(duì)輸入數(shù)組進(jìn)行劃分。確定中位數(shù)x的位置k。

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

如下圖所示:

                            

總結(jié):

RANDOMIZED-SELECT和SELECT算法是基于比較的。我們知道,在比較模型中,排序時(shí)間不會(huì)優(yōu)于Ω(nlgn)。之所以這里的選擇算法達(dá)到了線性時(shí)間,是因?yàn)樗鼈儧](méi)有使用排序就解決了選擇問(wèn)題。另外,我們沒(méi)有使用線性時(shí)間排序算法(計(jì)數(shù)排序/桶排序/基數(shù)排序),是因?yàn)樗鼈円_(dá)到線性時(shí)間對(duì)輸入有很高的要求,而這里不需要關(guān)于輸入的任何假設(shè)。

相關(guān)文章

  • 基于C語(yǔ)言實(shí)現(xiàn)創(chuàng)意多彩貪吃蛇游戲

    基于C語(yǔ)言實(shí)現(xiàn)創(chuàng)意多彩貪吃蛇游戲

    這篇文章主要介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)創(chuàng)意多彩貪吃蛇游戲,這是一個(gè)純C語(yǔ)言外加easyx庫(kù)的繪圖函數(shù)制作而成的有趣小游戲,無(wú)需引入額外資源,感興趣的可以動(dòng)手嘗試一下
    2022-08-08
  • C語(yǔ)言利用面試真題理解指針的使用

    C語(yǔ)言利用面試真題理解指針的使用

    C語(yǔ)言這門(mén)課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹
    2022-08-08
  • 嵌入式項(xiàng)目使用C語(yǔ)言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法

    嵌入式項(xiàng)目使用C語(yǔ)言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法

    今天小編就為大家分享一篇關(guān)于嵌入式項(xiàng)目使用C語(yǔ)言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 詳解c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例

    詳解c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例

    這篇文章主要為大家介紹了c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Qt 儀表盤(pán)的實(shí)現(xiàn)示例

    Qt 儀表盤(pán)的實(shí)現(xiàn)示例

    儀表盤(pán)在很多汽車(chē)和物聯(lián)網(wǎng)相關(guān)的系統(tǒng)中很常用,本文就來(lái)介紹一下Qt 儀表盤(pán)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語(yǔ)言求解定積分的方法

    C語(yǔ)言求解定積分的方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言求解定積分的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 詳解C語(yǔ)言中雙向循環(huán)鏈表的實(shí)現(xiàn)

    詳解C語(yǔ)言中雙向循環(huán)鏈表的實(shí)現(xiàn)

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。本文將用C語(yǔ)言實(shí)現(xiàn)雙向循環(huán)鏈表,需要的可以參考一下
    2022-06-06
  • C++課程設(shè)計(jì)之圖書(shū)館管理系統(tǒng)

    C++課程設(shè)計(jì)之圖書(shū)館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++課程設(shè)計(jì)之圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • QT 中文亂碼解決匯總(QString與string、char*互轉(zhuǎn)亂碼)

    QT 中文亂碼解決匯總(QString與string、char*互轉(zhuǎn)亂碼)

    在QT中使用中文時(shí),經(jīng)常會(huì)碰到論碼問(wèn)題,本文主要介紹了QT 中文亂碼解決匯總(QString與string、char*互轉(zhuǎn)亂碼),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 在Qt中使用OpenGL繪制三角形指南

    在Qt中使用OpenGL繪制三角形指南

    在高性能渲染場(chǎng)景中,CPU資源常被過(guò)度消耗,導(dǎo)致界面卡頓,而OpenGL作為業(yè)界標(biāo)準(zhǔn)的圖形API,能通過(guò)GPU硬件加速顯著降低CPU負(fù)載,本文將以繪制三角形為例,教你如何通過(guò)Qt的QOpenGLWidget和QOpenGLFunctions實(shí)現(xiàn)跨平臺(tái)GPU渲染,感興趣的朋友一起看看吧
    2025-04-04

最新評(píng)論

岑溪市| 湘阴县| 赤水市| 三门峡市| 桓台县| 来凤县| 大方县| 穆棱市| 绥芬河市| 舞阳县| 社旗县| 潜江市| 郴州市| 信阳市| 莱西市| 鄱阳县| 柏乡县| 拉孜县| 河源市| 延津县| 泰宁县| 宜兰县| 甘谷县| 和静县| 信阳市| 共和县| 桃江县| 吴桥县| 汝阳县| 武强县| 加查县| 仪征市| 治县。| 资源县| 新乐市| 东台市| 临颍县| 甘洛县| 怀安县| 城市| 维西|