資料流中的中位數

2022-05-04 12:00:10 字數 1425 閱讀 5465

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

解法1:陣列不排序,基於partition函式找中位數。插入數字和找出中位數的時間複雜度分別為o(1)和o(n)

1

class

solution

13 arr[begin]=tmp;

14return

begin;15}

16void insert(int

num)

1720

double

getmedian()

2135

return arr[length/2

];36 }else

46 begin=0

;47 end=length/2-1;48

while(true

)//確定length/2-1位置上的數

4954

return (arr[length/2-1]+arr[length/2])*1.0/2;55

}56}57

private

:58 vectorarr;

59 };

解法2:陣列插入元素後保持排序,故插入數字和找出中位數的時間複雜度分別為o(n)和o(1)

1

class

solution

12 arr[idx+1]=num;//插入13}

14double

getmedian()

15else23}

24private

:25 vectorarr;

26 };

解法3:用乙個大頂堆實現陣列左邊的資料容器,用乙個小頂堆實現陣列右邊的資料容器。插入數字和找出中位數的時間複雜度分別為o(logn)和o(1)

1

class

solution

15max.push_back(num);

16 push_heap(max.begin(), max.end(), std::less());

17 }else

26min.push_back(num);

27 push_heap(min.begin(), min.end(), std::greater());28}

29}30double

getmedian()

31else39}

40private

:41 vectormax;

42 vectormin;

43 };

資料流中的中位數

資料流中的中位數 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。解題思路 維護乙個大堆和乙個小堆,大堆表示序列前一半數,小堆表示序列後一半數,保持兩個堆的元素個...

資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。class solution double getmedian else private vectordata c...

資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。簡單題 找中位數 coding utf 8 class solution x def insert self,nu...