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

O(1) 的小樂

Job Hunting

公告

記錄我的生活和工作。。。
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

  • 隨筆 - 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>
            国产日本欧美一区二区| 99热这里只有成人精品国产| 校园春色国产精品| 一区二区三区色| 妖精成人www高清在线观看| 亚洲精品视频免费观看| 亚洲美女毛片| 亚洲图片在线观看| 午夜精品久久久久久久白皮肤| 亚洲午夜免费视频| 欧美一区二区在线观看| 久久久精品五月天| 欧美理论电影在线播放| 国产精品日韩久久久| 国产在线播放一区二区三区| 伊人久久婷婷色综合98网| 亚洲欧洲在线观看| 亚洲私人影吧| 久久亚洲一区| 91久久夜色精品国产网站| 欧美激情一区二区| 这里只有视频精品| 久久野战av| 欧美体内she精视频在线观看| 国产日韩欧美成人| 日韩视频永久免费观看| 欧美一区二区三区另类| 欧美国产日韩一区二区三区| 亚洲午夜久久久久久久久电影网| 久久视频在线看| 国产精品一区视频| 99热精品在线| 免费观看成人鲁鲁鲁鲁鲁视频 | 一区二区三区欧美激情| 国产精品夜色7777狼人 | 亚洲最新色图| 久久精品99无色码中文字幕| 亚洲国产精品成人一区二区| 欧美影院在线播放| 国产精品久久久对白| 亚洲人成网站色ww在线| 久久九九国产| 亚洲欧美激情视频| 国产精品国产成人国产三级| 亚洲日韩欧美一区二区在线| 久久亚洲精品一区| 欧美综合第一页| 国产欧美一区二区精品仙草咪| 一区二区三区国产精华| 亚洲黄色毛片| 欧美成人激情视频免费观看| 在线看一区二区| 久久综合色88| 久久精品导航| 国内精品久久久久久久影视麻豆| 亚洲欧美国产三级| 亚洲天堂激情| 国产精品亚洲视频| 欧美一区二区精美| 性欧美1819性猛交| 国产一区二区三区奇米久涩| 久久精品日韩一区二区三区| 欧美怡红院视频| 激情六月婷婷综合| 模特精品在线| 欧美二区在线观看| 一区二区三区日韩在线观看 | 日韩网站免费观看| 欧美日韩亚洲视频| 亚洲欧美韩国| 性欧美1819sex性高清| 国产主播在线一区| 免费亚洲电影在线观看| 免费久久99精品国产| 久久综合影视| 久久日韩粉嫩一区二区三区| 久久国产精品亚洲77777| 黑人一区二区三区四区五区| 免费在线观看成人av| 欧美激情亚洲国产| 午夜国产精品视频| 久久久久久久综合| 亚洲电影免费观看高清完整版在线观看| 美玉足脚交一区二区三区图片| 蜜桃久久av| 亚洲欧美成人一区二区在线电影 | 亚洲桃花岛网站| 久久综合网hezyo| 久久久久久综合网天天| 在线观看av不卡| 亚洲国产老妈| 国产精品青草久久久久福利99| 久久国产视频网| 欧美黄色片免费观看| 性色一区二区| 欧美成人激情视频免费观看| 性做久久久久久免费观看欧美| 久久久福利视频| 亚洲成人直播| 亚洲欧美日韩一区二区三区在线观看| 精品999日本| 亚洲午夜高清视频| 亚洲精品国产精品乱码不99 | 激情欧美一区二区三区在线观看| 欧美激情亚洲自拍| 国产日韩在线视频| 亚洲精品一区二区三区樱花 | 免费成人毛片| 欧美一区二区三区日韩| 欧美精品v国产精品v日韩精品| 久久精品国产亚洲一区二区| 亚洲女优在线| 99精品视频免费观看| 欧美一区二区视频免费观看| 宅男精品视频| 欧美激情第9页| 免费亚洲电影在线| 好吊成人免视频| 亚洲一区二区免费视频| 亚洲精品视频二区| 老色鬼久久亚洲一区二区| 久久精品国产69国产精品亚洲| 欧美午夜激情视频| 亚洲精品国产精品国自产观看浪潮| 国产最新精品精品你懂的| 亚洲免费av观看| 99精品久久免费看蜜臀剧情介绍| 久久综合亚州| 久久最新视频| 激情国产一区| 美国成人毛片| 欧美国产在线观看| 亚洲国产日韩欧美在线99| 久久久久一区二区| 久久久午夜精品| 国产欧美精品一区| 亚洲影院污污.| 久久高清免费观看| 国产一区二区三区在线播放免费观看 | 麻豆精品在线视频| 美国成人毛片| 亚洲国产欧洲综合997久久| 裸体一区二区三区| 在线看欧美日韩| 欧美v日韩v国产v| 亚洲国产精品小视频| 久久久久国产免费免费| 久久只精品国产| 亚洲激情国产精品| 欧美激情一区二区三区不卡| 亚洲激情一区| 亚洲伊人一本大道中文字幕| 国产精品乱人伦中文| 亚洲欧美日韩精品久久久| 亚洲视频在线观看视频| 免费成人av在线看| 日韩一区二区精品葵司在线| 午夜精品三级视频福利| 精品动漫一区| 欧美精品在欧美一区二区少妇| 一级成人国产| 久久久亚洲午夜电影| 亚洲精品免费电影| 国产精品久久一区二区三区| 久久久久免费视频| 99re热精品| 久久裸体视频| 日韩午夜激情| 国产日本亚洲高清| 欧美aa国产视频| 亚洲自拍都市欧美小说| 欧美成人精品| 午夜久久久久久久久久一区二区| 极品尤物久久久av免费看| 欧美精品尤物在线| 久久福利资源站| av不卡免费看| 欧美激情一区二区久久久| 欧美一区二区三区免费观看视频 | 欧美乱妇高清无乱码| 欧美亚洲三区| 亚洲精品乱码久久久久久按摩观| 亚洲伊人一本大道中文字幕| 亚洲福利国产精品| 国产精品欧美日韩| 免费看av成人| 性欧美超级视频| 一本久道久久综合中文字幕| 欧美a级理论片| 久久精品国产精品亚洲综合| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美午夜精品久久久久久孕妇| 亚洲国产一区二区三区在线播| 午夜亚洲福利| 国产综合av| 国产精品久久久99| 欧美精品久久99久久在免费线| 欧美怡红院视频| 亚洲欧美日韩爽爽影院| 亚洲视频在线观看网站|