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

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 164633
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            尋找k大

             自己寫的尋找數(shù)組中第k大元素的函數(shù),采用二分查找法,平均時(shí)間復(fù)雜度O(logN),有更好的方法歡迎指正

             感謝 雙杯獻(xiàn)酒 同學(xué)指正,我重新思考了一下次算法的時(shí)間復(fù)雜度
            理想情況下如果每次都正好分到中間的話,每次比較的次數(shù)就是公比為0.5的等比數(shù)列,也就得到
            T(N)=a1(1-q^n)/(1-q) =N(1-0.5^(logN))/0.5=2N-0,5^(logN-1)
            當(dāng)N→∞時(shí),得平均時(shí)間復(fù)雜度為O(N)
            但是本算法的最壞情況確實(shí)O(N^2)

            /************************************************************************/
            /* find the k bigger number in the array, using Bisection method
            /* Contact:lyi.tech@gmail.com
            /* 2011-3-10
            /***********************************************************************
            */

            int findKBiggest(int *array,int begin,int end,int k);
            int nonrecursive_FindKBiggest(int *array,int length,int k);
            void switch2(int *a,int *b);
            //************************************
            // Method:    findKBiggest
            // FullName:  findKBiggest
            // Access:    public 
            // Returns:   int
            // Qualifier:
            // Parameter: int * array
            // Parameter: int length
            // Parameter: int k
            // Parameter: int * k_value 
            //                the K biggest number,the biggest number is labeled by 1
            //************************************
            int findKBiggest(int *array,int length,int k,int *k_value)
            {
                
            if (k>length||k<1||length<1)
                    
            return -1;
                
            else 
                
            {
                    
            //*k_value=findKBiggest(array,0,length-1,k);
                    *k_value=nonrecursive_FindKBiggest(array,length,k);
                    
            return 0;
                }

            }


            //************************************
            // Method:    recursive method
            // FullName:  findKBiggest
            // Access:    public 
            // Returns:   the K biggest number,the biggest number is labeled by 1
            // Qualifier:
            // Parameter: int * array
            // Parameter: int begin
            // Parameter: int end
            // Parameter: int k base on 1
            //************************************
            int findKBiggest(int *array,int begin,int end,int k)
            {
                
            int tmpbegin=begin;
                
            int tmpend=end;
                
            int *tmp=array+begin++;
                
            int length=end-begin+1;
                
            while (1)
                
            {
                    
            while ((*(array+begin) >= *tmp)&&(begin<tmpend))
                        begin
            ++;
                    
            while ((*(array+end) < *tmp)&&(end>tmpbegin))
                        end
            --;
                    
            if (begin<end)
                    
            {
                        switch2(array
            +begin,array+end);
                    }

                    
            else
                    
            {
                        switch2(tmp,array
            +end);
                        
            break;
                    }

                }

                
            if (end+1==k)
                    
            return *tmp;
                
            else if(end+1<k)
                    
            return findKBiggest(array,end+1,tmpend,k);
                
            else
                    
            return findKBiggest(array,tmpbegin,end-1,k);

            }


            void switch2(int *a,int *b)
            {
                
            if (a!=b)
                
            {
                    
            *a=*a+*b;
                    
            *b=*a-*b;
                    
            *a=*a-*b;
                }

            }


            //************************************
            // Method:    nonrecursive method
            // FullName:  nonrecursive_FindKBiggest
            // Access:    public 
            // Returns:   the K biggest number,the biggest number is labeled by 1
            // Qualifier:
            // Parameter: int * array
            // Parameter: int length
            // Parameter: int k
            //************************************
            int nonrecursive_FindKBiggest(int *array,int length,int k)
            {
                
            int begin=0,end=length-1;
                
            int tmpbegin,tmpend;
                
            int posnow=0;
                
            while (1)
                
            {    
                    tmpbegin
            =begin+1;
                    tmpend
            =end;
                    
            while (1)
                    
            {
                        
            while (*(array+tmpbegin) >= *(array+begin) && tmpbegin<end)
                            tmpbegin
            ++;
                        
            while (*(array+tmpend) < *(array+begin) && begin < tmpend)
                            tmpend
            --;
                        
            if (tmpbegin<tmpend)
                        
            {
                            switch2(array
            +tmpbegin,array+tmpend);
                        }

                        
            else
                        
            {
                            switch2(array
            +begin,array+tmpend);
                            
            break;
                        }

                    }

                    
            if (k==tmpend+1)
                        
            break;
                    
            else if(k>tmpend+1)
                        begin
            =tmpend+1;
                    
            else
                        end
            =tmpend-1;
                }

                
            return *(array+tmpend);
            }

             

             

             

             

            posted on 2011-03-10 12:38 pear_li 閱讀(1958) 評(píng)論(10)  編輯 收藏 引用 所屬分類: Algorithm

            評(píng)論

            # re: 尋找k大 2011-03-10 14:03 gbb21

            Please be attention to your ugly Chiglish naming in the code.

            # re: 尋找k大[未登錄](méi) 2011-03-10 14:23 pear_li

            @gbb21
            see it or not,then shut fu_cking up

            # re: 尋找k大[未登錄](méi) 2011-03-10 14:43 R

            BFPRT.

            # re: 尋找k大 2011-03-10 17:51 hook

            樓上說(shuō)的沒(méi)錯(cuò),請(qǐng)參考:
            http://en.wikipedia.org/wiki/Selection_algorithm

            # re: 尋找k大[未登錄](méi) 2011-03-10 22:37 pear_li

            @hook
            貌似和我算法很相似

            # re: 尋找k大[未登錄](méi) 2011-03-11 09:14 vincent

            怎么得出的logN的復(fù)雜度。。

            # re: 尋找k大 2011-03-11 11:04 雙杯獻(xiàn)酒

            對(duì)于數(shù)據(jù)Data[N]
            如果已經(jīng)排序,則第k大的元素就是Data[k],何須查找?復(fù)雜度O(1)
            如果尚未排序,就不能使用二分查找.
            如果要先排序, 通用的基于比較排序最低復(fù)雜度也是O(N*logN)
            最經(jīng)典的BFPRT算法復(fù)雜度也是O(N), 直觀來(lái)說(shuō),要確定第k大的元素,每個(gè)數(shù)據(jù)總要過(guò)一遍吧. 那復(fù)雜度也至少是O(N), 要在O(logN)找到是不可能的.
            不明白作者怎么弄的.

            # re: 尋找k大 2011-03-11 21:46 pear_li

            @雙杯獻(xiàn)酒
            說(shuō)的不錯(cuò)

            # re: 尋找k大 2011-03-12 15:05 Devil Wang

            有O(logN)的算法 。如果你看過(guò)算法 導(dǎo)論 關(guān)于 快排那部分的算法的話。

            你要做的就是改造partition算法。

            # re: 尋找k大[未登錄](méi) 2011-03-13 18:28 pear_li

            @Devil Wang
            這個(gè)真沒(méi)有,如果有還請(qǐng)明示,那本書(shū)我看過(guò)。。。
            中文字幕久久精品 | 久久久噜噜噜久久| 欧美精品九九99久久在观看| 久久久久久精品免费免费自慰| 成人国内精品久久久久一区| 久久99亚洲综合精品首页| 一本色道久久88—综合亚洲精品| 99热成人精品热久久669| 久久中文字幕精品| 99久久精品免费看国产一区二区三区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 伊人热人久久中文字幕| 国产成人精品综合久久久久| 麻豆精品久久久一区二区| 一本一本久久a久久综合精品蜜桃| 天天综合久久久网| 久久99热只有频精品8| 久久国产免费直播| 欧美成a人片免费看久久| 色综合久久综精品| 国产精品久久久久jk制服| 久久无码AV一区二区三区| 久久露脸国产精品| 国产精品日韩深夜福利久久| 三上悠亚久久精品| 亚洲精品tv久久久久久久久| 国产香蕉久久精品综合网| 久久人人爽人人爽AV片| 久久久人妻精品无码一区| 久久精品国产欧美日韩| 久久激情亚洲精品无码?V| 久久精品国产福利国产琪琪| 成人精品一区二区久久| 999久久久国产精品| 91性高湖久久久久| 久久久久久久久久免免费精品 | 欧美麻豆久久久久久中文| 青青草国产97免久久费观看| 久久精品国产精品亚洲艾草网美妙| 久久久无码精品亚洲日韩蜜臀浪潮| 久久婷婷五月综合国产尤物app |