青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

O(1) 的小樂

Job Hunting

公告

記錄我的生活和工作。。。
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

統計

  • 隨筆 - 182
  • 文章 - 1
  • 評論 - 41
  • 引用 - 0

留言簿(10)

隨筆分類(70)

隨筆檔案(182)

文章檔案(1)

如影隨形

搜索

  •  

最新隨筆

最新評論

閱讀排行榜

評論排行榜

第K小的數 K-th Smallest Element

   這個問題的解決方法很多啊,一下列舉一下

 

1 基于排序的傳統方法 O(nlogn) 

  如果你只需要找一次第k小的數,這不是一個好方法。。。如果你要找n次,還是用排序吧

 

2 Las Vegas概率算法

  也可以稱之為隨機化算法,其算法的特點優點類似于快速排序,都是需要選擇pivot,然后進行劃分。把一個序列劃分為3部分,x 小于x 和大于x的。。然后根據k的取值,進行遞歸計算。

  畢竟是LasVegas算法,其最壞時間復雜度很差,是O(n^2)。。當然,平均復雜度非常好 O(n) 如果學過隨機化算法,證明不難!

3 基于r劃分的O(n)算法

   這個算法可以說是一個trick,他的思想就是想優化LasVegas算法中的pivot選擇。。所以才會有這個算法。假設我們把r取成5的話,以每5個元素為子集劃分源數組,然后對每個子集排序求出中位數,這樣的中位數集合組成一個新的序列M,對M遞歸的求解其中位數p,得到的p即為劃分點。p將源數組劃分為3部分:
  * s1:所有小于p的元素
  * s2: 所有等于p的元素
  * s3: 所有大于p的元素
下一輪迭代的時候根據輸入的level參數判斷該剪去哪部分元素。

這樣,每一輪迭代至少剪去n/4的元素(畫個中位數排列的圖出來就容易看出),則最壞情況下的時間復雜度表示為:

T(n)<=T(3n/4)+T(n/5)+O(n)

其中

  * T(3n/4)是下一輪迭代的最大數據量情況下的時間復雜度
  * T(n/5)是求尋找中位數組成集合的中位數的時間復雜度

 

利用歸納法,可以很清楚的證明出來T(n) <=20cn  (c為常數)

  基于r劃分的算法,其最壞時間復雜度是O(n)。。感覺是不是很優秀!但是,優秀的代價是你的常數因子太大了!!! 

  平時在選擇算法的時候,基本上可以說是一邊倒的選擇Las Vegas算法!

此外,在解決問題的時候,最好看清楚題目的情景,如果題目要求n個數中的第k個數,但是k取從1-n。。。那么還是用基于排序的吧。。。畢竟做了O(nlogn)的工作之后,每次都是O(1)搞定。。而LasVegas算法和基于r劃分的方法都要O(n^2)

基于LasVegas算法的代碼:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define Max 10000
int cnt=0;
int select( int *a, int b, int e, int k)          //從b到e
{
    cnt++;
    if (b==e) return a[b];
    int x=a[b+rand()%(e-b+1)],i=b,j=e;
    i--;j++;
    while (i<j)
    {
        while (a[++i] < x); while (a[--j] > x);
        if (i<j)std::swap(a[i],a[j]);
    }
    if (j==e)j--;i=j-b+1;
    if (k <=i) return select(a,b,j,k);
    else return select(a,j+1,e,k-i);
}

int main()
{
    int a[Max];
    for(int i=0;i<Max;i++)
        a[i]=i;
    random_shuffle(a,a+Max);
    int b[Max];
    for(int i=0;i<Max;i++)
        b[i]=a[i];
    cout<<endl;
    vector<int> C;
    for(int i=0;i<Max;i++)
    {
        cnt=0;
        select(a,0,Max-1,i);
        for(int i=0;i<Max;i++)
            a[i]=b[i];
        C.push_back(cnt);
    }
    sort(C.begin(),C.end());
    cout<<C[0]<<endl;
    cout<<C[C.size()-1]<<endl;

    return 0;

}

從代碼結果可以看出LasVegas算法表現還是很優秀的,畢竟10000個數,最深遞歸層次是35層!

 

