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

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 閱讀(907) 評論(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>
            一本综合久久| 性欧美xxxx视频在线观看| 亚洲老板91色精品久久| 一本到高清视频免费精品| 亚洲欧美另类在线| 美女福利精品视频| 日韩一区二区久久| 久久成人精品视频| 欧美日韩国产999| 国产自产女人91一区在线观看| 亚洲国产婷婷| 欧美一区在线直播| 亚洲毛片在线| 久久综合给合久久狠狠狠97色69| 国产精品国产一区二区| 亚洲国产导航| 久久riav二区三区| 99re热精品| 免费在线视频一区| 国产一本一道久久香蕉| 亚洲视屏一区| 亚洲激情社区| 久久躁狠狠躁夜夜爽| 国产日韩av高清| 亚洲自拍偷拍麻豆| 亚洲伦伦在线| 欧美日韩午夜剧场| 99精品国产福利在线观看免费 | 国产农村妇女毛片精品久久麻豆| 亚洲国产日韩在线| 一本色道精品久久一区二区三区 | 一区在线免费| 久久乐国产精品| 亚洲一区二区三区成人在线视频精品| 欧美黄污视频| 亚洲人成网站在线播| 免费日韩av电影| 欧美专区亚洲专区| 国产一区二区三区不卡在线观看 | 亚洲欧洲一区| 久久在线视频在线| 久久久久久久久久久久久9999| 国产亚洲一区二区在线观看| 欧美亚洲在线| 亚洲综合色在线| 国产网站欧美日韩免费精品在线观看| 午夜久久久久久久久久一区二区| 99精品国产高清一区二区| 欧美日韩精品免费观看| 99成人在线| 一区二区欧美激情| 国产欧美三级| 久久网站热最新地址| 久久视频一区| 一本高清dvd不卡在线观看| 日韩视频一区二区三区在线播放免费观看 | 欧美日韩国产精品| 亚洲综合精品四区| 午夜精品视频| 狠狠色狠狠色综合日日五| 欧美成人免费在线观看| 欧美成人情趣视频| 亚洲欧美精品一区| 久久精品视频在线看| 亚洲欧洲日夜超级视频| 在线亚洲+欧美+日本专区| 国产手机视频一区二区| 欧美成人午夜影院| 国产精品国产a级| 浪潮色综合久久天堂| 欧美激情性爽国产精品17p| 一区二区三区**美女毛片| 午夜精品久久久久久久久| 韩国精品久久久999| 亚洲欧洲精品天堂一级| 国产精品美女一区二区| 老司机一区二区三区| 欧美精品成人一区二区在线观看 | 久久精品国产视频| 欧美成人蜜桃| 欧美一级精品大片| 欧美a级大片| 欧美诱惑福利视频| 欧美精品 日韩| 久久久www成人免费无遮挡大片| 欧美成人按摩| 久久精品国产69国产精品亚洲| 美女图片一区二区| 先锋影音国产精品| 欧美激情一区在线观看| 久久色在线播放| 国产精品久久久久久久一区探花| 欧美大片一区| 国产精品亚洲综合| 亚洲人www| 伊人色综合久久天天| 亚洲专区免费| 一区二区三区色| 蜜桃av一区二区| 久久免费视频一区| 国产精品免费观看在线| 亚洲欧洲一区二区三区在线观看| 国产婷婷色一区二区三区在线| 亚洲精品综合| 一本色道**综合亚洲精品蜜桃冫| 久久久噜噜噜久久| 久久精品国产2020观看福利| 国产精品高潮呻吟久久av黑人| 亚洲日本电影| 日韩视频在线一区| 欧美精品色综合| 欧美激情视频一区二区三区在线播放 | 欧美激情亚洲| 在线观看亚洲| 久久一区二区精品| 男女激情视频一区| 在线精品高清中文字幕| 久久久亚洲人| 欧美成人高清| 亚洲国产精品久久久久| 久久综合狠狠综合久久综青草| 久久午夜精品| 亚洲国产精品成人精品| 麻豆久久精品| 亚洲国产老妈| 日韩视频永久免费| 欧美人与性动交α欧美精品济南到 | 国产精品一区二区欧美| 亚洲图片你懂的| 欧美在线关看| 国产一区二三区| 久久久av毛片精品| 欧美高清在线观看| 日韩午夜三级在线| 欧美色精品在线视频| 亚洲一区二区欧美| 久久蜜桃av一区精品变态类天堂| 国产一区二区激情| 另类尿喷潮videofree| 亚洲第一精品电影| 亚洲影院在线观看| 国产一区二区三区免费观看| 久久精品久久99精品久久| 欧美777四色影视在线| 99精品国产福利在线观看免费| 欧美视频四区| 久久成人一区二区| 亚洲国产你懂的| 先锋影音久久久| 亚洲第一久久影院| 欧美性片在线观看| 久久精品日韩一区二区三区| 欧美成人免费网站| 亚洲综合色视频| 影音先锋久久资源网| 欧美日韩国产va另类| 香蕉久久a毛片| 亚洲激情偷拍| 久久久久女教师免费一区| 99riav国产精品| 国产在线国偷精品产拍免费yy| 欧美劲爆第一页| 久久福利影视| 日韩一级精品视频在线观看| 久久精品视频在线免费观看| 亚洲精品国产精品国自产观看| 国产精品久久久久久久久久直播| 久久天天躁狠狠躁夜夜爽蜜月 | 亚洲欧美一区二区原创| 亚洲国产精品久久久久| 国产精品永久在线| 欧美日韩麻豆| 麻豆精品在线播放| 欧美一区激情| 亚洲综合欧美日韩| 亚洲日韩欧美视频| 欧美激情一区二区三区高清视频 | 一区二区欧美日韩视频| 亚洲第一天堂无码专区| 国产一区二区三区黄视频| 欧美午夜精品理论片a级大开眼界| 久久综合给合| 久久久久久久综合| 欧美一区二区三区在线观看| 一区二区91| 夜久久久久久| 日韩一级免费观看| 亚洲精品女人| 麻豆av一区二区三区| 小黄鸭精品密入口导航| 在线视频日韩精品| 99在线精品免费视频九九视| 亚洲国产精品久久久久秋霞蜜臀| 国产日韩欧美综合一区| 国产精品综合视频| 国产欧美日韩亚洲| 国产日韩一区二区三区| 国产午夜精品在线| 国内一区二区在线视频观看 | 欧美精品一级|