**:
中位數即是排過序後的處於陣列最中間的元素。 不考慮陣列長度為偶數的情況。設集合元素個數為n。
簡單的想了下:
思路1)(這個方法不行,因為面試時真正要求是不排序)
把無序陣列排好序,取出中間的元素
時間複雜度 採用普通的比較排序法 o(n*logn)
如果採用非比較的計數排序等方法, 時間複雜度 o(n), 空間複雜度也是o(n).
思路2) (這是我的思路,建乙個n個結點的堆的時間複雜度是多少?)
2.1)將前(n+1)/2個元素調整為乙個小頂堆,
2.2)對後續的每乙個元素,和堆頂比較,如果小於等於堆頂,丟棄之,取下乙個元素。 如果大於堆頂,用該元素取代堆頂,調整堆,取下一元素。重複2.2步
2.3) 當遍歷完所有元素之後,堆頂即是中位數。
思路3)熟話說,想讓演算法跑的更快,用分治!
快速排序之所以得名"快排",絕非浪得虛名!因為快排就是一種分治排序法!
同樣,找中位數也可以用快排分治的思想。具體如下:
任意挑乙個元素,以改元素為支點,劃分集合為兩部分,如果左側集合長度恰為 (n-1)/2,那麼支點恰為中位數。如果左側長度<(n-1)/2, 那麼中位點在右側,反之,中位數在左側。 進入相應的一側繼續尋找中位點。(金子分析,想法是簡單,實現起來很頭大吧,因為第二次遍歷的時候,判斷的標準就不同了,左右不都是(n-1)/2,因為第一次已經偏了,不過思路還是可以說一下的)
這種方法很快,但是在最壞的情況下時間複雜度為o(n^2), 不過平均時間複雜度好像是o(n)。
引申一:
查詢n個元素中的第k個小的元素(來自程式設計珠璣)
程式設計珠璣給出了乙個時間複雜度o(n),的解決方案。該方案改編自快速排序。
經過快排的一次劃分,
1)如果左半部份的長度》k-1,那麼這個元素就肯定在左半部份了
2)如果左半部份的長度==k-1,那麼當前劃分元素就是結果了。
3)如果。。。。。。。
引申二:
查詢n個元素中的第k個小的元素,假設記憶體受限,僅能容下k/4個元素。
分趟查詢,
第一趟,用堆方法查詢最小的k/4個小的元素,同時記錄剩下的n-k/4個元素到外部檔案。
第二趟,用堆方法從第一趟篩選出的n-k/4個元素中查詢k/4個小的元素,同時記錄剩下的n-k/2個元素到外部檔案。
。。。第四趟,用堆方法從第一趟篩選出的n-k/3個元素中查詢k/4個小的元素,這是的第k/4小的元素即使所求。
分享到:
無序陣列求中位數
長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...
求無序陣列的中位數
中位數即是排過序後的處於陣列最中間的元素。不考慮陣列長度為偶數的情況。設集合元素個數為n。簡單的想了下 思路1 把無序陣列排好序,取出中間的元素 時間複雜度 採用普通的比較排序法 o n logn 如果採用非比較的計數排序等方法,時間複雜度 o n 空間複雜度也是o n 思路2 2.1 將前 n 1...
無序陣列的中位數
題目 求出乙個無需陣列的中位數。例 的中位數為5,的中位數為4和5。要求 不能使用排序。思路1 將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。那麼如何保證最小堆中的元素,都比大堆中的元素大 1 遍歷陣列,將第i個數插入堆...