• <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>

            jake1036

            編程之美-2.5尋求最大的K個(gè)數(shù)

               尋求最大的k個(gè)數(shù)

             方法一: 使用partition函數(shù),將數(shù)組分為兩組。
                        (1)分為兩個(gè)組,sa和sb。
                        (2)若sa組的個(gè)數(shù)大于K,則繼續(xù)在sa分組中找取最大的K個(gè)數(shù)字 。
                        (3)若sa組中的數(shù)字小于K ,其個(gè)數(shù)為T(mén),則繼續(xù)在sb中找取 K-T個(gè)數(shù)字 。
               具體代碼實(shí)現(xiàn):
                    

            #include <iostream>
              
            using namespace std ;
              
            const int N = 8 ; 
              
            const int K = 4 ;
              
            int partition(int  a[] ,int low , int high) 
              
            {
                  
            int i = low - 1 ;
                  
            int j = low;
                  
                  
            while(j < high)
                  
            {
                     
            if(a[j] >=  a[high])
                     
            {
                       swap( a[i
            +1] , a[j]) ;        
                       i
            ++   ;     
                     }

                     j
            ++ ;      
                  }

                  
            //最后處理a[high]
                  swap(a[i+1] , a[high]) ;  
                  
            return i + 1;     
              }

              
              
              
            int findk(int  a[] , int low , int high , int k)
              
            {
                  
            if(low < high)
                  
            {
                    
            int q = partition(a , low , high) ;
                    
                    
            int len = q - low + 1 ; //表示第幾個(gè)位置 
                    if(len == k)
                     
            return q ; //返回第k個(gè)位置
                    else if(len < k) 
                     
            return findk(a , q + 1 , high , k - len) ;   
                   
            else
                    
            return findk(a , low , q - 1, k ) ;
                  }

              }

              
              
            int main()
              
            {
                
            int a[N] = {5 ,2 ,66 ,2311 ,1 ,4 ,55} ;
                findk(a , 
            0 , N - 1 , K) ;  
                
                
            for(int i = 0 ; i < K ; i++)
                  cout
            <<a[i]<<endl ;
                
                system(
            "pause") ;  
                
            return 0 ;    
              }
             

             方法二 :
               此種方法為常用方法,建立一個(gè)大小為K的堆。每次遍歷數(shù)組時(shí),需要判斷是否需要加入堆中。
               堆中存儲(chǔ)著的是最大的k個(gè)數(shù)字,但是若是需要插入堆中,則需要對(duì)堆進(jìn)行調(diào)整時(shí)間為o(log k)。
               全部的時(shí)間復(fù)雜度為o(n * log k)。
              
              這種方法當(dāng)數(shù)據(jù)量比較大的時(shí)候,比較方便。因?yàn)閷?duì)所有的數(shù)據(jù)只會(huì)遍歷一次,第一種方法則會(huì)多次遍歷
              數(shù)組。 如果所查找的k的數(shù)量比較大。可以考慮先求出k` ,然后再求出看k`+1 到 2 * k`之間的數(shù)字,然后
              一次求取。
             
             方法三:
                 利用二分的方法求取TOP k問(wèn)題。
                 首先查找 max 和 min,然后計(jì)算出 mid = (max + min) / 2
                 該算法的實(shí)質(zhì)是尋找最大的K個(gè)數(shù)中最小的一個(gè)。
              
                代碼如下:
                

            #include <iostream>
             
            using namespace std ; 
             
            const int N = 8 ;
             
            const int K = 4 ;
             
             
            /*
             利用二分的方法求取TOP k問(wèn)題。
             首先查找 max 和 min,然后計(jì)算出 mid = (max + min) / 2
             該算法的實(shí)質(zhì)是尋找最大的K個(gè)數(shù)中最小的一個(gè)。 
             
             
             
            */

             
             
            int find(int * a , int x) //查詢(xún)出大于或者等于x的元素個(gè)數(shù) 
             {
                 
            int sum = 0 ;
                 
                 
            for(int i = 0 ; i < N ; i++ )
                 

                    
            if(a[i] >= x)
                      sum
            ++ ;                
                 }

                  
            return sum ;
             }

             
             
             
             
             
            int getK(int * a , int max , int min) //最終max min之間只會(huì)存在一個(gè)或者多個(gè)相同的數(shù)字 
             {
                 
            while(max - min > 1)             //max - min的值應(yīng)該保證比兩個(gè)最小的元素之差要小 
                  {
                    
            int mid = (max + min) / 2 ;
                    
            int num = find(a , mid) ;    //返回比mid大的數(shù)字個(gè)數(shù) 
                    if(num >= K)                 //最大的k個(gè)數(shù)目都要比min值大 
                       min = mid ;               
                    
            else
                       max 
            = mid  ;
                  }

                  cout
            <<"end"<<endl;
                  
            return min ;
             }

             
             
            int main()
             
            {
               
            int a[N] = {542 ,5 ,11 ,554 ,65 ,33 ,2} ;  
               
            int x = getK(a , 554 , 2) ; 
               cout
            <<x<<endl ; 
               getchar() ; 
               
            return 0 ;    
             }
















            posted on 2011-07-07 20:43 kahn 閱讀(1365) 評(píng)論(1)  編輯 收藏 引用

            Feedback

            # re: 編程之美-2.5尋求最大的K個(gè)數(shù)[未登錄](méi) 2014-09-24 22:58 xixi

            你確定以上代碼可以運(yùn)行?
            呵呵  回復(fù)  更多評(píng)論   



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


            精品少妇人妻av无码久久| 久久精品国产99久久久| 欧美一区二区久久精品| 亚洲成色WWW久久网站| 久久青青草原精品影院| 伊人久久大香线蕉成人| 2022年国产精品久久久久| 久久久久国产精品麻豆AR影院| 综合久久国产九一剧情麻豆| 情人伊人久久综合亚洲| 欧美牲交A欧牲交aⅴ久久 | 久久国产一片免费观看| 国产成人精品久久| 久久露脸国产精品| 久久福利青草精品资源站| 97久久婷婷五月综合色d啪蜜芽| 99久久人人爽亚洲精品美女 | 青草影院天堂男人久久| 成人综合久久精品色婷婷| 精品欧美一区二区三区久久久| 久久久久亚洲AV无码永不| 久久国产AVJUST麻豆| 久久狠狠一本精品综合网| 日本精品久久久中文字幕| 99久久人妻无码精品系列| 欧美一区二区三区久久综| 中文字幕人妻色偷偷久久| 波多野结衣久久一区二区| 久久夜色撩人精品国产小说| 精品久久久久久无码人妻热| 日本道色综合久久影院| 国产精品一区二区久久精品无码 | 99久久国产宗和精品1上映| 亚洲国产天堂久久综合| 伊人色综合久久天天人守人婷 | 久久精品国产亚洲AV大全| 日韩精品久久无码中文字幕| 久久久久久久人妻无码中文字幕爆| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 久久久久国产一区二区| 亚洲伊人久久综合影院|