此外,當然求第k小元素的各種復雜數據結構也可以做,而且效率也可以,看第四種方法:  (這種方法等以后再總結吧。。)

4 樹狀數組實現查找K小的元素

回顧樹狀數組的定義,注意到有如下兩條性質:
一,c[ans]=sum of A[ans-lowbit(ans)+1 ... ans];
二,當ans=2^k時,
c[ans]=sum of A[1 ... ans];

下面說明findK(k)如何運作:
1,設置邊界條件ans,ans'<maxn且cnt<=k;
2,初始化cnt=c[ans],其中ans=2^k且k為滿足邊界條件的最大整數;
3,找到滿足邊界條件的最大的ans'使得ans'-lowbit(ans')=ans,即ans'滿足c[ans']=A[ans+1 .. ans'](根據性質一),只要將c[ans']累加到cnt中(此時cnt=sum of A[1 ... ans'],根據性質二),cnt便可以作為k的逼近值;
4,重復第3步直到cnt已無法再逼近k,此時ans剛好比解小1,返回ans+1。

因此findk(k)的實質就是二分逼近

/**********************************
樹狀數組實現查找K小的元素
                  經典。
限制:數據范圍在1<<20 以內
***********************************/
#include <iostream>
using namespace std;
#define maxn 1<<20
int n,k;
int c[maxn];
int lowbit(int x){
return x&-x;
}
void insert(int x,int t){
while(x<maxn){
          c[x]+=t;
          x+=lowbit(x);    
       }
}
int find(int k){
int cnt=0,ans=0;
for(int i=20;i>=0;i--){
        ans+=(1<<i);
if(ans>=maxn || cnt+c[ans]>=k)ans-=(1<<i);
else cnt+=c[ans];
    }
return ans+1;
}
void input(){
       memset(c,0,sizeof(c));
int t;
       scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){    
            scanf("%d",&t);
            insert(t,1);
       }
       printf("%d\n",find(k));
}
int main(){
int cases;
    scanf("%d",&cases);
while(cases--){
        input();
    }
return 0;
}

posted on 2010-10-04 14:51 Sosi 閱讀(901) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


