加權中位數

2022-09-06 05:30:11 字數 2203 閱讀 7218

問題描述為: 乙個無序的數列,每個數有其對應的權重,權重為非負整數,代表數列中的數字出現的次數。要求找出這一無序數列中的中位數。

1. 直接解法,先對該數列和權重排序。然後找出累計權重為中位數的數字。 時間複雜度為排序的 o(nlog(n)+n)

2

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()

2. 按照快速排序的思路,先找到乙個數字,然後 按照該數字將數列劃分成左右兩段,根據左右兩段的權重之和,遞迴呼叫左半側或者右半側數列。

中位數的中位數

參照王曉東的演算法設計 中位數的中位數,即將一串數分成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...