• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70  文章 - 160  trackbacks - 0

            公告:
            知識(shí)共享許可協(xié)議
            本博客采用知識(shí)共享署名 2.5 中國(guó)大陸許可協(xié)議進(jìn)行許可。本博客版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不得隨機(jī)刪除文章任何內(nèi)容,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。 具體操作方式可參考此處。如您有任何疑問(wèn)或者授權(quán)方面的協(xié)商,請(qǐng)給我留言。

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179342
            • 排名 - 147

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            建議先看看前言:http://www.shnenglu.com/tanky-woo/archive/2011/04/09/143794.html

            這一章的內(nèi)容很簡(jiǎn)單,基本都是一些概念。

            第i個(gè)順序統(tǒng)計(jì)量:在一個(gè)由n個(gè)元素組成的集合中,第i個(gè)順序統(tǒng)計(jì)量(order statistic)是該集合中第i小的元素。

            最小值是第1個(gè)順序統(tǒng)計(jì)量(i=1)

            最大值是第n個(gè)順序統(tǒng)計(jì)量(i=n)

            中位數(shù):一個(gè)中位數(shù)(median)是它所在集合的“中點(diǎn)元素”,當(dāng)n為奇數(shù)時(shí),i=(n+1)/2,當(dāng)n為偶數(shù)是,中位數(shù)總是出現(xiàn)在1 (下中位數(shù))和2 (上中位數(shù))。

            找最大值/最小值問(wèn)題,通過(guò)比較n-1次可以得出結(jié)果。

            MINIMUM(A)
            1  minA[1]
            2  for i ← 2 to length[A]
            3         do if min > A[i]
            4                then minA[i]
            5  return min

            如果要同時(shí)找出最大值和最小值,則比較次數(shù)最少并不是2*n-2,而是3 ,我們可以將一對(duì)元素比較,然后把較大者于max比較,較小者與min比較,這樣就只需要3 。

            如果是一般的選擇問(wèn)題,即找出一段序列第i小的數(shù),看起來(lái)要比找最大值或最小值要麻煩,其實(shí)兩種問(wèn)題的漸進(jìn)時(shí)間都是4 。

            首先看看這個(gè)強(qiáng)悍的偽代碼:

            RANDOMIZED-SELECT(A, p, r, i)
            1  if p = r
            2      then return A[p]
            3  q ← RANDOMIZED-PARTITION(A, p, r)
            4  kq - p + 1
            5  if i = k          ? the pivot value is the answer
            6      then return A[q]
            7  elseif i < k
            8      then return RANDOMIZED-SELECT(A, p, q - 1, i)
            9  else return RANDOMIZED-SELECT(A, q + 1, r, i - k)

            這個(gè)算法利用了隨機(jī)化的Partition算法,這個(gè)實(shí)在第七章的隨機(jī)化快排中講到:http://www.wutianqi.com/?p=2368,不記得的可以先復(fù)習(xí)下前面的快排。

            這個(gè)隨機(jī)化的選擇算法返回?cái)?shù)組A[p..r]中第i小的元素。

            具體實(shí)現(xiàn)如下:

             1 /*
             2 Author: Tanky Woo
             3 Blog:   www.WuTianQi.com
             4 About:  《算法導(dǎo)論》第9章 查找序列第i小的數(shù)字
             5 */
             6  
             7 #include <iostream>
             8 #include <cstdlib>
             9 using namespace std;
            10  
            11 int Partition(int *arr, int beg, int end)
            12 {
            13     int sentinel = arr[end];
            14     int i = beg-1;
            15     for(int j=beg; j<=end-1++j)
            16     {
            17         if(arr[j] <= sentinel)
            18         {
            19             i++;
            20             swap(arr[i], arr[j]);
            21         }
            22     }
            23     swap(arr[i+1], arr[end]);
            24  
            25     return i+1;
            26 }
            27  
            28 int RandomPartition(int *arr, int beg, int end)
            29 {
            30     int i = beg + rand() % (end-beg+1);
            31     swap(arr[i], arr[end]);
            32     return Partition(arr, beg, end);
            33 }
            34  
            35  
            36 int RandomSelect(int *a, int p, int r, int i)
            37 {
            38     if(p == r)
            39         return a[p];
            40     int q = Partition(a, p, r);
            41     int k = q-p+1;
            42     if(i == k)
            43         return a[q];
            44     else if(i < k)
            45         return RandomSelect(a, p, q-1, i);
            46     else
            47         return RandomSelect(a, q+1, r, i-k);
            48 }
            49  
            50 int main()  
            51 {  
            52     int a[] = {08910021528332763};  
            53     int num = 9;   
            54     int ith;
            55     cout << "序列為: ";
            56     for(int i=1; i<=num; ++i)  
            57         cout << a[i] << " ";
            58     cout << endl;
            59     ith = RandomSelect(a, 1, num, 2);
            60     cout << "序列中第2小的數(shù)字是: " << ith << endl;
            61     getchar();
            62  
            63     return 0;  
            64 }

            結(jié)果如圖:
            5

            在(89, 100, 21, 5, 2, 8, 33, 27, 63)中查找第二小的數(shù)字是5. 

            該算法的平均情況性能較好,并且又是隨機(jī)化的,所有沒(méi)有哪一種特別的輸入會(huì)導(dǎo)致最壞情況發(fā)生。



            在我獨(dú)立博客上的原文:http://www.wutianqi.com/?p=2395
            歡迎大家互相學(xué)習(xí),互相探討。
            posted on 2011-04-26 13:00 Tanky Woo 閱讀(1575) 評(píng)論(1)  編輯 收藏 引用

            FeedBack:
            # re: 《算法導(dǎo)論》學(xué)習(xí)總結(jié) — 9.第九章 中位數(shù)和順序統(tǒng)計(jì)學(xué) 2012-11-24 17:20 
            對(duì)于效果來(lái)說(shuō)則是業(yè)績(jī)效果論述目前的沒(méi)有信息分析的依據(jù)在目前來(lái)說(shuō)其實(shí)是對(duì)于電腦上面的文字不愿意去看,內(nèi)心總是嘆氣的一種心理表現(xiàn),  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            免费一级欧美大片久久网| 久久精品夜色噜噜亚洲A∨| 久久亚洲日韩看片无码| 久久精品国产男包| 国产精品美女久久久久网| 久久99精品久久久久久齐齐| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 女人香蕉久久**毛片精品| 久久本道久久综合伊人| 狠狠色婷婷久久综合频道日韩| 69国产成人综合久久精品| 精品国产一区二区三区久久蜜臀| 亚洲国产香蕉人人爽成AV片久久| 精品国产青草久久久久福利| 国产精品久久波多野结衣| 色综合久久中文字幕综合网| 97精品国产91久久久久久| 久久这里有精品| 国内精品久久久久久久亚洲| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久性生大片免费观看性| 久久人爽人人爽人人片AV| 亚洲一区精品伊人久久伊人| 精品久久久久久无码人妻热| 国产美女久久久| 国产亚洲精久久久久久无码| 亚洲精品无码久久一线| 亚洲国产日韩综合久久精品| 久久影视综合亚洲| 久久精品18| 精品久久久久久无码中文野结衣| 久久ZYZ资源站无码中文动漫| 亚洲综合精品香蕉久久网| 国产欧美久久久精品影院| 亚洲国产成人乱码精品女人久久久不卡| 久久精品国产一区二区三区日韩| 色综合久久久久无码专区| 看久久久久久a级毛片| 亚洲精品国产美女久久久| 亚洲人成网亚洲欧洲无码久久| 久久人人爽人人爽人人爽|