9.3-8設x[1..n] 和 y[1..n]為兩個陣列,每個都包含n個已排好序的數。給出乙個求陣列x和y中所有2n個元素的中位數的o(lgn)時間的演算法
分析與解答:
若中位數字於x中,不妨設為x[k],即在x中有k個元素小於等於中位數,n-k個元素大於等於中位數。由於x[k]為合併後的2n個元素的中位數,則在y中有n-k個元素小於等於中位數,k個元素大於等於中位數,即
y[n-k] ≤ x[k] ≤ y[n-k+1]
看到時間複雜度為o(lgn),不禁使我們想到二分法,但是和這題有什麼關聯呢?
二分法每次搜尋都能減小一半的範圍,在搜尋中位數的過程也可以的,下面具體論述:
若x[k]不滿足上述等式,分兩種情況
(1) x[k] < y[n-k]
若中位數是k' < k,則x[k'] ≤ x[k]] < y[n-k] 。那麼在y中小於等於x[k']的元素數目小於n-k,則x[k']不可能為中位數
由此只需要搜尋k' > k的範圍
(2) x[k] > y[n-k+1]
若中位數是k' > k,則x[k'] > x[k] > y[n-k+1] 。那麼在y中小於等於x[k']的元素數目大於n-k+1,則x[k']不可能為中位數
由此只需要搜尋k' < k的範圍
根據上述特點,我們可以採用二分搜尋逐步縮小搜尋範圍。
整個演算法的過程如下:
演算法 排序陣列中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums...
無序陣列的中位數
題目 求出乙個無需陣列的中位數。例 的中位數為5,的中位數為4和5。要求 不能使用排序。思路1 將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。那麼如何保證最小堆中的元素,都比大堆中的元素大 1 遍歷陣列,將第i個數插入堆...
無序陣列求中位數
長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...