• 算法 数据流的中位数-(大顶堆小顶堆+冒泡排序)


    牛客网: BM48

    题目: 得到数据流的中位数

    思路:

    (1) 冒泡排序: 每次插入元素时,进行冒泡排序,将当前值与前一值比较,当前值较小时与前一元素交换,直至不小于前一元素时结束。

    (2) 大小顶堆: 设置两个堆min为大顶堆(最大值在堆顶,元素取反即可),max为小顶堆(最小值为堆顶),所有元素先入堆min, 再从min中取最大元素入堆max,如果min数量小于max,从max中取堆顶入堆min; min元素数量多于max时,取出min堆顶元素为中位数,否则两个堆顶元素求均值。

    代码:

    (1) 冒泡排序思想

    1. // go
    2. package main
    3. var nums = []int{}
    4. func Insert(num int){
    5. nums = append(nums, num)
    6. right := len(nums) - 1
    7. for right > 0 {
    8. if nums[right] < nums[right-1] {
    9. nums[right], nums[right-1] = nums[right-1], nums[right]
    10. right--
    11. } else {
    12. break
    13. }
    14. }
    15. }
    16. func GetMedian() float64{
    17. if len(nums) % 2 == 1 {
    18. return float64(nums[len(nums)/2])
    19. } else {
    20. return float64(nums[len(nums)/2] + nums[len(nums)/2-1])/2
    21. }
    22. }

    (2) 堆排序思想

    1. // py
    2. # -*- coding:utf-8 -*-
    3. import heapq
    4. class Solution:
    5. def __init__(self) -> None:
    6. # 小顶堆
    7. self.max = []
    8. # 大顶堆
    9. self.min = []
    10. def Insert(self, num):
    11. # write code here
    12. // 取反每次栈顶为实际最大值
    13. heapq.heappush(self.min, -1 * num)
    14. // 实际最大值入堆
    15. heapq.heappush(self.max, -1 * self.min[0])
    16. // 出堆
    17. heapq.heappop(self.min)
    18. if len(self.min) < len(self.max):
    19. heapq.heappush(self.min, -1 * self.max[0])
    20. heapq.heappop(self.max)
    21. def GetMedian(self):
    22. # write code here
    23. if len(self.min) > len(self.max):
    24. return -1.0 * self.min[0]
    25. else:
    26. return (-1 * self.min[0] + self.max[0])*1.0/2

  • 相关阅读:
    Vue源码探秘(二)—— Vue 响应式原理模拟
    【数据结构】排序(2)快速排序
    python模型训练
    使用CompletableFuture多线程异步任务优化查询接口性能
    反转链表-就地逆置法
    monai如何读取.nii/.nii.gz数据
    【Linux】第十八站:进程等待
    安卓开发实例:方向传感器
    实现单行/多行文本溢出
    ubuntu下cups部分场景
  • 原文地址:https://blog.csdn.net/Neil_001/article/details/133212607