問題概述:共有n個k元組(x1,x2,x3…xk),乙個k元組最大,當且僅當沒有乙個k元組每個xi都比它大。求最大k元組。一般地,為了問題更加簡潔,每個xi都為小於等於n的正整數,k看為較小的常數。
樸素演算法無論k等於幾,均可在至多o(n^2)時間內解決。
當k=5時,o(nlognlognlogn)樹套樹套樹。
當k=6時,o(nlognlognlognlogn)樹套樹套樹套樹。
當k=7時,o(nlognlognlognlognlogn)樹套樹套樹套樹套樹。
在一般oi競賽中,對於k≤4,上述演算法應該說是最優的;
對於k≥5基本上沒有「套樹」的必要了,因為樸素演算法已經相當快了,且簡單的優化後速度更是無壓力,且沒人無聊會去寫樹(套樹)^二方及以上,但理論上,o(n^2)和o(n(logn)^(k-2))還是有本質區別的。
尋找最大的K個數
方法一 改進的快速排序 分割槽時,根據數p將陣列分為兩部分,設大於p的數個數為a,小於p的數的個數為b。如果,a k,則從這a個數取最大的k個數,若a時間複雜度是o nlogk include includevoid swap float a,float b int fun float n,int ...
尋找最大的K個數
程式設計之美有一道考察多種排序的題目,題目如下 有乙個長度為n的無序陣列,假定其中的每乙個元素都各不相等,求其中最大的k個數。作者對於此題目結合各種排序演算法給出了五種解法思路。解法一 使用快速排序或堆排序對它們元素進行排序,整個排序的時間複雜度為o n lo g2n 然後取出前k個,時間複雜度為o...
尋找最大的K個數
前提條件 有n個無序的數,假定它們各不相等,如何選出其中最大的若干個數 適用於元素數量不多,記憶體中可儲存整個陣列序列。通過快速排序或堆排序對陣列排序,時間複雜度為o n log2n 然後取出前k個數,時間複雜度為o k 總時間複雜度為o n log2n o k 進一步的,可以知道,我們只需要前 k...