統計系統
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品一区二区三区福利| 一区二区精品| 蜜桃av一区| 免费视频一区| 欧美国产一区二区三区激情无套| 欧美丰满高潮xxxx喷水动漫| 欧美国产三区| 欧美日韩免费一区| 国产精品女人久久久久久| 国产欧美精品久久| 亚洲国产成人不卡| 中文亚洲字幕| 欧美国产91| 伊人成年综合电影网| 国产精品99一区二区| 久久综合电影| 久久成人资源| 欧美大胆成人| 欧美一区二区三区视频| 亚洲日本免费电影| 欧美成人综合在线| 另类图片国产| 亚洲精品视频免费在线观看| 亚洲日本精品国产第一区| 欧美国产综合一区二区| 亚洲无限av看| 母乳一区在线观看| 国产精品夜夜夜一区二区三区尤| 好看的日韩av电影| 亚洲视频日本| 欧美高清视频www夜色资源网| 亚洲深夜福利网站| 蜜臀av一级做a爰片久久 | 亚洲国产合集| 亚洲欧美一级二级三级| 欧美激情一二区| 狠狠综合久久av一区二区小说| 亚洲视频在线一区| 亚洲黄色免费| 久久九九99| 国产伦理精品不卡| 中文精品视频一区二区在线观看| 美女精品在线观看| 午夜在线精品偷拍| 国产精品99一区| 一区二区三区视频在线观看| 欧美激情第8页| 久久久久久久久久久久久女国产乱| 国产精品美女久久久久久2018| 日韩视频免费| 亚洲国产一区二区三区高清| 蜜臀久久99精品久久久久久9 | 99国内精品久久| 亚洲永久免费观看| 久久久久综合一区二区三区| 一区二区三区四区五区精品视频| 欧美电影免费观看高清完整版| 国产中文一区二区三区| 免费精品视频| 禁久久精品乱码| 久久精品国产69国产精品亚洲| 亚洲视频一区| 欧美日韩一卡二卡| 亚洲影院一区| 亚洲欧美在线高清| 黑人一区二区三区四区五区| 久久精品日韩| 麻豆成人精品| 亚洲一区免费看| 久久精品免视看| 久久精品中文字幕一区| 久久免费一区| 亚洲视屏一区| 久久尤物视频| 欧美日本在线看| 欧美激情一区三区| 国产精品日韩欧美一区二区| 在线性视频日韩欧美| 亚洲自拍三区| 久久免费视频在线| 亚洲视频第一页| 玖玖玖免费嫩草在线影院一区| 国产一区免费视频| 免费亚洲婷婷| 欧美日精品一区视频| 欧美亚洲日本一区| 久久激情网站| 99re热精品| 9国产精品视频| 久久在线视频在线| aa级大片欧美三级| 午夜精品久久| 91久久久久久| 在线性视频日韩欧美| 国产又爽又黄的激情精品视频| 免费日韩成人| 国产精品久久久久久久电影| 久久成人人人人精品欧| 欧美黄色免费| 久久久久国产精品人| 欧美激情一二三区| 久久裸体视频| 欧美性大战久久久久久久| 久久久久国色av免费看影院| 亚洲福利一区| 国产精品久久久久高潮| 麻豆国产精品一区二区三区| 欧美日韩亚洲一区三区| 蜜桃视频一区| 国产精品一级久久久| 亚洲激情第一页| 国产一区二区中文字幕免费看| 亚洲国产一区二区在线| 黄色成人在线| 午夜激情亚洲| 亚洲一区二区免费在线| 久久综合九色欧美综合狠狠| 欧美亚洲一区二区在线观看| 欧美理论在线播放| 欧美成人精品1314www| 国产精品一区亚洲| aⅴ色国产欧美| 亚洲毛片一区| 葵司免费一区二区三区四区五区| 欧美在线高清视频| 国产精品成人一区二区三区夜夜夜 | 亚洲人成在线播放| 伊人久久大香线蕉av超碰演员| 亚洲专区国产精品| 亚洲一区二区少妇| 欧美日韩免费看| 日韩午夜在线视频| 一区二区三区高清在线观看| 欧美激情视频一区二区三区免费 | 亚洲福利久久| 亚洲高清成人| 美女精品国产| 欧美激情第一页xxx| 1769国内精品视频在线播放| 久久九九国产精品| 免费亚洲网站| 亚洲精品日韩久久| 欧美成人精品在线视频| 免费日本视频一区| 亚洲人成网站在线播| 欧美精品在线视频| 一区二区三区鲁丝不卡| 亚洲欧美bt| 国产日韩欧美精品一区| 欧美在线看片| 女仆av观看一区| 日韩网站免费观看| 国产精品xnxxcom| 性色av一区二区三区在线观看| 久久成人精品一区二区三区| 精品1区2区3区4区| 欧美大尺度在线观看| 日韩一区二区高清| 欧美在线高清视频| 一区二区三区黄色| 亚洲免费视频在线观看| 欧美在线视频a| 亚洲成人在线网站| 欧美伦理一区二区| 亚洲欧美日韩国产成人| 久久婷婷色综合| 日韩视频免费| 国产日韩欧美一二三区| 麻豆成人精品| 亚洲欧美清纯在线制服| 嫩草国产精品入口| 亚洲婷婷综合色高清在线| 国产一区日韩二区欧美三区| 欧美精品手机在线| 欧美自拍丝袜亚洲| 日韩亚洲在线观看| 久久婷婷丁香| 亚洲一区二区在线视频| 怡红院精品视频在线观看极品| 欧美日韩视频在线一区二区| 久久成人资源| 亚洲一区自拍| 亚洲日韩欧美视频| 久久免费视频网站| 亚洲欧美日韩国产综合在线| 亚洲国产欧美一区二区三区同亚洲| 国产精品国产三级国产专播品爱网| 久久亚洲免费| 亚洲欧美在线磁力| 亚洲深夜av| 亚洲美女免费精品视频在线观看| 久久免费黄色| 久久国产精品久久久久久电车 | 亚洲国产高清自拍| 国产亚洲精品久| 国产精品草莓在线免费观看| 欧美国产一区二区| 免费在线国产精品| 老色鬼精品视频在线观看播放| 亚洲欧美日韩国产一区二区三区|