問題描述為: 乙個無序的數列,每個數有其對應的權重,權重為非負整數,代表數列中的數字出現的次數。要求找出這一無序數列中的中位數。
1. 直接解法,先對該數列和權重排序。然後找出累計權重為中位數的數字。 時間複雜度為排序的 o(nlog(n)+n)
22. 按照快速排序的思路,先找到乙個數字,然後 按照該數字將數列劃分成左右兩段,根據左右兩段的權重之和,遞迴呼叫左半側或者右半側數列。import
numpy as np34
defweighted_median(data, weights):
5"""
6args:
7data (list or numpy.array): data
8weights (list or numpy.array): weights
9"""
10 data, weights =np.array(data).squeeze(), np.array(weights).squeeze()
11 s_data, s_weights = map(np.array, zip(*sorted(zip(data, weights))))
12 midpoint = 0.5 *sum(s_weights)
13if any(weights >midpoint):
14 w_median = (data[weights ==np.max(weights)])[0]
15else
:16 cs_weights =np.cumsum(s_weights)
17 idx = np.where(cs_weights <= midpoint)[0][-1]
18if cs_weights[idx] ==midpoint:
19 w_median = np.mean(s_data[idx:idx+2])
20else
:21 w_median = s_data[idx+1]
22return
w_median
2324
deftest_weighted_median():
25print("
hello, world")
26 data =[
27 [7, 1, 2, 4, 10],
28 [7, 1, 2, 4, 10],
29 [7, 1, 2, 4, 10, 15],
30 [1, 2, 4, 7, 10, 15],
31 [0, 10, 20, 30],
32 [1, 2, 3, 4, 5],
33 [30, 40, 50, 60, 35],
34 [2, 0.6, 1.3, 0.3, 0.3, 1.7, 0.7, 1.7, 0.4],35]
36 weights =[
37 [1, 1/3, 1/3, 1/3, 1],
38 [1, 1, 1, 1, 1],
39 [1, 1/3, 1/3, 1/3, 1, 1],
40 [1/3, 1/3, 1/3, 1, 1, 1],
41 [30, 191, 9, 0],
42 [10, 1, 1, 1, 9],
43 [1, 3, 5, 4, 2],
44 [2, 2, 0, 1, 2, 2, 1, 6, 0],45]
46 answers = [7, 4, 8.5, 8.5, 10, 2.5, 50, 1.7]
47for datum, weight, answer in
zip(data, weights, answers):
48assert(weighted_median(datum, weight) ==answer)
4950
if__name__ == "
__main__":
51 test_weighted_median()
中位數的中位數
參照王曉東的演算法設計 中位數的中位數,即將一串數分成n段,求其排好序了的中間那個數,再把這些所有中位數再求一次中位數。for int i 0 i r p 4 5 i 找中位數的中位數,r p 4即上面所說的n 5 int x lineselect a,p,p r p 4 5,r p 4 10 線性...
BFPRT(中位數的中位數)演算法
又稱為 中位數的中位數演算法 該演算法由 blum floyd pratt rivest tarjan 在1973年提出,最壞時間複雜度為o n 最差的空間複雜度為o logn 演算法步驟 1 將 n 個元素劃分為 n 5 個組,每組 5 個元素,若有剩餘,捨去 2 使用排序方法找到 n 5 個組中...
hive 中位數 Hive的中位數
關於求解中位數,我們知道在python中直接有中位數處理函式 mean 比如在python中求解乙個中位數,很簡單。python計算中位數 import numpy as np nums 1.1,2.2,3.3,4.4,5.5,6.6 均值np.mean nums 中位數 np.median num...